diff --git a/.codeql-prebuild-cpp.sh b/.codeql-prebuild-cpp-Linux.sh similarity index 89% rename from .codeql-prebuild-cpp.sh rename to .codeql-prebuild-cpp-Linux.sh index c3e09d84e1..d00c671ec2 100644 --- a/.codeql-prebuild-cpp.sh +++ b/.codeql-prebuild-cpp-Linux.sh @@ -1,4 +1,5 @@ # install dependencies for C++ analysis +set -e sudo apt-get update -y sudo apt-get install -y \ @@ -54,3 +55,12 @@ sudo wget \ sudo chmod a+x /root/cuda.run sudo /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm sudo rm /root/cuda.run + +# build +mkdir -p build +cd build || exit 1 +cmake -G "Unix Makefiles" .. +make -j"$(nproc)" + +# skip autobuild +echo "skip_autobuild=true" >> "$GITHUB_OUTPUT" diff --git a/.codeql-prebuild-cpp-Windows.sh b/.codeql-prebuild-cpp-Windows.sh new file mode 100644 index 0000000000..034f07a891 --- /dev/null +++ b/.codeql-prebuild-cpp-Windows.sh @@ -0,0 +1,34 @@ +# install dependencies for C++ analysis +set -e + +# update pacman +pacman --noconfirm -Suy + +# install dependencies +pacman --noconfirm -S \ + base-devel \ + diffutils \ + gcc \ + git \ + make \ + mingw-w64-x86_64-binutils \ + mingw-w64-x86_64-boost \ + mingw-w64-x86_64-cmake \ + mingw-w64-x86_64-curl \ + mingw-w64-x86_64-miniupnpc \ + mingw-w64-x86_64-nlohmann-json \ + mingw-w64-x86_64-nodejs \ + mingw-w64-x86_64-onevpl \ + mingw-w64-x86_64-openssl \ + mingw-w64-x86_64-opus \ + mingw-w64-x86_64-rust \ + mingw-w64-x86_64-toolchain + +# build +mkdir -p build +cd build || exit 1 +cmake -G "MinGW Makefiles" .. +mingw32-make -j"$(nproc)" + +# skip autobuild +echo "skip_autobuild=true" >> "$GITHUB_OUTPUT" diff --git a/.codeql-prebuild-cpp-macOS.sh b/.codeql-prebuild-cpp-macOS.sh new file mode 100644 index 0000000000..4e74c8599e --- /dev/null +++ b/.codeql-prebuild-cpp-macOS.sh @@ -0,0 +1,20 @@ +# install dependencies for C++ analysis +set -e + +# install dependencies +brew install \ + boost \ + cmake \ + miniupnpc \ + node \ + opus \ + pkg-config + +# build +mkdir -p build +cd build || exit 1 +cmake -G "Unix Makefiles" .. +make -j"$(sysctl -n hw.logicalcpu)" + +# skip autobuild +echo "skip_autobuild=true" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e4a6419418..e847ea362e 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -211,6 +211,7 @@ jobs: then echo "This is a PUSH event" branch=${{ github.ref_name }} + build_version=${{ needs.check_changelog.outputs.next_version }} commit=${{ github.sha }} clone_url=${{ github.event.repository.clone_url }} else @@ -227,6 +228,7 @@ jobs: cd build cmake -DGITHUB_CLONE_URL=${clone_url} \ + -DBUILD_VERSION=${build_version} \ -DGITHUB_BRANCH=${branch} \ -DGITHUB_COMMIT=${commit} \ -DSUNSHINE_CONFIGURE_FLATPAK_MAN=ON \ @@ -377,7 +379,7 @@ jobs: - name: Build Linux env: BRANCH: ${{ github.head_ref || github.ref_name }} - BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version_bare }} + BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version }} COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} timeout-minutes: 5 run: | @@ -500,18 +502,24 @@ jobs: run: | ${{ steps.python.outputs.python-path }} -m pip install gcovr ${{ steps.python.outputs.python-path }} -m gcovr -r .. \ - --exclude ../tests/ \ - --exclude ../third-party/ \ + --exclude '.*tests/.*' \ + --exclude '.*tests/.*' \ --xml-pretty \ -o coverage.xml - name: Upload coverage # any except canceled or skipped - if: always() && (steps.test_report.outcome == 'success') - uses: codecov/codecov-action@v3 + if: >- + always() && + (steps.test_report.outcome == 'success') && + startsWith(github.repository, 'LizardByte/') + uses: codecov/codecov-action@v4 with: + disable_search: true + fail_ci_if_error: true files: ./build/coverage.xml flags: ${{ runner.os }} + token: ${{ secrets.CODECOV_TOKEN }} - name: Create/Update GitHub Release if: ${{ needs.setup_release.outputs.create_release == 'true' }} @@ -560,13 +568,16 @@ jobs: if [ -z "$branch" ] then echo "This is a PUSH event" + build_version=${{ needs.check_changelog.outputs.next_version }} clone_url=${{ github.event.repository.clone_url }} branch="${{ github.ref_name }}" + commit=${{ github.sha }} default_branch="${{ github.event.repository.default_branch }}" else echo "This is a PR event" clone_url=${{ github.event.pull_request.head.repo.clone_url }} branch="${{ github.event.pull_request.head.ref }}" + commit=${{ github.event.pull_request.head.sha }} default_branch="${{ github.event.pull_request.head.repo.default_branch }}" fi echo "Branch: ${branch}" @@ -575,7 +586,9 @@ jobs: mkdir build cd build cmake \ + -DBUILD_VERSION="${build_version}" \ -DGITHUB_BRANCH="${branch}" \ + -DGITHUB_COMMIT="${commit}" \ -DGITHUB_CLONE_URL="${clone_url}" \ -DGITHUB_DEFAULT_BRANCH="${default_branch}" \ -DSUNSHINE_CONFIGURE_HOMEBREW=ON \ @@ -613,7 +626,7 @@ jobs: echo "publish=${PUBLISH}" >> $GITHUB_OUTPUT - name: Validate and Publish Homebrew Formula - uses: LizardByte/homebrew-release-action@v2024.314.134529 + uses: LizardByte/homebrew-release-action@v2024.417.220943 with: formula_file: ${{ github.workspace }}/homebrew/sunshine.rb git_email: ${{ secrets.GH_BOT_EMAIL }} @@ -673,6 +686,8 @@ jobs: if [ -z "$branch" ] then echo "This is a PUSH event" + branch="${{ github.ref_name }}" + build_version=${{ needs.check_changelog.outputs.next_version }} commit=${{ github.sha }} clone_url=${{ github.event.repository.clone_url }} else @@ -686,6 +701,8 @@ jobs: mkdir build cd build cmake \ + -DBUILD_VERSION=${build_version} \ + -DGITHUB_BRANCH=${branch} \ -DGITHUB_COMMIT=${commit} \ -DGITHUB_CLONE_URL=${clone_url} \ -DSUNSHINE_CONFIGURE_PORTFILE=ON \ @@ -821,8 +838,8 @@ jobs: cd ${build_dir} ${{ steps.python.outputs.python-path }} -m pip install gcovr sudo ${{ steps.python.outputs.python-path }} -m gcovr -r ../${dir} \ - --exclude ../${dir}/tests/ \ - --exclude ../${dir}/third-party/ \ + --exclude '.*${dir}/tests/.*' \ + --exclude '.*${dir}/third-party/.*' \ --gcov-object-directory $(pwd) \ --verbose \ --xml-pretty \ @@ -830,11 +847,17 @@ jobs: - name: Upload coverage # any except canceled or skipped - if: always() && (steps.test_report.outcome == 'success') - uses: codecov/codecov-action@v3 + if: >- + always() && + (steps.test_report.outcome == 'success') && + startsWith(github.repository, 'LizardByte/') + uses: codecov/codecov-action@v4 with: + disable_search: true + fail_ci_if_error: false # todo: re-enable this when action is fixed files: ./build/coverage.xml flags: ${{ runner.os }}-${{ matrix.os_version }} + token: ${{ secrets.CODECOV_TOKEN }} - name: Create/Update GitHub Release if: ${{ needs.setup_release.outputs.create_release == 'true' && matrix.release }} @@ -1014,7 +1037,7 @@ jobs: shell: msys2 {0} env: BRANCH: ${{ github.head_ref || github.ref_name }} - BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version_bare }} + BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version }} COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} run: | mkdir build @@ -1059,18 +1082,24 @@ jobs: run: | ${{ steps.python-path.outputs.python-path }} -m pip install gcovr ${{ steps.python-path.outputs.python-path }} -m gcovr -r .. \ - --exclude ../tests/ \ - --exclude ../third-party/ \ + --exclude '.*tests/.*' \ + --exclude '.*tests/.*' \ --xml-pretty \ -o coverage.xml - name: Upload coverage # any except canceled or skipped - if: always() && (steps.test_report.outcome == 'success') - uses: codecov/codecov-action@v3 + if: >- + always() && + (steps.test_report.outcome == 'success') && + startsWith(github.repository, 'LizardByte/') + uses: codecov/codecov-action@v4 with: + disable_search: true + fail_ci_if_error: true files: ./build/coverage.xml flags: ${{ runner.os }} + token: ${{ secrets.CODECOV_TOKEN }} - name: Package Windows Debug Info working-directory: build diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 733b4de852..04c9f1acfb 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Autoapproving - uses: hmarr/auto-approve-action@v3 + uses: hmarr/auto-approve-action@v4 with: github-token: "${{ secrets.GITHUB_TOKEN }}" @@ -49,7 +49,7 @@ jobs: steps: - name: Automerging - uses: pascalgn/automerge-action@v0.15.6 + uses: pascalgn/automerge-action@v0.16.3 env: BASE_BRANCHES: nightly GITHUB_TOKEN: ${{ secrets.GH_BOT_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ae5248763e..ff12034f0c 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -16,7 +16,7 @@ on: - cron: '00 12 * * 0' # every Sunday at 12:00 UTC concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: "${{ github.workflow }}-${{ github.ref }}" cancel-in-progress: true jobs: @@ -57,10 +57,25 @@ jobs: console.log(`Remapping language: ${key} to ${remap_languages[key.toLowerCase()]}`) key = remap_languages[key.toLowerCase()] } - if (supported_languages.includes(key.toLowerCase()) && - !matrix['include'].includes({"language": key.toLowerCase()})) { + if (supported_languages.includes(key.toLowerCase())) { console.log(`Found supported language: ${key}`) - matrix['include'].push({"language": key.toLowerCase()}) + let osList = ['ubuntu-latest']; + if (key.toLowerCase() === 'swift') { + osList = ['macos-latest']; + } else if (key.toLowerCase() === 'cpp') { + osList = ['macos-latest', 'ubuntu-latest', 'windows-latest']; + } + for (let os of osList) { + // set name for matrix + if (osList.length == 1) { + name = key.toLowerCase() + } else { + name = `${key.toLowerCase()}, ${os}` + } + + // add to matrix + matrix['include'].push({"language": key.toLowerCase(), "os": os, "name": name}) + } } } @@ -84,10 +99,15 @@ jobs: } analyze: - name: Analyze + name: Analyze (${{ matrix.name }}) if: ${{ needs.languages.outputs.continue == 'true' }} + defaults: + run: + shell: ${{ matrix.os == 'windows-latest' && 'msys2 {0}' || 'bash' }} + env: + GITHUB_CODEQL_BUILD: true needs: [languages] - runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + runs-on: ${{ matrix.os || 'ubuntu-latest' }} timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} permissions: actions: read @@ -100,6 +120,7 @@ jobs: steps: - name: Maximize build space + if: runner.os == 'Linux' uses: easimon/maximize-build-space@v8 with: root-reserve-mb: 20480 @@ -114,6 +135,12 @@ jobs: with: submodules: recursive + - name: Setup msys2 + if: runner.os == 'Windows' + uses: msys2/setup-msys2@v2 + with: + update: true + # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v3 @@ -129,16 +156,20 @@ jobs: # Pre autobuild # create a file named .codeql-prebuild-${{ matrix.language }}.sh in the root of your repository + # create a file named .codeql-build-${{ matrix.language }}.sh in the root of your repository - name: Prebuild + id: prebuild run: | - # check if .qodeql-prebuild-${{ matrix.language }}.sh exists - if [ -f "./.codeql-prebuild-${{ matrix.language }}.sh" ]; then - echo "Running .codeql-prebuild-${{ matrix.language }}.sh" - ./.codeql-prebuild-${{ matrix.language }}.sh + # check if prebuild script exists + filename=".codeql-prebuild-${{ matrix.language }}-${{ runner.os }}.sh" + if [ -f "./${filename}" ]; then + echo "Running prebuild script: ${filename}" + ./${filename} fi # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). - name: Autobuild + if: steps.prebuild.outputs.skip_autobuild != 'true' uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis diff --git a/.github/workflows/cpp-lint.yml b/.github/workflows/cpp-lint.yml index 921641c593..9565befb20 100644 --- a/.github/workflows/cpp-lint.yml +++ b/.github/workflows/cpp-lint.yml @@ -55,7 +55,7 @@ jobs: - name: Clang format lint if: ${{ steps.find_files.outputs.found_files }} - uses: DoozyX/clang-format-lint-action@v0.16.2 + uses: DoozyX/clang-format-lint-action@v0.17 with: source: ${{ steps.find_files.outputs.found_files }} extensions: 'cpp,h,m,mm' diff --git a/.github/workflows/update-pages.yml b/.github/workflows/update-pages.yml index 5fb435d160..fff2dea1d3 100644 --- a/.github/workflows/update-pages.yml +++ b/.github/workflows/update-pages.yml @@ -51,7 +51,7 @@ jobs: if: >- (github.event_name == 'push' && github.ref == 'refs/heads/master') || (github.event_name == 'workflow_dispatch') - uses: actions-js/push@v1.4 + uses: actions-js/push@v1.5 with: github_token: ${{ secrets.GH_BOT_TOKEN }} author_email: ${{ secrets.GH_BOT_EMAIL }} diff --git a/.gitignore b/.gitignore index c3a04d9652..502fc37257 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,45 @@ -build -cmake-build* -.DS_Store -.vscode -.vs -*.swp -*.kdev4 - -.cache -.idea +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# JetBrains IDE +.idea/ + +# VSCode IDE +.vscode/ + +# build directories +build/ +cmake-*/ # npm node_modules/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ca2b370d2..cd0edda865 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [0.23.1] - 2024-04-20 +**Fixed** +- (Capture/Windows) Disable HRD and CBR encoding options by default for AMD GPUs due to video quality regressions in v0.23.0 +- (UI) Fix incorrect strings for QuickSync 'fast' and 'faster' presets +- (UI/Linux) Fix update prompt appearing even when running the latest version +- (Input) Fix crash when absolute input events are received prior to the display viewport being set +- (Input/Linux) Fix missing clamping of rumble intensity to valid range +- (Build/Tests) Fix error when attempting to disable compilation of tests +- (Build/Linux) Fix some compilation errors when using Musl libc +- (Logging) Fix broken debug messages for codec capability flags +- (Logging/Linux) Fix log messages to include the correct setcap command for resolving KMS permission errors + +**Added** +- (Capture/Linux) Improve frame time consistency for all capture backends +- (UI) Set focus to the PIN textbox when navigating to the PIN tab + +**Dependencies** +- Remove libavdevice dependency + +**Misc** +- (Linux) Prefer ayatana-appindicator3 over appindicator3 if both are available + ## [0.23.0] - 2024-04-06 Attention, this release contains critical security fixes. Please update as soon as possible. @@ -799,3 +821,4 @@ settings. In v0.17.0, games now run under your user account without elevated pri [0.22.1]: https://github.com/LizardByte/Sunshine/releases/tag/v0.22.1 [0.22.2]: https://github.com/LizardByte/Sunshine/releases/tag/v0.22.2 [0.23.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.23.0 +[0.23.1]: https://github.com/LizardByte/Sunshine/releases/tag/v0.23.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 180a9911bd..3fbb9416c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.18) # todo - set this conditionally # todo - set version to 0.0.0 once confident in automated versioning -project(Sunshine VERSION 0.23.0 +project(Sunshine VERSION 0.23.1 DESCRIPTION "Self-hosted game stream host for Moonlight" HOMEPAGE_URL "https://app.lizardbyte.dev/Sunshine") diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index 0b54559005..5647dc6b3e 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -199,13 +199,13 @@ endif() # tray icon if(${SUNSHINE_ENABLE_TRAY}) - pkg_check_modules(APPINDICATOR appindicator3-0.1) + pkg_check_modules(APPINDICATOR ayatana-appindicator3-0.1) if(APPINDICATOR_FOUND) - list(APPEND SUNSHINE_DEFINITIONS TRAY_LEGACY_APPINDICATOR=1) + list(APPEND SUNSHINE_DEFINITIONS TRAY_AYATANA_APPINDICATOR=1) else() - pkg_check_modules(APPINDICATOR ayatana-appindicator3-0.1) + pkg_check_modules(APPINDICATOR appindicator3-0.1) if(APPINDICATOR_FOUND) - list(APPEND SUNSHINE_DEFINITIONS TRAY_AYATANA_APPINDICATOR=1) + list(APPEND SUNSHINE_DEFINITIONS TRAY_LEGACY_APPINDICATOR=1) endif () endif() pkg_check_modules(LIBNOTIFY libnotify) diff --git a/cmake/targets/common.cmake b/cmake/targets/common.cmake index ec7c7cbcf9..094bbca7c2 100644 --- a/cmake/targets/common.cmake +++ b/cmake/targets/common.cmake @@ -56,14 +56,20 @@ endif() # custom compile flags, must be after adding tests +if (NOT BUILD_TESTS) + set(TEST_DIR "") +else() + set(TEST_DIR "${CMAKE_SOURCE_DIR}/tests") +endif() + # src/upnp set_source_files_properties("${CMAKE_SOURCE_DIR}/src/upnp.cpp" - DIRECTORY "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/tests" + DIRECTORY "${CMAKE_SOURCE_DIR}" "${TEST_DIR}" PROPERTIES COMPILE_FLAGS -Wno-pedantic) # third-party/nanors set_source_files_properties("${CMAKE_SOURCE_DIR}/third-party/nanors/rs.c" - DIRECTORY "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/tests" + DIRECTORY "${CMAKE_SOURCE_DIR}" "${TEST_DIR}" PROPERTIES COMPILE_FLAGS "-include deps/obl/autoshim.h -ftree-vectorize") # third-party/ViGEmClient @@ -74,7 +80,7 @@ string(APPEND VIGEM_COMPILE_FLAGS "-Wno-class-memaccess ") string(APPEND VIGEM_COMPILE_FLAGS "-Wno-unused-function ") string(APPEND VIGEM_COMPILE_FLAGS "-Wno-unused-variable ") set_source_files_properties("${CMAKE_SOURCE_DIR}/third-party/ViGEmClient/src/ViGEmClient.cpp" - DIRECTORY "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/tests" + DIRECTORY "${CMAKE_SOURCE_DIR}" "${TEST_DIR}" PROPERTIES COMPILE_DEFINITIONS "UNICODE=1;ERROR_INVALID_DEVICE_OBJECT_PARAMETER=650" COMPILE_FLAGS ${VIGEM_COMPILE_FLAGS}) diff --git a/cmake/targets/unix.cmake b/cmake/targets/unix.cmake index 2ce0378fdf..5527a9874f 100644 --- a/cmake/targets/unix.cmake +++ b/cmake/targets/unix.cmake @@ -5,4 +5,4 @@ add_custom_target(web-ui ALL WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "Installing NPM Dependencies and Building the Web UI" - COMMAND bash -c \"npm install && SUNSHINE_BUILD_HOMEBREW=${NPM_BUILD_HOMEBREW} SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR} SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR} npm run build\") # cmake-lint: disable=C0301 + COMMAND sh -c \"npm install && SUNSHINE_BUILD_HOMEBREW=${NPM_BUILD_HOMEBREW} SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR} SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR} npm run build\") # cmake-lint: disable=C0301 diff --git a/codecov.yml b/codecov.yml index 59209e4643..b50701c758 100644 --- a/codecov.yml +++ b/codecov.yml @@ -13,3 +13,7 @@ comment: layout: "diff, flags, files" behavior: default require_changes: false # if true: only post the comment if coverage changes + +ignore: + - "tests" + - "third-party" diff --git a/docker/clion-toolchain.dockerfile b/docker/clion-toolchain.dockerfile index 3af5dd4f45..204450bf1c 100644 --- a/docker/clion-toolchain.dockerfile +++ b/docker/clion-toolchain.dockerfile @@ -33,7 +33,6 @@ apt-get install -y --no-install-recommends \ git \ graphviz \ libayatana-appindicator3-dev \ - libavdevice-dev \ libboost-filesystem-dev=1.74.* \ libboost-locale-dev=1.74.* \ libboost-log-dev=1.74.* \ diff --git a/docker/debian-bookworm.dockerfile b/docker/debian-bookworm.dockerfile index 7f49bb1a49..34cf29bedc 100644 --- a/docker/debian-bookworm.dockerfile +++ b/docker/debian-bookworm.dockerfile @@ -35,7 +35,6 @@ apt-get install -y --no-install-recommends \ doxygen \ git \ graphviz \ - libavdevice-dev \ libayatana-appindicator3-dev \ libboost-filesystem-dev=1.74.* \ libboost-locale-dev=1.74.* \ diff --git a/docker/debian-bullseye.dockerfile b/docker/debian-bullseye.dockerfile index 5e0667f018..2a49155908 100644 --- a/docker/debian-bullseye.dockerfile +++ b/docker/debian-bullseye.dockerfile @@ -36,7 +36,6 @@ apt-get install -y --no-install-recommends \ doxygen \ git \ graphviz \ - libavdevice-dev \ libayatana-appindicator3-dev \ libboost-filesystem-dev=1.74.* \ libboost-locale-dev=1.74.* \ diff --git a/docker/ubuntu-22.04.dockerfile b/docker/ubuntu-22.04.dockerfile index f75fd1ee1e..e02ca1eba9 100644 --- a/docker/ubuntu-22.04.dockerfile +++ b/docker/ubuntu-22.04.dockerfile @@ -36,7 +36,6 @@ apt-get install -y --no-install-recommends \ doxygen \ git \ graphviz \ - libavdevice-dev \ libayatana-appindicator3-dev \ libboost-filesystem-dev=1.74.* \ libboost-locale-dev=1.74.* \ diff --git a/docker/ubuntu-24.04.dockerfile b/docker/ubuntu-24.04.dockerfile index 97008d9597..7ef83bfba3 100644 --- a/docker/ubuntu-24.04.dockerfile +++ b/docker/ubuntu-24.04.dockerfile @@ -63,8 +63,8 @@ apt-get install -y --no-install-recommends \ libxfixes-dev \ libxrandr-dev \ libxtst-dev \ - python3.11 \ - python3.11-venv \ + python3.12 \ + python3.12-venv \ udev \ wget \ x11-xserver-utils \ diff --git a/docs/requirements.txt b/docs/requirements.txt index f7104d627c..46e47734df 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -3,6 +3,7 @@ furo==2024.1.29 m2r2==0.3.3.post2 rstcheck[sphinx]==6.2.1 rstfmt==0.0.14 +setuptools # required by m2r2, Ubuntu 24.04 doesn't include this Sphinx==7.2.6 sphinx-copybutton==0.5.2 sphinx_inline_tabs==2023.4.21 diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst index 1c3a0f64c5..b2e64c0140 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -68,6 +68,8 @@ editing the `conf` file in a text editor. Use the examples as reference. es Spanish fr French it Italian + ja Japanese + pt Portuguese ru Russian sv Swedish zh Chinese (Simplified) @@ -1471,34 +1473,42 @@ keybindings `AMD AMF Encoder `__ --------------------------------------------------------------------- -`amd_quality `__ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`amd_usage `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Description** - The encoder preset to use. + The encoder usage profile is used to set the base set of encoding + parameters. .. note:: This option only applies when using amdvce `encoder`_. + .. note:: The other AMF options that follow will override a subset + of the settings applied by your usage profile, but there are + hidden parameters set in usage profiles that cannot be + overridden elsewhere. + **Choices** .. table:: :widths: auto - ========== =========== - Value Description - ========== =========== - speed prefer speed - balanced balanced - quality prefer quality - ========== =========== + ======================= =========== + Value Description + ======================= =========== + transcoding transcoding (slowest) + webcam webcam (slow) + lowlatency_high_quality low latency, high quality (fast) + lowlatency low latency (faster) + ultralowlatency ultra low latency (fastest) + ======================= =========== **Default** - ``balanced`` + ``ultralowlatency`` **Example** .. code-block:: text - amd_quality = balanced + amd_usage = ultralowlatency `amd_rc `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1508,6 +1518,11 @@ keybindings .. note:: This option only applies when using amdvce `encoder`_. + .. warning:: The 'vbr_latency' option generally works best, but + some bitrate overshoots may still occur. Enabling HRD allows + all bitrate based rate controls to better constrain peak bitrate, + but may result in encoding artifacts depending on your card. + **Choices** .. table:: @@ -1523,81 +1538,98 @@ keybindings =========== =========== **Default** - ``cbr`` + ``vbr_latency`` **Example** .. code-block:: text - amd_rc = cbr + amd_rc = vbr_latency -`amd_usage `__ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`amd_enforce_hrd `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Description** - The encoder usage profile, used to balance latency with encoding quality. + Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate. .. note:: This option only applies when using amdvce `encoder`_. + .. warning:: HRD is known to cause encoding artifacts or negatively affect + encoding quality on certain cards. + **Choices** .. table:: :widths: auto - ======================= =========== - Value Description - ======================= =========== - transcoding transcoding (slowest) - webcam webcam (slow) - lowlatency_high_quality low latency, high quality (fast) - lowlatency low latency (faster) - ultralowlatency ultra low latency (fastest) - ======================= =========== + ======== =========== + Value Description + ======== =========== + enabled enable HRD + disabled disable HRD + ======== =========== **Default** - ``ultralowlatency`` + ``disabled`` **Example** .. code-block:: text - amd_usage = ultralowlatency + amd_enforce_hrd = disabled -`amd_preanalysis `__ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`amd_quality `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Description** - Preanalysis can increase encoding quality at the cost of latency. + The quality profile controls the tradeoff between + speed and quality of encoding. .. note:: This option only applies when using amdvce `encoder`_. +**Choices** + +.. table:: + :widths: auto + + ========== =========== + Value Description + ========== =========== + speed prefer speed + balanced balanced + quality prefer quality + ========== =========== + **Default** - ``disabled`` + ``balanced`` **Example** .. code-block:: text - amd_preanalysis = disabled + amd_quality = balanced -`amd_vbaq `__ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`amd_preanalysis `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Description** - Variance Based Adaptive Quantization (VBAQ) can increase subjective visual quality. + Preanalysis can increase encoding quality at the cost of latency. .. note:: This option only applies when using amdvce `encoder`_. **Default** - ``enabled`` + ``disabled`` **Example** .. code-block:: text - amd_vbaq = enabled + amd_preanalysis = disabled -`amd_enforce_hrd `__ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`amd_vbaq `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Description** - Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate. + Variance Based Adaptive Quantization (VBAQ) can increase subjective + visual quality by prioritizing allocation of more bits to smooth + areas compared to more textured areas. .. note:: This option only applies when using amdvce `encoder`_. @@ -1607,7 +1639,7 @@ keybindings **Example** .. code-block:: text - amd_enforce_hrd = enabled + amd_vbaq = enabled `amd_coder `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/about/guides/linux/discord_calls.rst b/docs/source/about/guides/linux/discord_calls.rst new file mode 100644 index 0000000000..34b5920a3c --- /dev/null +++ b/docs/source/about/guides/linux/discord_calls.rst @@ -0,0 +1,30 @@ +How to not stream Discord call audio +==================================== + +#. Set your normal `Sound Output` volume to 100% + + .. image:: ../../../images/discord_calls_01.png + +#. Start Sunshine + +#. Set `Sound Output` to `sink-sunshine-stereo` (if it isn't automatic) + + .. image:: ../../../images/discord_calls_02.png + +#. In Discord - `Right Click` - `Deafen` - Select your normal `Output Device` + + This is also where you will need to adjust output volume for Discord calls + + .. image:: ../../../images/discord_calls_03.png + +#. Open `qpwgraph` + + .. image:: ../../../images/discord_calls_04.png + +#. Connect `sunshine [sunshine-record]` to your normal `Output Device` + + * Drag `monitor_FL` to `playback_FL` + + * Drag `monitor_FR` to `playback_FR` + + .. image:: ../../../images/discord_calls_05.png diff --git a/docs/source/building/linux.rst b/docs/source/building/linux.rst index 7bf1af490a..d263a7d07f 100644 --- a/docs/source/building/linux.rst +++ b/docs/source/building/linux.rst @@ -15,7 +15,6 @@ Install Requirements sudo apt update && sudo apt install \ build-essential \ cmake \ - libavdevice-dev \ libayatana-appindicator3-dev \ libboost-filesystem-dev \ libboost-locale-dev \ @@ -98,7 +97,6 @@ Install Requirements build-essential \ cmake \ libappindicator3-dev \ - libavdevice-dev \ libboost-filesystem-dev \ libboost-locale-dev \ libboost-log-dev \ @@ -140,7 +138,6 @@ Install Requirements gcc-11 \ g++-11 \ libappindicator3-dev \ - libavdevice-dev \ libboost-filesystem-dev \ libboost-locale-dev \ libboost-log-dev \ diff --git a/docs/source/images/discord_calls_01.png b/docs/source/images/discord_calls_01.png new file mode 100644 index 0000000000..d26e62a811 Binary files /dev/null and b/docs/source/images/discord_calls_01.png differ diff --git a/docs/source/images/discord_calls_02.png b/docs/source/images/discord_calls_02.png new file mode 100644 index 0000000000..6a739be788 Binary files /dev/null and b/docs/source/images/discord_calls_02.png differ diff --git a/docs/source/images/discord_calls_03.png b/docs/source/images/discord_calls_03.png new file mode 100644 index 0000000000..0dd3450023 Binary files /dev/null and b/docs/source/images/discord_calls_03.png differ diff --git a/docs/source/images/discord_calls_04.png b/docs/source/images/discord_calls_04.png new file mode 100644 index 0000000000..ec38513e25 Binary files /dev/null and b/docs/source/images/discord_calls_04.png differ diff --git a/docs/source/images/discord_calls_05.png b/docs/source/images/discord_calls_05.png new file mode 100644 index 0000000000..efb4e2beea Binary files /dev/null and b/docs/source/images/discord_calls_05.png differ diff --git a/package.json b/package.json index db309cb7ec..08b860c628 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "bootstrap": "5.3.3", "vite": "4.5.2", "vite-plugin-ejs": "1.6.4", - "vue": "3.4.5", - "vue-i18n": "9.11.0" + "vue": "3.4.23", + "vue-i18n": "9.13.0" } } diff --git a/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp b/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp index 6e295e6307..5532d4354e 160000 --- a/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp +++ b/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp @@ -1 +1 @@ -Subproject commit 6e295e630740ae8ef82c6291724e709b36477042 +Subproject commit 5532d4354e05ccfc3421e670fcb4e7fa5512ab39 diff --git a/packaging/linux/flatpak/deps/shared-modules b/packaging/linux/flatpak/deps/shared-modules index d0229951ac..ec91811777 160000 --- a/packaging/linux/flatpak/deps/shared-modules +++ b/packaging/linux/flatpak/deps/shared-modules @@ -1 +1 @@ -Subproject commit d0229951ac23967c4f5697bd7b5c1bd7e641b8c3 +Subproject commit ec91811777c655b6a3091d60f1eadd79e0fbc957 diff --git a/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml b/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml index 0e891dacf0..cba627807c 100644 --- a/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml +++ b/packaging/linux/flatpak/dev.lizardbyte.sunshine.yml @@ -329,6 +329,9 @@ modules: build-args: - --share=network env: + BUILD_VERSION: "@BUILD_VERSION@" + BRANCH: "@GITHUB_BRANCH@" + COMMIT: "@GITHUB_COMMIT@" npm_config_nodedir: /usr/lib/sdk/node18 NPM_CONFIG_LOGLEVEL: info config-opts: diff --git a/packaging/macos/Portfile b/packaging/macos/Portfile index aacc3209ff..e0cc9ef34f 100644 --- a/packaging/macos/Portfile +++ b/packaging/macos/Portfile @@ -51,6 +51,10 @@ configure.args -DBUILD_WERROR=ON \ -DCMAKE_INSTALL_PREFIX=${prefix} \ -DSUNSHINE_ASSETS_DIR=etc/sunshine/assets +configure.env-append BRANCH=@GITHUB_BRANCH@ +configure.env-append BUILD_VERSION=@BUILD_VERSION@ +configure.env-append COMMIT=@GITHUB_COMMIT@ + startupitem.create yes startupitem.executable "${prefix}/bin/{$name}" startupitem.location LaunchDaemons diff --git a/packaging/macos/sunshine.rb b/packaging/macos/sunshine.rb index 1853c0c8c7..e119d1df1a 100644 --- a/packaging/macos/sunshine.rb +++ b/packaging/macos/sunshine.rb @@ -19,6 +19,10 @@ class @PROJECT_NAME@ < Formula depends_on "opus" def install + ENV["BRANCH"] = "@GITHUB_BRANCH@" + ENV["BUILD_VERSION"] = "@BUILD_VERSION@" + ENV["COMMIT"] = "@GITHUB_COMMIT@" + args = %W[ -DBUILD_WERROR=ON -DCMAKE_INSTALL_PREFIX=#{prefix} diff --git a/scripts/_locale.py b/scripts/_locale.py index 884805702e..d035414917 100644 --- a/scripts/_locale.py +++ b/scripts/_locale.py @@ -32,6 +32,7 @@ 'fr', # French 'it', # Italian 'ja', # Japanese + 'pt', # Portuguese 'ru', # Russian 'sv', # Swedish 'zh', # Chinese diff --git a/scripts/requirements.txt b/scripts/requirements.txt index c65a1d3093..dc931f2df2 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1 +1,2 @@ Babel==2.14.0 +clang-format diff --git a/src/config.cpp b/src/config.cpp index ab6dbfb5c3..6a9e1cecb7 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -124,24 +124,24 @@ namespace config { }; enum class rc_av1_e : int { + cbr = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR, cqp = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP, vbr_latency = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, - vbr_peak = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, - cbr = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR + vbr_peak = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }; enum class rc_hevc_e : int { + cbr = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR, cqp = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP, vbr_latency = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, - vbr_peak = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, - cbr = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR + vbr_peak = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }; enum class rc_h264_e : int { + cbr = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR, cqp = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP, vbr_latency = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, - vbr_peak = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, - cbr = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR + vbr_peak = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }; enum class usage_av1_e : int { @@ -176,41 +176,41 @@ namespace config { template std::optional - quality_from_view(const std::string_view &quality_type) { + quality_from_view(const std::string_view &quality_type, const std::optional(&original)) { #define _CONVERT_(x) \ if (quality_type == #x##sv) return (int) T::x + _CONVERT_(balanced); _CONVERT_(quality); _CONVERT_(speed); - _CONVERT_(balanced); #undef _CONVERT_ - return std::nullopt; + return original; } template std::optional - rc_from_view(const std::string_view &rc) { + rc_from_view(const std::string_view &rc, const std::optional(&original)) { #define _CONVERT_(x) \ if (rc == #x##sv) return (int) T::x + _CONVERT_(cbr); _CONVERT_(cqp); _CONVERT_(vbr_latency); _CONVERT_(vbr_peak); - _CONVERT_(cbr); #undef _CONVERT_ - return std::nullopt; + return original; } template std::optional - usage_from_view(const std::string_view &usage) { + usage_from_view(const std::string_view &usage, const std::optional(&original)) { #define _CONVERT_(x) \ if (usage == #x##sv) return (int) T::x - _CONVERT_(transcoding); - _CONVERT_(webcam); _CONVERT_(lowlatency); _CONVERT_(lowlatency_high_quality); + _CONVERT_(transcoding); _CONVERT_(ultralowlatency); + _CONVERT_(webcam); #undef _CONVERT_ - return std::nullopt; + return original; } int @@ -219,7 +219,7 @@ namespace config { if (coder == "cabac"sv || coder == "ac"sv) return cabac; if (coder == "cavlc"sv || coder == "vlc"sv) return cavlc; - return -1; + return _auto; } } // namespace amd @@ -350,18 +350,18 @@ namespace config { }, // qsv { - (int) amd::quality_h264_e::balanced, // quality (h264) - (int) amd::quality_hevc_e::balanced, // quality (hevc) - (int) amd::quality_av1_e::balanced, // quality (av1) - (int) amd::rc_h264_e::cbr, // rate control (h264) - (int) amd::rc_hevc_e::cbr, // rate control (hevc) - (int) amd::rc_av1_e::cbr, // rate control (av1) (int) amd::usage_h264_e::ultralowlatency, // usage (h264) (int) amd::usage_hevc_e::ultralowlatency, // usage (hevc) (int) amd::usage_av1_e::ultralowlatency, // usage (av1) + (int) amd::rc_h264_e::vbr_latency, // rate control (h264) + (int) amd::rc_hevc_e::vbr_latency, // rate control (hevc) + (int) amd::rc_av1_e::vbr_latency, // rate control (av1) + 0, // enforce_hrd + (int) amd::quality_h264_e::balanced, // quality (h264) + (int) amd::quality_hevc_e::balanced, // quality (hevc) + (int) amd::quality_av1_e::balanced, // quality (av1) 0, // preanalysis 1, // vbaq - 1, // enforce_hrd (int) amd::coder_e::_auto, // coder }, // amd @@ -982,26 +982,26 @@ namespace config { std::string quality; string_f(vars, "amd_quality", quality); if (!quality.empty()) { - video.amd.amd_quality_h264 = amd::quality_from_view(quality); - video.amd.amd_quality_hevc = amd::quality_from_view(quality); - video.amd.amd_quality_av1 = amd::quality_from_view(quality); + video.amd.amd_quality_h264 = amd::quality_from_view(quality, video.amd.amd_quality_h264); + video.amd.amd_quality_hevc = amd::quality_from_view(quality, video.amd.amd_quality_hevc); + video.amd.amd_quality_av1 = amd::quality_from_view(quality, video.amd.amd_quality_av1); } std::string rc; string_f(vars, "amd_rc", rc); int_f(vars, "amd_coder", video.amd.amd_coder, amd::coder_from_view); if (!rc.empty()) { - video.amd.amd_rc_h264 = amd::rc_from_view(rc); - video.amd.amd_rc_hevc = amd::rc_from_view(rc); - video.amd.amd_rc_av1 = amd::rc_from_view(rc); + video.amd.amd_rc_h264 = amd::rc_from_view(rc, video.amd.amd_rc_h264); + video.amd.amd_rc_hevc = amd::rc_from_view(rc, video.amd.amd_rc_hevc); + video.amd.amd_rc_av1 = amd::rc_from_view(rc, video.amd.amd_rc_av1); } std::string usage; string_f(vars, "amd_usage", usage); if (!usage.empty()) { - video.amd.amd_usage_h264 = amd::usage_from_view(usage); - video.amd.amd_usage_hevc = amd::usage_from_view(usage); - video.amd.amd_usage_av1 = amd::usage_from_view(usage); + video.amd.amd_usage_h264 = amd::usage_from_view(usage, video.amd.amd_usage_h264); + video.amd.amd_usage_hevc = amd::usage_from_view(usage, video.amd.amd_usage_hevc); + video.amd.amd_usage_av1 = amd::usage_from_view(usage, video.amd.amd_usage_av1); } bool_f(vars, "amd_preanalysis", (bool &) video.amd.amd_preanalysis); @@ -1120,6 +1120,7 @@ namespace config { "fr"sv, // French "it"sv, // Italian "ja"sv, // Japanese + "pt"sv, // Portuguese "ru"sv, // Russian "sv"sv, // Swedish "zh"sv, // Chinese diff --git a/src/config.h b/src/config.h index 2c85096bac..55098c0c5a 100644 --- a/src/config.h +++ b/src/config.h @@ -48,18 +48,18 @@ namespace config { } qsv; struct { - std::optional amd_quality_h264; - std::optional amd_quality_hevc; - std::optional amd_quality_av1; - std::optional amd_rc_h264; - std::optional amd_rc_hevc; - std::optional amd_rc_av1; std::optional amd_usage_h264; std::optional amd_usage_hevc; std::optional amd_usage_av1; + std::optional amd_rc_h264; + std::optional amd_rc_hevc; + std::optional amd_rc_av1; + std::optional amd_enforce_hrd; + std::optional amd_quality_h264; + std::optional amd_quality_hevc; + std::optional amd_quality_av1; std::optional amd_preanalysis; std::optional amd_vbaq; - std::optional amd_enforce_hrd; int amd_coder; } amd; diff --git a/src/input.cpp b/src/input.cpp index 89f7291f11..2e26d5b00a 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -469,15 +469,19 @@ namespace input { * @param input The input context. * @param val The cartesian coordinate pair to convert. * @param size The size of the client's surface containing the value. - * @return The host-relative coordinate pair. + * @return The host-relative coordinate pair if a touchport is available. */ - std::pair + std::optional> client_to_touchport(std::shared_ptr &input, const std::pair &val, const std::pair &size) { auto &touch_port_event = input->touch_port_event; auto &touch_port = input->touch_port; if (touch_port_event->peek()) { touch_port = *touch_port_event->pop(); } + if (!touch_port) { + BOOST_LOG(verbose) << "Ignoring early absolute input without a touch port"sv; + return std::nullopt; + } auto scalarX = touch_port.width / size.first; auto scalarY = touch_port.height / size.second; @@ -491,7 +495,7 @@ namespace input { x = std::clamp(x, offsetX, (size.first * scalarX) - offsetX); y = std::clamp(y, offsetY, (size.second * scalarY) - offsetY); - return { (x - offsetX) * touch_port.scalar_inv, (y - offsetY) * touch_port.scalar_inv }; + return std::pair { (x - offsetX) * touch_port.scalar_inv, (y - offsetY) * touch_port.scalar_inv }; } /** @@ -561,6 +565,9 @@ namespace input { auto height = (float) util::endian::big(packet->height); auto tpcoords = client_to_touchport(input, { x, y }, { width, height }); + if (!tpcoords) { + return; + } auto &touch_port = input->touch_port; platf::touch_port_t abs_port { @@ -568,7 +575,7 @@ namespace input { touch_port.env_width, touch_port.env_height }; - platf::abs_mouse(platf_input, abs_port, tpcoords.first, tpcoords.second); + platf::abs_mouse(platf_input, abs_port, tpcoords->first, tpcoords->second); } void @@ -918,6 +925,9 @@ namespace input { { from_clamped_netfloat(packet->x, 0.0f, 1.0f) * 65535.f, from_clamped_netfloat(packet->y, 0.0f, 1.0f) * 65535.f }, { 65535.f, 65535.f }); + if (!coords) { + return; + } auto &touch_port = input->touch_port; platf::touch_port_t abs_port { @@ -926,8 +936,8 @@ namespace input { }; // Renormalize the coordinates - coords.first /= abs_port.width; - coords.second /= abs_port.height; + coords->first /= abs_port.width; + coords->second /= abs_port.height; // Normalize rotation value to 0-359 degree range auto rotation = util::endian::little(packet->rotation); @@ -946,8 +956,8 @@ namespace input { packet->eventType, rotation, util::endian::little(packet->pointerId), - coords.first, - coords.second, + coords->first, + coords->second, from_clamped_netfloat(packet->pressureOrDistance, 0.0f, 1.0f), contact_area.first, contact_area.second, @@ -972,6 +982,9 @@ namespace input { { from_clamped_netfloat(packet->x, 0.0f, 1.0f) * 65535.f, from_clamped_netfloat(packet->y, 0.0f, 1.0f) * 65535.f }, { 65535.f, 65535.f }); + if (!coords) { + return; + } auto &touch_port = input->touch_port; platf::touch_port_t abs_port { @@ -980,8 +993,8 @@ namespace input { }; // Renormalize the coordinates - coords.first /= abs_port.width; - coords.second /= abs_port.height; + coords->first /= abs_port.width; + coords->second /= abs_port.height; // Normalize rotation value to 0-359 degree range auto rotation = util::endian::little(packet->rotation); @@ -1002,8 +1015,8 @@ namespace input { packet->penButtons, packet->tilt, rotation, - coords.first, - coords.second, + coords->first, + coords->second, from_clamped_netfloat(packet->pressureOrDistance, 0.0f, 1.0f), contact_area.first, contact_area.second, diff --git a/src/input.h b/src/input.h index bc9fea8479..33a9ee4274 100644 --- a/src/input.h +++ b/src/input.h @@ -32,6 +32,11 @@ namespace input { float client_offsetX, client_offsetY; float scalar_inv; + + explicit + operator bool() const { + return width != 0 && height != 0 && env_width != 0 && env_height != 0; + } }; std::pair diff --git a/src/main.cpp b/src/main.cpp index 22d9e4c4be..208951d48f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ */ // standard includes +#include #include #include #include diff --git a/src/platform/common.h b/src/platform/common.h index 7a4102ad5b..007f7ece61 100644 --- a/src/platform/common.h +++ b/src/platform/common.h @@ -10,7 +10,9 @@ #include #include +#include "src/config.h" #include "src/logging.h" +#include "src/stat_trackers.h" #include "src/thread_safe.h" #include "src/utility.h" #include "src/video_colorspace.h" @@ -19,6 +21,8 @@ extern "C" { #include } +using namespace std::literals; + struct sockaddr; struct AVFrame; struct AVBufferRef; @@ -499,6 +503,22 @@ namespace platf { int env_width, env_height; int width, height; + + protected: + // collect capture timing data (at loglevel debug) + stat_trackers::min_max_avg_tracker sleep_overshoot_tracker; + void + log_sleep_overshoot(std::chrono::nanoseconds overshoot_ns) { + if (config::sunshine.min_log_level <= 1) { + // Print sleep overshoot stats to debug log every 20 seconds + auto print_info = [&](double min_overshoot, double max_overshoot, double avg_overshoot) { + auto f = stat_trackers::one_digit_after_decimal(); + BOOST_LOG(debug) << "Sleep overshoot (min/max/avg): " << f % min_overshoot << "ms/" << f % max_overshoot << "ms/" << f % avg_overshoot << "ms"; + }; + // std::chrono::nanoseconds overshoot_ns = std::chrono::steady_clock::now() - next_frame; + sleep_overshoot_tracker.collect_and_callback_on_interval(overshoot_ns.count() / 1000000., print_info, 20s); + } + } }; class mic_t { diff --git a/src/platform/linux/cuda.cpp b/src/platform/linux/cuda.cpp index 33c939243f..ee535d21d2 100644 --- a/src/platform/linux/cuda.cpp +++ b/src/platform/linux/cuda.cpp @@ -800,16 +800,21 @@ namespace cuda { handle.reset(); }); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - std::this_thread::sleep_for(1ns); - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 150ms, *cursor); diff --git a/src/platform/linux/input.cpp b/src/platform/linux/input.cpp index 42e239980d..74d683048f 100644 --- a/src/platform/linux/input.cpp +++ b/src/platform/linux/input.cpp @@ -587,8 +587,8 @@ namespace platf { weak_strong += data.rumble(tp); } - std::clamp(weak_strong.first, 0, 0xFFFF); - std::clamp(weak_strong.second, 0, 0xFFFF); + weak_strong.first = std::clamp(weak_strong.first, 0, 0xFFFF); + weak_strong.second = std::clamp(weak_strong.second, 0, 0xFFFF); old_rumble = weak_strong * gain / 0xFFFF; return old_rumble; diff --git a/src/platform/linux/kmsgrab.cpp b/src/platform/linux/kmsgrab.cpp index b742e9edc6..30a2470f2d 100644 --- a/src/platform/linux/kmsgrab.cpp +++ b/src/platform/linux/kmsgrab.cpp @@ -1193,17 +1193,22 @@ namespace platf { capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override { auto next_frame = std::chrono::steady_clock::now(); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - std::this_thread::sleep_for(1ns); - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor); @@ -1412,17 +1417,22 @@ namespace platf { capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) { auto next_frame = std::chrono::steady_clock::now(); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - std::this_thread::sleep_for(1ns); - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor); @@ -1675,7 +1685,7 @@ namespace platf { if (!fb->handles[0]) { BOOST_LOG(error) << "Couldn't get handle for DRM Framebuffer ["sv << plane->fb_id << "]: Probably not permitted"sv; BOOST_LOG((window_system != window_system_e::X11 || config::video.capture == "kms") ? fatal : error) - << "You must run [sudo setcap cap_sys_admin+p $(readlink -f sunshine)] for KMS display capture to work!"sv; + << "You must run [sudo setcap cap_sys_admin+p $(readlink -f $(which sunshine))] for KMS display capture to work!"sv; break; } diff --git a/src/platform/linux/wlgrab.cpp b/src/platform/linux/wlgrab.cpp index 2ea15359fc..a6ac4adbb9 100644 --- a/src/platform/linux/wlgrab.cpp +++ b/src/platform/linux/wlgrab.cpp @@ -129,16 +129,22 @@ namespace wl { capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override { auto next_frame = std::chrono::steady_clock::now(); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor); @@ -259,16 +265,22 @@ namespace wl { capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override { auto next_frame = std::chrono::steady_clock::now(); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor); diff --git a/src/platform/linux/x11grab.cpp b/src/platform/linux/x11grab.cpp index 0a639b9cc2..0d4c3d38c3 100644 --- a/src/platform/linux/x11grab.cpp +++ b/src/platform/linux/x11grab.cpp @@ -481,17 +481,22 @@ namespace platf { capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override { auto next_frame = std::chrono::steady_clock::now(); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - std::this_thread::sleep_for(1ns); - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor); @@ -622,17 +627,22 @@ namespace platf { capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override { auto next_frame = std::chrono::steady_clock::now(); + sleep_overshoot_tracker.reset(); + while (true) { auto now = std::chrono::steady_clock::now(); if (next_frame > now) { - std::this_thread::sleep_for((next_frame - now) / 3 * 2); + std::this_thread::sleep_for(next_frame - now); } - while (next_frame > now) { - std::this_thread::sleep_for(1ns); - now = std::chrono::steady_clock::now(); + now = std::chrono::steady_clock::now(); + std::chrono::nanoseconds overshoot_ns = now - next_frame; + log_sleep_overshoot(overshoot_ns); + + next_frame += delay; + if (next_frame < now) { // some major slowdown happened; we couldn't keep up + next_frame = now + delay; } - next_frame = now + delay; std::shared_ptr img_out; auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor); diff --git a/src/platform/windows/display_base.cpp b/src/platform/windows/display_base.cpp index b258690e10..227efe7628 100644 --- a/src/platform/windows/display_base.cpp +++ b/src/platform/windows/display_base.cpp @@ -154,7 +154,7 @@ namespace platf::dxgi { SetThreadExecutionState(ES_CONTINUOUS); }); - stat_trackers::min_max_avg_tracker sleep_overshoot_tracker; + sleep_overshoot_tracker.reset(); while (true) { // This will return false if the HDR state changes or for any number of other @@ -184,16 +184,8 @@ namespace platf::dxgi { } else { high_precision_sleep(sleep_period); - - if (config::sunshine.min_log_level <= 1) { - // Print sleep overshoot stats to debug log every 20 seconds - auto print_info = [&](double min_overshoot, double max_overshoot, double avg_overshoot) { - auto f = stat_trackers::one_digit_after_decimal(); - BOOST_LOG(debug) << "Sleep overshoot (min/max/avg): " << f % min_overshoot << "ms/" << f % max_overshoot << "ms/" << f % avg_overshoot << "ms"; - }; - std::chrono::nanoseconds overshoot_ns = std::chrono::steady_clock::now() - sleep_target; - sleep_overshoot_tracker.collect_and_callback_on_interval(overshoot_ns.count() / 1000000., print_info, 20s); - } + std::chrono::nanoseconds overshoot_ns = std::chrono::steady_clock::now() - sleep_target; + log_sleep_overshoot(overshoot_ns); status = snapshot(pull_free_image_cb, img_out, 0ms, *cursor); diff --git a/src/video.h b/src/video.h index eb8eabc358..ba80474669 100644 --- a/src/video.h +++ b/src/video.h @@ -95,7 +95,7 @@ namespace video { from_flag(flag_e flag) { #define _CONVERT(x) \ case flag_e::x: \ - std::string_view(#x) + return std::string_view(#x) switch (flag) { _CONVERT(PASSED); _CONVERT(REF_FRAMES_RESTRICT); diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index a48e4a4140..859954ac24 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -49,6 +49,7 @@

{{ $t('config.configuration') }}

+ @@ -875,74 +876,113 @@

- -
- - -
- - -
- - -
-
+
{{ $t('config.amd_usage_desc') }}
- -
- - -
+ +
+
+

+ +

+
+
+ +
+ + +
{{ $t('config.amd_rc_desc') }}
+
- -
- - + +
+ + +
{{ $t('config.amd_enforce_hrd_desc') }}
+
+
+
+
- -
- - -
+ +
+
+

+ +

+
+
+ +
+ + +
{{ $t('config.amd_quality_desc') }}
+
- -
- - + +
+ + +
{{ $t('config.amd_preanalysis_desc') }}
+
+ + +
+ + +
{{ $t('config.amd_vbaq_desc') }}
+
+ + +
+ + +
{{ $t('config.amd_coder_desc') }}
+
+
+
+
@@ -1156,12 +1196,12 @@

id: "amd", name: "AMD AMF Encoder", options: { - "amd_quality": "balanced", - "amd_rc": "cbr", "amd_usage": "ultralowlatency", + "amd_rc": "vbr_latency", + "amd_enforce_hrd": "disabled", + "amd_quality": "balanced", "amd_preanalysis": "disabled", "amd_vbaq": "enabled", - "amd_enforce_hrd": "enabled", "amd_coder": "auto", }, }, diff --git a/src_assets/common/assets/web/index.html b/src_assets/common/assets/web/index.html index 1219971142..16dff05b92 100644 --- a/src_assets/common/assets/web/index.html +++ b/src_assets/common/assets/web/index.html @@ -112,10 +112,16 @@

{{githubVersion.name}}

stableBuildAvailable() { // If we can't get versions, return false if (!this.githubVersion || !this.version) return false; + // Get the GitHub version tag - let v = this.githubVersion.name; + let v_github = this.githubVersion.name; + // If the version starts with a v, remove it + if (v_github.indexOf("v") === 0) v_github = v_github.substring(1); + + // Get the current version + let v_this = this.version; // If the version starts with a v, remove it - if (v.indexOf("v") === 0) v = v.substring(1); + if (v_this.indexOf("v") === 0) v_this = v_this.substring(1); // if nightly or dirty, we do an additional check to make sure it's an actual upgrade. if (this.buildVersionIsNightly || this.buildVersionIsDirty) { @@ -124,7 +130,7 @@

{{githubVersion.name}}

} // return true if the version is different, otherwise false - return v !== this.version; + return v_github !== v_this; }, nightlyBuildAvailable() { // Verify nightly data is available and the build version is not stable diff --git a/src_assets/common/assets/web/pin.html b/src_assets/common/assets/web/pin.html index 530ab44b19..056bd6e20d 100644 --- a/src_assets/common/assets/web/pin.html +++ b/src_assets/common/assets/web/pin.html @@ -11,7 +11,7 @@

{{ $t('pin.pin_pairing') }}

- +
diff --git a/src_assets/common/assets/web/public/assets/locale/de.json b/src_assets/common/assets/web/public/assets/locale/de.json index d396726240..5ad6efbbaa 100644 --- a/src_assets/common/assets/web/public/assets/locale/de.json +++ b/src_assets/common/assets/web/public/assets/locale/de.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Scancodes immer senden", "always_send_scancodes_desc": "Das Senden von Scancodes verbessert die Kompatibilität mit Spielen und Apps, kann aber zu falschen Tastatureingaben von bestimmten Clients führen, die kein amerikanisches Tastaturlayout verwenden. Aktivieren, wenn die Eingabe der Tastatur in bestimmten Anwendungen überhaupt nicht funktioniert. Deaktivieren, wenn Schlüssel auf dem Client die falsche Eingabe auf dem Host generieren.", "amd_coder": "AMF Coder (H264)", + "amd_coder_desc": "Erlaubt es Ihnen, die Entropy-Kodierung auszuwählen, um die Qualität oder die Kodierungsgeschwindigkeit zu priorisieren. H.264 nur.", "amd_enforce_hrd": "Hypothetische Referenz-Decodierer (HRD) durchsetzen", + "amd_enforce_hrd_desc": "Steigern Sie die Einschränkungen bei der Ratensteuerung, um die Anforderungen des HRD-Modells zu erfüllen. Dies reduziert die Bitratenüberläufe erheblich, kann jedoch zu Kodierungsartefakten oder zu geringerer Qualität auf bestimmten Karten führen.", "amd_preanalysis": "AMF-Voranalyse", + "amd_preanalysis_desc": "Dies ermöglicht die Vorabanalyse der Rate, wodurch die Qualität auf Kosten einer erhöhten Encoding-Latenz erhöht werden kann.", "amd_quality": "AMF-Qualität", "amd_quality_balanced": "ausgewogen -- Ausgewogen (Standard)", + "amd_quality_desc": "Dies steuert die Balance zwischen Kodierungsgeschwindigkeit und Qualität.", + "amd_quality_group": "AMF Qualitätseinstellungen", "amd_quality_quality": "Qualität -- Qualität bevorzugen", "amd_quality_speed": "speed -- bevorzuge Geschwindigkeit", "amd_rc": "AMF-Ratensteuerung", "amd_rc_cbr": "cbr – Konstante Bitrate", "amd_rc_cqp": "cqp -- Konstanter qp-Modus", + "amd_rc_desc": "Diese steuert die Methode der Ratensteuerung, um sicherzustellen, dass wir nicht das Client-Bitrate Ziel überschreiten. 'cqp' ist nicht geeignet für Bitraten-Targeting, und andere Optionen außer 'vbr_latency' hängen von der Durchsetzung von HRD ab, um Bitraten-Überläufe einzuschränken.", + "amd_rc_group": "AMF Rate Control Einstellungen", "amd_rc_vbr_latency": "vbr_latency -- latenzeingeschränkte Bitrate (Standard)", "amd_rc_vbr_peak": "vbr_peak – eingeschränkte Variablen-Bitrate spitzen", "amd_usage": "AMF-Nutzung", + "amd_usage_desc": "Dies legt das Basiscodierungsprofil fest. Alle unten dargestellten Optionen werden eine Teilmenge des Nutzungsprofils überschreiben. Es werden jedoch zusätzliche versteckte Einstellungen angewendet, die an anderer Stelle nicht konfiguriert werden können.", "amd_usage_lowlatency": "niedrige Latenz - niedrige Latenz (schnell)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - niedrige Latenz, hohe Qualität (schnell)", "amd_usage_transcoding": "transcoding -- Umkodierung (langsamste)", "amd_usage_ultralowlatency": "ultralowlatenz - extrem niedrige Latenz (schnellste)", "amd_usage_webcam": "webcam -- Webcam (langsam)", "amd_vbaq": "AMF-Varianz-basierte Adaptive Quantisierung (VBAQ)", + "amd_vbaq_desc": "Das menschliche visuelle System ist in der Regel weniger empfindlich auf Artefakte in stark strukturierten Bereichen. Im VBAQ-Modus wird die Pixelvarianz verwendet, um die Komplexität der räumlichen Texturen anzuzeigen, so dass der Encoder mehr Bits für glättende Bereiche zuweisen kann. Die Aktivierung dieser Funktion führt zu Verbesserungen der subjektiven visuellen Qualität mit einigen Inhalten.", "apply_note": "Klicken Sie auf 'Anwenden', um Sunshine neu zu starten und Änderungen anzuwenden. Dies wird alle laufenden Sitzungen beenden.", "audio_sink": "Audio Sink", "audio_sink_desc_linux": "Der Name des Audio-Spüls, der für Audio Loopback verwendet wird. Wenn Sie diese Variable nicht angeben, wählt pulseaudio das Standard-Monitorgerät. Sie können den Namen des Audiospülers mit einem Befehl finden:", diff --git a/src_assets/common/assets/web/public/assets/locale/en.json b/src_assets/common/assets/web/public/assets/locale/en.json index 6fa1f3a04c..37e0b41ee6 100644 --- a/src_assets/common/assets/web/public/assets/locale/en.json +++ b/src_assets/common/assets/web/public/assets/locale/en.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Always Send Scancodes", "always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.", "amd_coder": "AMF Coder (H264)", + "amd_coder_desc": "Allows you to select the entropy encoding to prioritize quality or encoding speed. H.264 only.", "amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", + "amd_enforce_hrd_desc": "Increases the constraints on rate control to meet HRD model requirements. This greatly reduces bitrate overflows, but may cause encoding artifacts or reduced quality on certain cards.", "amd_preanalysis": "AMF Preanalysis", + "amd_preanalysis_desc": "This enables rate-control preanalysis, which may increase quality at the expense of increased encoding latency.", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", + "amd_quality_desc": "This controls the balance between encoding speed and quality.", + "amd_quality_group": "AMF Quality Settings", "amd_quality_quality": "quality -- prefer quality", "amd_quality_speed": "speed -- prefer speed", "amd_rc": "AMF Rate Control", - "amd_rc_cbr": "cbr -- constant bitrate (default)", + "amd_rc_cbr": "cbr -- constant bitrate (recommended if HRD is enabled)", "amd_rc_cqp": "cqp -- constant qp mode", - "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate", + "amd_rc_desc": "This controls the rate control method to ensure we are not exceeding the client bitrate target. 'cqp' is not suitable for bitrate targeting, and other options besides 'vbr_latency' depend on HRD Enforcement to help constrain bitrate overflows.", + "amd_rc_group": "AMF Rate Control Settings", + "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (recommended if HRD is disabled; default)", "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", + "amd_usage_desc": "This sets the base encoding profile. All options presented below will override a subset of the usage profile, but there are additional hidden settings applied that cannot be configured elsewhere.", "amd_usage_lowlatency": "lowlatency - low latency (fastest)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)", "amd_usage_transcoding": "transcoding -- transcoding (slowest)", - "amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)", + "amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest; default)", "amd_usage_webcam": "webcam -- webcam (slow)", "amd_vbaq": "AMF Variance Based Adaptive Quantization (VBAQ)", + "amd_vbaq_desc": "The human visual system is typically less sensitive to artifacts in highly textured areas. In VBAQ mode, pixel variance is used to indicate the complexity of spatial textures, allowing the encoder to allocate more bits to smoother areas. Enabling this feature leads to improvements in subjective visual quality with some content.", "apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.", "audio_sink": "Audio Sink", "audio_sink_desc_linux": "The name of the audio sink used for Audio Loopback. If you do not specify this variable, pulseaudio will select the default monitor device. You can find the name of the audio sink using either command:", @@ -258,8 +267,8 @@ "qp_desc": "Some devices may not support Constant Bit Rate. For those devices, QP is used instead. Higher value means more compression, but less quality.", "qsv_coder": "QuickSync Coder (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", + "qsv_preset_fast": "fast (low quality)", + "qsv_preset_faster": "faster (lower quality)", "qsv_preset_medium": "medium (default)", "qsv_preset_slow": "slow (good quality)", "qsv_preset_slower": "slower (better quality)", diff --git a/src_assets/common/assets/web/public/assets/locale/en_GB.json b/src_assets/common/assets/web/public/assets/locale/en_GB.json index bc10222217..89f9d8e9ac 100644 --- a/src_assets/common/assets/web/public/assets/locale/en_GB.json +++ b/src_assets/common/assets/web/public/assets/locale/en_GB.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Always Send Scancodes", "always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.", "amd_coder": "AMF Coder (H264)", + "amd_coder_desc": "Allows you to select the entropy encoding to prioritize quality or encoding speed. H.264 only.", "amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", + "amd_enforce_hrd_desc": "Increases the constraints on rate control to meet HRD model requirements. This greatly reduces bitrate overflows, but may cause encoding artifacts or reduced quality on certain cards.", "amd_preanalysis": "AMF Preanalysis", + "amd_preanalysis_desc": "This enables rate-control preanalysis, which may increase quality at the expense of increased encoding latency.", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", + "amd_quality_desc": "This controls the balance between encoding speed and quality.", + "amd_quality_group": "AMF Quality Settings", "amd_quality_quality": "quality -- prefer quality", "amd_quality_speed": "speed -- prefer speed", "amd_rc": "AMF Rate Control", "amd_rc_cbr": "cbr -- constant bitrate", "amd_rc_cqp": "cqp -- constant qp mode", + "amd_rc_desc": "This controls the rate control method to ensure we are not exceeding the client bitrate target. 'cqp' is not suitable for bitrate targeting, and other options besides 'vbr_latency' depend on HRD Enforcement to help constrain bitrate overflows.", + "amd_rc_group": "AMF Rate Control Settings", "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (default)", "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", + "amd_usage_desc": "This sets the base encoding profile. All options presented below will override a subset of the usage profile, but there are additional hidden settings applied that cannot be configured elsewhere.", "amd_usage_lowlatency": "lowlatency - low latency (fast)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)", "amd_usage_transcoding": "transcoding -- transcoding (slowest)", "amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)", "amd_usage_webcam": "webcam -- webcam (slow)", "amd_vbaq": "AMF Variance Based Adaptive Quantization (VBAQ)", + "amd_vbaq_desc": "The human visual system is typically less sensitive to artifacts in highly textured areas. In VBAQ mode, pixel variance is used to indicate the complexity of spatial textures, allowing the encoder to allocate more bits to smoother areas. Enabling this feature leads to improvements in subjective visual quality with some content.", "apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.", "audio_sink": "Audio Sink", "audio_sink_desc_linux": "The name of the audio sink used for Audio Loopback. If you do not specify this variable, pulseaudio will select the default monitor device. You can find the name of the audio sink using either command:", diff --git a/src_assets/common/assets/web/public/assets/locale/en_US.json b/src_assets/common/assets/web/public/assets/locale/en_US.json index 6fa1f3a04c..37e0b41ee6 100644 --- a/src_assets/common/assets/web/public/assets/locale/en_US.json +++ b/src_assets/common/assets/web/public/assets/locale/en_US.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Always Send Scancodes", "always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.", "amd_coder": "AMF Coder (H264)", + "amd_coder_desc": "Allows you to select the entropy encoding to prioritize quality or encoding speed. H.264 only.", "amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", + "amd_enforce_hrd_desc": "Increases the constraints on rate control to meet HRD model requirements. This greatly reduces bitrate overflows, but may cause encoding artifacts or reduced quality on certain cards.", "amd_preanalysis": "AMF Preanalysis", + "amd_preanalysis_desc": "This enables rate-control preanalysis, which may increase quality at the expense of increased encoding latency.", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", + "amd_quality_desc": "This controls the balance between encoding speed and quality.", + "amd_quality_group": "AMF Quality Settings", "amd_quality_quality": "quality -- prefer quality", "amd_quality_speed": "speed -- prefer speed", "amd_rc": "AMF Rate Control", - "amd_rc_cbr": "cbr -- constant bitrate (default)", + "amd_rc_cbr": "cbr -- constant bitrate (recommended if HRD is enabled)", "amd_rc_cqp": "cqp -- constant qp mode", - "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate", + "amd_rc_desc": "This controls the rate control method to ensure we are not exceeding the client bitrate target. 'cqp' is not suitable for bitrate targeting, and other options besides 'vbr_latency' depend on HRD Enforcement to help constrain bitrate overflows.", + "amd_rc_group": "AMF Rate Control Settings", + "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (recommended if HRD is disabled; default)", "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", + "amd_usage_desc": "This sets the base encoding profile. All options presented below will override a subset of the usage profile, but there are additional hidden settings applied that cannot be configured elsewhere.", "amd_usage_lowlatency": "lowlatency - low latency (fastest)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)", "amd_usage_transcoding": "transcoding -- transcoding (slowest)", - "amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)", + "amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest; default)", "amd_usage_webcam": "webcam -- webcam (slow)", "amd_vbaq": "AMF Variance Based Adaptive Quantization (VBAQ)", + "amd_vbaq_desc": "The human visual system is typically less sensitive to artifacts in highly textured areas. In VBAQ mode, pixel variance is used to indicate the complexity of spatial textures, allowing the encoder to allocate more bits to smoother areas. Enabling this feature leads to improvements in subjective visual quality with some content.", "apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.", "audio_sink": "Audio Sink", "audio_sink_desc_linux": "The name of the audio sink used for Audio Loopback. If you do not specify this variable, pulseaudio will select the default monitor device. You can find the name of the audio sink using either command:", @@ -258,8 +267,8 @@ "qp_desc": "Some devices may not support Constant Bit Rate. For those devices, QP is used instead. Higher value means more compression, but less quality.", "qsv_coder": "QuickSync Coder (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", + "qsv_preset_fast": "fast (low quality)", + "qsv_preset_faster": "faster (lower quality)", "qsv_preset_medium": "medium (default)", "qsv_preset_slow": "slow (good quality)", "qsv_preset_slower": "slower (better quality)", diff --git a/src_assets/common/assets/web/public/assets/locale/es.json b/src_assets/common/assets/web/public/assets/locale/es.json index 5b119a9797..731fc4b499 100644 --- a/src_assets/common/assets/web/public/assets/locale/es.json +++ b/src_assets/common/assets/web/public/assets/locale/es.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Enviar siempre códigos de escaneo", "always_send_scancodes_desc": "Enviar códigos de escaneo mejora la compatibilidad con juegos y aplicaciones, pero puede resultar en una entrada de teclado incorrecta de ciertos clientes que no están usando una disposición de teclado en inglés de los Estados Unidos. Activar si la entrada de teclado no funciona en absoluto en ciertas aplicaciones. Desactivar si las claves del cliente están generando una entrada incorrecta en el host.", "amd_coder": "Codificador AMF (H264)", + "amd_coder_desc": "Le permite seleccionar la codificación entropía para priorizar la calidad o la velocidad de codificación. H.264 solamente.", "amd_enforce_hrd": "Aplicación del decodificador de referencia hipotético (HRD) AMF", + "amd_enforce_hrd_desc": "Aumenta las restricciones en el control de tasa para cumplir con los requisitos del modelo de HRD. Esto reduce en gran medida los desbordamientos de bitrate pero puede causar artefactos de codificación o menor calidad en ciertas tarjetas.", "amd_preanalysis": "Análisis previo de AMF", + "amd_preanalysis_desc": "Esto permite preanálisis de control de tarifas que puede aumentar la calidad a expensas de una mayor latencia de codificación.", "amd_quality": "Calidad AMF", "amd_quality_balanced": "balanceada -- balanceado (por defecto)", + "amd_quality_desc": "Controla el equilibrio entre la velocidad de codificación y la calidad.", + "amd_quality_group": "Ajustes de calidad AMF", "amd_quality_quality": "calidad -- Preferir calidad", "amd_quality_speed": "velocidad -- preferir velocidad", "amd_rc": "Control de tasa AMF", "amd_rc_cbr": "cbr -- velocidad de bits constante", "amd_rc_cqp": "cqp -- modo qp constante", + "amd_rc_desc": "Esto controla el método de control de tasa para asegurarse de que no estamos excediendo el objetivo de bitrate del cliente. 'cqp' no es apto para targeting, y otras opciones además de 'vbr_latency' dependen de HRD para ayudar a restringir los desbordamientos de bitrate .", + "amd_rc_group": "Ajustes de control de tasa AMF", "amd_rc_vbr_latency": "vbr_latency -- tasa de bits variable restringida por latencia (por defecto)", "amd_rc_vbr_peak": "vbr_peak -- tasa de bits variable restringida máxima", "amd_usage": "Uso de AMF", + "amd_usage_desc": "Establece el perfil de codificación base. Todas las opciones presentadas a continuación anularán un subconjunto del perfil de uso, pero hay opciones ocultas adicionales que no se pueden configurar en otros lugares.", "amd_usage_lowlatency": "baja latencia - baja latencia (la más rápida)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - baja latencia, alta calidad (rápido)", "amd_usage_transcoding": "transcodificación -- transcodificación (más lenta)", "amd_usage_ultralowlatency": "latencia ultra baja - latencia ultra baja (más rápida)", "amd_usage_webcam": "cámara web -- cámara web (lento)", "amd_vbaq": "Cuantización adaptativa basada en la varianza AMF (VBAQ)", + "amd_vbaq_desc": "El sistema visual humano normalmente es menos sensible a los artefactos en áreas altamente texturizadas. En modo VBAQ, la variación de píxeles se utiliza para indicar la complejidad de las texturas espaciales, permitiendo al codificador asignar más bits a áreas más suaves. Activar esta función conduce a mejoras en la calidad visual objetiva con algunos contenidos.", "apply_note": "Haga clic en 'Aplicar' para reiniciar Sunshine y aplicar los cambios. Esto terminará cualquier sesión en ejecución.", "audio_sink": "Salida de audio", "audio_sink_desc_linux": "El nombre de la salida de audio usado para Audio Loopback. Si no especifica esta variable, pulseaudio seleccionará el dispositivo de monitor predeterminado. Puede encontrar el nombre de la salida de audio usando cualquiera de los comandos:", @@ -258,7 +267,7 @@ "qp_desc": "Algunos dispositivos pueden no soportar tasa de bits constante. Para esos dispositivos, se utiliza QP en su lugar. Un valor más alto significa más compresión, pero menos calidad.", "qsv_coder": "Codificador QuickSync (H264)", "qsv_preset": "Preajuste QuickSync", - "qsv_preset_fast": "más rápido (menor calidad)", + "qsv_preset_fast": "rápido (baja calidad)", "qsv_preset_faster": "más rápido (menor calidad)", "qsv_preset_medium": "medio (por defecto)", "qsv_preset_slow": "lento (buena calidad)", @@ -324,7 +333,7 @@ "configuration": "Configuración", "home": "Inicio", "password": "Cambiar contraseña", - "pin": "Fijar", + "pin": "Pin", "troubleshoot": "Resolución de problemas" }, "password": { diff --git a/src_assets/common/assets/web/public/assets/locale/fr.json b/src_assets/common/assets/web/public/assets/locale/fr.json index 9d1559e32a..bdd8ad0c6d 100644 --- a/src_assets/common/assets/web/public/assets/locale/fr.json +++ b/src_assets/common/assets/web/public/assets/locale/fr.json @@ -1,6 +1,6 @@ { "_common": { - "apply": "Applique", + "apply": "Appliquer", "auto": "Automatique", "autodetect": "Détection automatique (recommandé)", "cancel": "Annuler", @@ -24,7 +24,7 @@ "apps": { "actions": "Actions", "add_cmds": "Ajouter des commandes", - "add_new": "Ajouter une nouvelle", + "add_new": "Ajouter une autre", "app_name": "Nom de l'application", "app_name_desc": "Nom de l'application, affiché dans Moonlight", "applications_desc": "Les applications ne sont actualisées qu'au redémarrage du client", @@ -92,24 +92,33 @@ "always_send_scancodes": "Toujours envoyer les codes de balayage", "always_send_scancodes_desc": "L'envoi de codes de numérisation améliore la compatibilité avec les jeux et les applications, mais peut entraîner une saisie incorrecte du clavier de certains clients qui n'utilisent pas de disposition de clavier anglais américain. Activer si l'entrée du clavier ne fonctionne pas du tout dans certaines applications. Désactiver si les clés du client génèrent la mauvaise entrée sur l'hôte.", "amd_coder": "Codeur AMF (H264)", + "amd_coder_desc": "Permet de sélectionner l'encodage de l'entropie pour prioriser la qualité ou la vitesse d'encodage. H.264 seulement.", "amd_enforce_hrd": "Enforcement du Décodeur Hypothetical Reference Decoder (HRD) de l'AMF", + "amd_enforce_hrd_desc": "Augmente les contraintes sur le contrôle du débit pour répondre aux exigences du modèle HRD. Cela réduit considérablement les débordements de débit, mais peut causer des artefacts d'encodage ou une qualité réduite sur certaines cartes.", "amd_preanalysis": "Pré-analyse AMF", + "amd_preanalysis_desc": "Cela permet une préanalyse de contrôle de débit, ce qui peut augmenter la qualité au détriment d'une latence d'encodage accrue.", "amd_quality": "Qualité AMF", "amd_quality_balanced": "balanced -- équilibré (par défaut)", + "amd_quality_desc": "Ceci contrôle l'équilibre entre la vitesse d'encodage et la qualité.", + "amd_quality_group": "Paramètres de qualité AMF", "amd_quality_quality": "qualité -- préférer la qualité", "amd_quality_speed": "Vitesse -- Préférez la vitesse", "amd_rc": "Contrôle du débit AMF", "amd_rc_cbr": "cbr -- débit constant", "amd_rc_cqp": "cqp -- mode constant qp", + "amd_rc_desc": "Ceci contrôle la méthode de contrôle du débit pour s'assurer que nous ne dépassons pas la cible du bitrate client. 'cqp' n'est pas adapté pour le ciblage de débit, et d'autres options en plus de 'vbr_latency' dépendent de HRD Enforcement pour aider à limiter les débordements de débit.", + "amd_rc_group": "Réglages de contrôle du débit AMF", "amd_rc_vbr_latency": "vbr_latency -- Débit variable limité de latence (par défaut)", "amd_rc_vbr_peak": "vbr_peak -- Débit variable contraint par le pic", "amd_usage": "Utilisation de l'AMF", + "amd_usage_desc": "Définit le profil d'encodage de base. Toutes les options présentées ci-dessous remplaceront un sous-ensemble du profil d'utilisation, mais il y a d'autres paramètres cachés qui ne peuvent pas être configurés ailleurs.", "amd_usage_lowlatency": "lowlatency - faible latence (rapide)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - faible latence, haute qualité (rapide)", "amd_usage_transcoding": "transcoding -- transcodage (plus lent)", "amd_usage_ultralowlatency": "ultralowlatency - latence ultra basse (plus rapide)", "amd_usage_webcam": "webcam -- webcam (lent)", "amd_vbaq": "Quantification adaptative basée sur la variance AMF (VBAQ)", + "amd_vbaq_desc": "Le système visuel humain est généralement moins sensible aux artefacts dans les zones hautement texturées. En mode VBAQ, la variance de pixels est utilisée pour indiquer la complexité des textures spatiales, ce qui permet à l'encodeur d'allouer plus de bits à des zones plus lisses. L'activation de cette fonctionnalité conduit à des améliorations de la qualité visuelle subjective avec un certain contenu.", "apply_note": "Cliquez sur \"Appliquer\" pour redémarrer Sunshine et appliquer les modifications. Cela mettra fin à toutes les sessions en cours.", "audio_sink": "Sink audio", "audio_sink_desc_linux": "Le nom du dissipateur audio utilisé pour la boucle audio. Si vous ne spécifiez pas cette variable, pulseaudio sélectionnera le périphérique de moniteur par défaut. Vous pouvez trouver le nom du dissipateur audio en utilisant l'une des commandes:", @@ -255,7 +264,7 @@ "port_warning": "Exposer l'interface Web à Internet est un risque de sécurité ! Procédez à vos propres risques !", "port_web_ui": "Interface Web", "qp": "Paramètre de quantification", - "qp_desc": "Certains périphériques peuvent ne pas prendre en charge le taux de bits constant. Pour ces périphériques, QP est utilisé à la place. Une valeur plus élevée signifie plus de compression, mais moins de qualité.", + "qp_desc": "Certains appareils peuvent ne pas prendre en charge un taux de bits constant. Pour ceux-ci, QP est utilisé à la place. Une valeur plus élevée signifie plus de compression, mais moins de qualité.", "qsv_coder": "Codeur QuickSync (H264)", "qsv_preset": "QuickSync Preset", "qsv_preset_fast": "plus rapide (qualité inférieure)", @@ -337,7 +346,7 @@ }, "pin": { "pair_failure": "Échec de l'appairage : Vérifiez si le code PIN est correctement saisi", - "pair_success": "Succès ! Veuillez vérifier la lumière de lune pour continuer", + "pair_success": "Succès ! Veuillez vérifier Moonlight pour continuer", "pin_pairing": "Appairage par code PIN", "send": "Envoyer", "warning_msg": "Assurez-vous que vous avez accès au client avec lequel vous appariez. Ce logiciel peut donner un contrôle total à votre ordinateur, alors soyez prudent !" diff --git a/src_assets/common/assets/web/public/assets/locale/it.json b/src_assets/common/assets/web/public/assets/locale/it.json index 25ee1c6bc2..de43dfbbd0 100644 --- a/src_assets/common/assets/web/public/assets/locale/it.json +++ b/src_assets/common/assets/web/public/assets/locale/it.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Invia sempre Scancode", "always_send_scancodes_desc": "L'invio di scancode migliora la compatibilità con i giochi e le applicazioni, ma può risultare in input da tastiera errati da alcuni client che non utilizzano un layout di inglese statunitense. Abilita se l' input della tastiera non funziona affatto in certe applicazioni. Disabilita se le chiavi del client generano l'input errato sull'host.", "amd_coder": "Coder AMF (H264)", + "amd_coder_desc": "Consente di selezionare la codifica dell'entropia per dare la priorità alla qualità o alla velocità di codifica. Solo H.264.", "amd_enforce_hrd": "Applicazione Decoder di Riferimento Ipotetico AMF (HRD)", + "amd_enforce_hrd_desc": "Aumenta i vincoli in materia di controllo della velocità per soddisfare i requisiti del modello HRD. Questo riduce notevolmente il bitrate overflow, ma può causare artefatti di codifica o qualità ridotta su determinate schede.", "amd_preanalysis": "Preanalisi AMF", + "amd_preanalysis_desc": "Ciò consente la preanalisi del controllo della velocità, che può aumentare la qualità a scapito di una maggiore latenza di codifica.", "amd_quality": "Qualità AMF", "amd_quality_balanced": "bilanciato -- bilanciato (predefinito)", + "amd_quality_desc": "Questo controlla l'equilibrio tra velocità di codifica e qualità.", + "amd_quality_group": "Impostazioni Qualità AMF", "amd_quality_quality": "qualità -- preferisce la qualità", "amd_quality_speed": "velocità -- preferisci la velocità", "amd_rc": "Controllo della Velocità AMF", "amd_rc_cbr": "cbr -- bitrate costante", "amd_rc_cqp": "cqp -- modalità qp costante", + "amd_rc_desc": "Questo controlla il metodo di controllo della velocità per garantire che non stiamo superando il target di bitrate client. 'cqp' non è adatto per il target di bitrate e altre opzioni oltre 'vbr_latency' dipendono dall'esecuzione HRD per aiutare a limitare i overflow di bitrate.", + "amd_rc_group": "Impostazioni Di Controllo Frequenza Amf", "amd_rc_vbr_latency": "vbr_latency -- bitrate variabile con vincoli di latenza", "amd_rc_vbr_peak": "vbr_peak -- bitrate variabile con vincoli di picco", "amd_usage": "Utilizzo AMF", + "amd_usage_desc": "Questo imposta il profilo di codifica di base. Tutte le opzioni presentate di seguito sovrascriveranno un sottoinsieme del profilo di utilizzo, ma ci sono ulteriori impostazioni nascoste applicate che non possono essere configurate altrove.", "amd_usage_lowlatency": "lowlatency - bassa latenza (più veloce)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - bassa latenza, alta qualità (veloce)", "amd_usage_transcoding": "transcoding -- transcodifica (più lenta)", "amd_usage_ultralowlatency": "ultralowlatency - latenza ultra bassa (più veloce)", "amd_usage_webcam": "webcam -- webcam (lento)", "amd_vbaq": "Quantizzazione Adattiva Basata Sulla Varianza AMF (VBAQ)", + "amd_vbaq_desc": "Il sistema visivo umano è tipicamente meno sensibile agli artefatti in aree altamente strutturate. In modalità VBAQ, la varianza di pixel è utilizzata per indicare la complessità delle texture spaziali, consentendo al codificatore di allocare più bit ad aree più fluide. Abilitare questa funzione porta a migliorare la qualità visiva soggettiva con alcuni contenuti.", "apply_note": "Fare clic su 'Applica' per applicare le modifiche e riavviare Sunshine. Questo terminerà qualsiasi sessione in esecuzione.", "audio_sink": "Uscita Audio", "audio_sink_desc_linux": "Il nome dell'uscita audio è utilizzato per il Loopback audio. Se non si specifica questa variabile, pulseaudio selezionerà il dispositivo predefinito. È possibile trovare il nome del'uscita audio utilizzando entrambi i comandi:", diff --git a/src_assets/common/assets/web/public/assets/locale/ja.json b/src_assets/common/assets/web/public/assets/locale/ja.json index 8777b770c2..fdbbac100d 100644 --- a/src_assets/common/assets/web/public/assets/locale/ja.json +++ b/src_assets/common/assets/web/public/assets/locale/ja.json @@ -6,10 +6,10 @@ "cancel": "キャンセル", "disabled": "無効", "disabled_def": "無効 (デフォルト)", - "do_cmd": "Do Command", - "elevated": "上昇", + "do_cmd": "コマンド実行", + "elevated": "昇格", "enabled": "有効", - "enabled_def": "有効 (既定)", + "enabled_def": "有効 (デフォルト)", "error": "エラー!", "note": "メモ:", "password": "パスワード", @@ -26,17 +26,17 @@ "add_cmds": "コマンドを追加", "add_new": "新規追加", "app_name": "アプリケーション名", - "app_name_desc": "アプリケーション名(Moonlight に示すように)", - "applications_desc": "アプリケーションはクライアントの再起動時にのみ更新されます", - "applications_title": "アプリケーション", - "auto_detach": "アプリケーションがすぐに終了すると、ストリーミングを続行します", - "auto_detach_desc": "これにより、別のプログラムまたはインスタンスを起動した後にすぐに閉じられるランチャー型アプリを自動的に検出しようとします。 ランチャータイプのアプリが検出されると、切り離したアプリとして扱われます。", - "cmd": "(Command)", - "cmd_desc": "メインアプリケーションを起動します。空白の場合はアプリケーションは起動しません。", + "app_name_desc": "アプリケーション名(Moonlight に表示させるもの)", + "applications_desc": "アプリケーション一覧はクライアントの再起動時にのみ更新されます", + "applications_title": "アプリケーション一覧", + "auto_detach": "アプリケーションが一瞬終了してもストリーミングを続行します", + "auto_detach_desc": "これにより、別のプログラムまたは別インスタンスを起動してすぐ終了する、ランチャー型アプリを自動的に検出しようとします。 ランチャータイプのアプリが検出されると、切断されたアプリとして扱われます。", + "cmd": "コマンド", + "cmd_desc": "起動したいメインアプリケーション。空白の場合はアプリケーションは起動しません。", "cmd_note": "コマンド実行ファイルへのパスにスペースが含まれている場合は、引用符で囲む必要があります。", - "cmd_prep_desc": "このアプリケーションの前後に実行するコマンドのリストです。prep-commandsのいずれかに失敗した場合、アプリケーションの起動は中止されます。", + "cmd_prep_desc": "このアプリケーションの前/後に実行するコマンドのリストです。prep-commandsのいずれかに失敗した場合、アプリケーションの起動は中止されます。", "cmd_prep_name": "コマンドの準備", - "covers_found": "カバーが見つかりました", + "covers_found": "カバー画像が見つかりました", "delete": "削除", "detached_cmds": "切り離されたコマンド", "detached_cmds_add": "別のコマンドを追加", @@ -47,35 +47,35 @@ "env_app_name": "アプリ名", "env_client_audio_config": "クライアントから要求されたオーディオ設定 (2.0/5.1/7.1)", "env_client_enable_sops": "クライアントは最適なストリーミングのためにゲームを最適化するオプションを要求しています (true/false)", - "env_client_fps": "クライアントから要求された FPS (int)", + "env_client_fps": "クライアントから要求された FPS (整数)", "env_client_gcmap": "要求されたゲームパッドマスク、ビットセット/ビットフィールド形式 (int)", "env_client_hdr": "HDR はクライアントによって有効になっています (true/false)", - "env_client_height": "The Height requested by the client (int)", - "env_client_host_audio": "The client has requested host audio (true/false)", + "env_client_height": "クライアントから要求された高さ (int)", + "env_client_host_audio": "クライアントはホストオーディオを要求しています (true/false)", "env_client_width": "クライアントから要求された幅 (int)", - "env_displayplacer_example": "例 - 解像度自動化の表示プレースホルダ:", - "env_qres_example": "例 - 自動解像度のQR:", - "env_qres_path": "qres path", + "env_displayplacer_example": "例 - 解像度自動化のためのディスプレイ プレーサ:", + "env_qres_example": "例 - 自動解像度用のQRes:", + "env_qres_path": "qresのパス", "env_var_name": "変数名", "env_vars_about": "環境変数について", "env_vars_desc": "すべてのコマンドはデフォルトでこれらの環境変数を取得します:", "env_xrandr_example": "例 - 解像度自動化のための Xrandr:", - "exit_timeout": "タイムアウト終了", - "exit_timeout_desc": "終了要求時にすべてのアプリプロセスが正常に終了するまで待機する秒数。 設定されていない場合、デフォルトは5秒まで待機します。ゼロまたは負の値に設定されている場合、アプリは直ちに終了します。", + "exit_timeout": "終了タイムアウト", + "exit_timeout_desc": "終了要求時にすべてのアプリプロセスが正常に終了するまで待機する秒数。 設定されていない場合、デフォルトでは5秒まで待機します。ゼロまたはマイナス値に設定されている場合、アプリは直ちに終了します。", "find_cover": "カバーを見つける", - "global_prep_desc": "このアプリケーションの Global Prep コマンドの実行を有効または無効にします。", + "global_prep_desc": "このアプリケーションのグローバル準備コマンドの実行を有効/無効にする。", "global_prep_name": "グローバル準備コマンド", "image": "画像", "image_desc": "クライアントに送信されるアプリケーションアイコン/画像/画像パス。画像はPNGファイルである必要があります。設定されていない場合、Sunshineはデフォルトのボックス画像を送信します。", "loading": "読み込み中...", "name": "名前", - "output_desc": "コマンドの出力が保存されているファイルが指定されていない場合、出力は無視されます。", + "output_desc": "コマンドの出力を保存するファイル。指定されない場合、出力は無視されます。", "output_name": "出力", "run_as_desc": "これは、管理者権限を必要とするアプリケーションが正常に動作するために必要な場合があります。", "wait_all": "すべてのアプリプロセスが終了するまでストリーミングを続ける", "wait_all_desc": "これは、アプリによって開始されたすべてのプロセスが終了するまで、ストリーミングを続けます。 チェックを外すと、他のアプリプロセスがまだ実行中であっても、最初のアプリプロセスが終了するとストリーミングは停止します。", "working_dir": "作業ディレクトリ", - "working_dir_desc": "プロセスに渡される作業ディレクトリ。たとえば、アプリケーションによっては、作業ディレクトリを使用して設定ファイルを検索します。 設定されていない場合、Sunshineはデフォルトでコマンドの親ディレクトリになります" + "working_dir_desc": "プロセスに渡される作業ディレクトリ。たとえば、アプリケーションによっては、作業ディレクトリを使用して設定ファイルを検索します。 設定されていない場合、Sunshineはデフォルトでコマンドの親ディレクトリを使用します。" }, "config": { "adapter_name": "アダプター名", @@ -92,25 +92,34 @@ "always_send_scancodes": "常にスキャンコードを送信する", "always_send_scancodes_desc": "スキャンコードを送信すると、ゲームやアプリとの互換性が向上しますが、米国英語のキーボードレイアウトを使用していない特定のクライアントからのキーボード入力が誤っている可能性があります。 特定のアプリケーションでキーボード入力がまったく動作しない場合に有効にします。 クライアントのキーがホストに間違った入力を生成している場合は無効にします。", "amd_coder": "AMFコーダー(H264)", + "amd_coder_desc": "エントロピーエンコーディングを選択して品質やエンコーディング速度を優先することができます。H.264 のみ。", "amd_enforce_hrd": "AMF仮説リファレンスデコーダ(HRD) Enforcement", - "amd_preanalysis": "AMFプレ分析", + "amd_enforce_hrd_desc": "HRDモデル要件を満たすためのレート制御の制約を増やします。 これによりビットレートのオーバーフローが大幅に減少しますが、エンコードアーティファクトや特定のカードの品質が低下する可能性があります。", + "amd_preanalysis": "AMF事前解析", + "amd_preanalysis_desc": "これにより、レート制御の事前分析が可能になり、エンコード待ち時間の増加を犠牲にして品質が向上する可能性があります。", "amd_quality": "AMF品質", "amd_quality_balanced": "balance-- balance(デフォルト)", + "amd_quality_desc": "これにより、エンコード速度と品質のバランスを制御します。", + "amd_quality_group": "AMF品質設定", "amd_quality_quality": "品質 -- 品質を優先", "amd_quality_speed": "スピード -- 速度を優先", "amd_rc": "AMFレート制御", - "amd_rc_cbr": "cbr -- 一定ビットレート(デフォルト)", - "amd_rc_cqp": "cqp -- 定数qp モード", - "amd_rc_vbr_latency": "vbr_lathering -- lattened variable bitrate", + "amd_rc_cbr": "cbr -- 固定ビットレート(デフォルト)", + "amd_rc_cqp": "cqp -- 固定qp モード", + "amd_rc_desc": "これは、クライアントのビットレート目標を超えないようにするレート制御方法を制御します。 'cqp'はビットレートターゲティングには適していません。'vbr_latency'以外のオプションはHRDエンフォースメントに依存してビットレートオーバーフローを制限します。", + "amd_rc_group": "AMFレートコントロール設定", + "amd_rc_vbr_latency": "vbr_latency -- レイテンシ制約付き可変ビットレート", "amd_rc_vbr_peak": "vbr_peak -- ピーク制約可変ビットレート", "amd_usage": "AMF使用率", + "amd_usage_desc": "これにより、基本エンコーディングプロファイルが設定されます。 以下に表示されるすべてのオプションは、使用状況プロファイルのサブセットを上書きしますが、他の場所では設定できない追加の非表示設定が適用されます。", "amd_usage_lowlatency": "lowlaterity - 低レイテンシ(最速)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - 低レイテンシ、高品質 (高速)", "amd_usage_transcoding": "トランスコード-- トランスコード(最も遅い)", "amd_usage_ultralowlatency": "超低レイテンシー - 超低レイテンシ(最速)", "amd_usage_webcam": "ウェブカメラ -- ウェブカメラ (スロー)", "amd_vbaq": "AMF分散ベース適応型量子化(VBAQ)", - "apply_note": "「適用」をクリックしてSunshineを再起動し、変更を適用します。これは実行中のセッションを終了します。", + "amd_vbaq_desc": "人間の視覚システムは、高度なテクスチャ領域の人工物には通常、あまり敏感です。 VBAQモードでは、ピクセル分散を使用して空間テクスチャの複雑さを示し、エンコーダがより多くのビットを割り当て、領域をスムーズにすることができます。 この機能を有効にすると、一部のコンテンツで主観的なビジュアル品質が向上します。", + "apply_note": "'適用' をクリックして Sunshine を再起動し、変更を適用します。これにより、実行中のセッションはすべて終了します。", "audio_sink": "音声シンク", "audio_sink_desc_linux": "オーディオループバックに使用されるオーディオシンクの名前。この変数を指定しない場合、pulseaudio はデフォルトのモニターデバイスを選択します。 いずれかのコマンドを使用して、オーディオシンクの名前を見つけることができます。", "audio_sink_desc_macos": "Audio Loopback に使用されるオーディオシンクの名前。Sunshineはシステムの制限により、macOSのマイクにのみアクセスできます。 Soundflower または BlackHole を使用してシステムのオーディオをストリーミングする。", @@ -123,22 +132,22 @@ "av1_mode_2": "SunshineはAV1メイン8ビットプロファイルのサポートを宣伝します", "av1_mode_3": "SunshineはAV1メイン8ビットと10ビット(HDR)プロファイルのサポートを宣伝します。", "av1_mode_desc": "クライアントがAV1 Main 8ビットまたは10ビットのビデオストリームを要求できるようにします。 AV1はエンコードにCPU負荷がかかるため、ソフトウェアエンコーディングを使用する際のパフォーマンスが低下する可能性があります。", - "back_button_timeout": "ホーム/ガイドボタンエミュレーションタイムアウト", - "back_button_timeout_desc": "指定したミリ秒単位で戻る/選択ボタンを押し続けると、ホーム/ガイドボタンの押下がエミュレートされます。 値 < 0(デフォルト)に設定されている場合、format@@0/format@@1ボタンを押し続けると、format@@2ボタンはエミュレートされません。", + "back_button_timeout": "ホーム/ガイドボタンエミュレーションのタイムアウト", + "back_button_timeout_desc": "Back/Selectボタンが指定されたミリ秒の間押し続けられると、Home/Guideボタン押下がエミュレートされる。値<0(デフォルト)に設定すると、Back/Selectボタンを押し続けてもHome/Guideボタンはエミュレートされない。", "capture": "特定のキャプチャ方法を強制する", - "capture_desc": "自動モードでSunshineは動作する最初のものを使用します. NvFBCはパッチを当てる必要があります nvidiaドライバ.", + "capture_desc": "自動モードでSunshineは動作する最初のものを使用します. NvFBCはパッチ済み nvidiaドライバが必要です.", "cert": "証明書", "cert_desc": "Web UIとMoonlightクライアントのペアリングに使用される証明書。互換性を確保するためには、RSA-2048 公開鍵が必要です。", - "channels": "接続済みクライアントの最大数", + "channels": "最大接続クライアント数", "channels_desc_1": "Sunshineは、単一のストリーミングセッションを複数のクライアントと同時に共有することができます。", "channels_desc_2": "一部のハードウェアエンコーダには、複数のストリームでパフォーマンスを低下させる制限がある場合があります。", "coder_cabac": "cabac -- コンテキスト適応二進数演算符号化 - 高品質", "coder_cavlc": "cavlc -- コンテキスト適応型可変長符号化 - 高速デコード", "configuration": "設定", - "controller": "Enable Gamepad Input", + "controller": "ゲームパッド入力を有効にする", "controller_desc": "ゲストがゲームパッド/コントローラーでホストシステムを制御できるようにします", "credentials_file": "資格情報ファイル", - "credentials_file_desc": "Sunshineの状態ファイルとは別に、ユーザー名/パスワードを保存します。", + "credentials_file_desc": "ユーザー名/パスワードは、サンシャインのステートファイルとは別に保管してください。", "ds4_back_as_touchpad_click": "戻る/選択をタッチパッドにマップする", "ds4_back_as_touchpad_click_desc": "DS4エミュレーションを強制するときは、戻る/選択をタッチパッドにマップする", "encoder": "特定のエンコーダーを強制する", @@ -148,12 +157,12 @@ "external_ip_desc": "外部IPアドレスが指定されていない場合、Sunshineは自動的に外部IPを検出します。", "fec_percentage": "FECの割合", "fec_percentage_desc": "各ビデオフレーム内のデータ パケットあたりのパケットを修正するエラー率。 より高い値は、ネットワークパケットの損失を増やすことができますが、帯域幅の使用量を増加させることができます。", - "ffmpeg_auto": "auto -- ffmpegで決める (デフォルト)", + "ffmpeg_auto": "auto -- ffmpegで判断する (デフォルト)", "file_apps": "アプリファイル", "file_apps_desc": "Sunshineの現在のアプリが保存されているファイル。", "file_state": "状態ファイル", "file_state_desc": "サンシャインの現在の状態が保存されているファイル", - "fps": "広告のFPS", + "fps": "通知されたFPS", "gamepad": "エミュレートしたゲームパッドのタイプ", "gamepad_auto": "自動選択オプション", "gamepad_desc": "ホスト上でエミュレートするゲームパッドの種類を選択します", @@ -217,7 +226,7 @@ "nvenc_preset_7": "(最も遅い)", "nvenc_preset_desc": "数値が高いほど、符号化遅延の増加を犠牲にして圧縮(一定のビットレートでの品質)が向上します。 ネットワークまたはデコーダによって制限されている場合にのみ変更することをお勧めします, そうでなければ、ビットレートを増やすことによって、同様の効果を達成することができます.", "nvenc_realtime_hags": "ハードウェアアクセラレーションGPUスケジューリングでリアルタイム優先度を使用する", - "nvenc_realtime_hags_desc": "現在、NVIDIAドライバは、HAGSが有効になっている場合、エンコーダでフリーズすることがあり、リアルタイムの優先度が使用され、VRAMの使用率が最大に近い場合があります。 このオプションを無効にすると、GPUが大量にロードされた際のキャプチャパフォーマンスが低下するため、フリーズの優先度が高くなります。", + "nvenc_realtime_hags_desc": "現在、NVIDIAドライバは、HAGSが有効で、リアルタイムプライオリティが使用され、VRAM使用率が最大に近い場合、エンコーダでフリーズすることがあります。このオプションを無効にすると、優先順位が高に下がり、GPUに大きな負荷がかかったときのキャプチャパフォーマンスの低下と引き換えに、フリーズを回避できます。", "nvenc_spatial_aq": "Spatial AQ", "nvenc_spatial_aq_desc": "より高いQP値をビデオのフラットリージョンに割り当てます。低ビットレートでストリーミングする際に有効にすることをお勧めします。", "nvenc_spatial_aq_disabled": "無効 (高速、デフォルト)", @@ -239,7 +248,7 @@ "output_name_linux": "モニター番号", "output_name_win": "出力名", "ping_timeout": "Pingのタイムアウト", - "ping_timeout_desc": "月明かりからのデータがストリームをシャットダウンするまでのミリ秒単位で待機する期間", + "ping_timeout_desc": "Moonlightがデータが止まってからストリームをシャットダウンするまで待機時間をミリ秒で指定", "pkey": "プライベートキー", "pkey_desc": "ウェブ UI とMoonlight クライアントのペアリングに使用される秘密鍵。互換性を確保するためには、RSA-2048 秘密鍵を使用する必要があります。", "port": "ポート", @@ -324,7 +333,7 @@ "configuration": "設定", "home": "ホーム", "password": "パスワードの変更", - "pin": "ピン留めする", + "pin": "Pin", "troubleshoot": "トラブルシューティング" }, "password": { @@ -337,10 +346,10 @@ }, "pin": { "pair_failure": "ペアリングに失敗しました:PINが正しく入力されたかどうかを確認します", - "pair_success": "成功!ムーンライトを確認して続行してください", + "pair_success": "成功!Moonlight を確認して続行してください", "pin_pairing": "PIN Pairing", "send": "送信", - "warning_msg": "ペアリングしているクライアントへのアクセス権を持っていることを確認してください。このソフトウェアはコンピュータに完全な制御を与えることができます。注意してください!" + "warning_msg": "ペアリングするクライアントにアクセスできることを確認してください。このソフトウェアは、あなたのコンピュータを完全にコントロールすることができますので、注意してください!" }, "resource_card": { "github_discussions": "GitHub Discussions", diff --git a/src_assets/common/assets/web/public/assets/locale/pt.json b/src_assets/common/assets/web/public/assets/locale/pt.json new file mode 100644 index 0000000000..ee23a8933d --- /dev/null +++ b/src_assets/common/assets/web/public/assets/locale/pt.json @@ -0,0 +1,389 @@ +{ + "_common": { + "apply": "Aplicar", + "auto": "Automático", + "autodetect": "Autodetectar (recomendado)", + "cancel": "cancelar", + "disabled": "Desabilitado", + "disabled_def": "Desativado (padrão)", + "do_cmd": "Faça o Comando", + "elevated": "Elevado", + "enabled": "Ativado", + "enabled_def": "Ativado (padrão)", + "error": "Erro!", + "note": "Nota:", + "password": "Palavra-passe", + "run_as": "Executar como Administrador", + "save": "Guardar", + "see_more": "Ver mais", + "success": "Sucesso!", + "undo_cmd": "Desfazer Comando", + "username": "Usuário:", + "warning": "Aviso!" + }, + "apps": { + "actions": "Ações.", + "add_cmds": "Adicionar Comandos", + "add_new": "Adicionar novo", + "app_name": "Nome da aplicação", + "app_name_desc": "Nome do aplicativo, como mostrado no Moonlight", + "applications_desc": "Aplicações só são atualizadas quando o Cliente for reiniciado", + "applications_title": "Aplicações", + "auto_detach": "Continue transmitindo se o aplicativo fechar rapidamente", + "auto_detach_desc": "Isso tentará detectar automaticamente aplicativos de tipo launcher que fecham rapidamente após a inicialização de outro programa ou instância de si mesmos. Quando um aplicativo de tipo launcher é detectado, ele é tratado como um aplicativo destacado.", + "cmd": "Comando", + "cmd_desc": "O aplicativo principal a ser iniciado. Se em branco, nenhum aplicativo será iniciado.", + "cmd_note": "Se o caminho para o comando conter espaços, você deve colocá-lo entre aspas.", + "cmd_prep_desc": "Uma lista de comandos a serem executados antes / depois desta aplicação. Se algum dos comandos de predefinição falhar, iniciar o aplicativo é abortado.", + "cmd_prep_name": "Preparações do Comando", + "covers_found": "Capas encontradas", + "delete": "excluir", + "detached_cmds": "Comandos desanexados", + "detached_cmds_add": "Adicionar Comando Desanexado", + "detached_cmds_desc": "Uma lista de comandos a serem executados em segundo plano.", + "detached_cmds_note": "Se o caminho para o comando conter espaços, você deve colocá-lo entre aspas.", + "edit": "Alterar", + "env_app_id": "ID do aplicativo", + "env_app_name": "Nome do aplicativo", + "env_client_audio_config": "A configuração de áudio solicitada pelo cliente (2.0/5.1/7.1)", + "env_client_enable_sops": "O cliente solicitou a opção de otimizar o jogo para uma transmissão ideal (verdadeiro/falso)", + "env_client_fps": "O FPS solicitado pelo cliente (int)", + "env_client_gcmap": "A máscara de gamepad solicitada, em formato bitset/bitfield (int)", + "env_client_hdr": "O HDR está ativado pelo cliente (verdadeiro/falso)", + "env_client_height": "A altura solicitada pelo cliente (int)", + "env_client_host_audio": "O cliente solicitou áudio de host (verdadeiro/falso)", + "env_client_width": "A largura solicitada pelo cliente (int)", + "env_displayplacer_example": "Exemplo - displayplacer para Automação de Resolução:", + "env_qres_example": "Exemplo - QRes para Automação de Resolução:", + "env_qres_path": "Caminho das configurações rápidas", + "env_var_name": "Nome da Var", + "env_vars_about": "Sobre Variáveis de Ambiente", + "env_vars_desc": "Todos os comandos obtêm essas variáveis de ambiente por padrão:", + "env_xrandr_example": "Exemplo - Xrandr para Automação de Resolução:", + "exit_timeout": "Tempo Esgotado", + "exit_timeout_desc": "Número de segundos para esperar que todos os processos do aplicativo saiam graciosamente quando solicitado a sair. Se não definido, o padrão é esperar até 5 segundos. Se definido como zero ou negativo, o aplicativo será encerrado imediatamente.", + "find_cover": "Encontrar capa", + "global_prep_desc": "Ativar/desativar a execução de comandos de preparação global para este aplicativo.", + "global_prep_name": "Comandos de Preparação Global", + "image": "Imagem:", + "image_desc": "Caminho da aplicação icon/imagem/imagem que será enviado para o cliente. Imagem deve ser um arquivo PNG. Se não estiver definido, Sunshine irá enviar a imagem da caixa padrão.", + "loading": "Carregandochar@@0", + "name": "Nome:", + "output_desc": "O arquivo onde a saída do comando é armazenada, se não for especificado, a saída é ignorada", + "output_name": "Saída", + "run_as_desc": "Isto pode ser necessário para que alguns aplicativos que requerem permissões de administrador sejam executados corretamente.", + "wait_all": "Continue transmitindo até que todos os processos de app saiam", + "wait_all_desc": "Isso continuará transmitindo até que todos os processos iniciados pelo aplicativo tenham sido encerrados. Quando desmarcado, a transmissão será interrompida quando o processo inicial do aplicativo terminar, mesmo que outros processos de aplicativo ainda estejam em execução.", + "working_dir": "Diretório de trabalho", + "working_dir_desc": "O diretório de trabalho que deve ser passado para o processo. Por exemplo, alguns aplicativos usam o diretório de trabalho para procurar arquivos de configuração. Se não estiver definido, o Sunshine será o padrão para o diretório pai do comando" + }, + "config": { + "adapter_name": "Nome do adaptador", + "adapter_name_desc_linux_1": "Especifique manualmente uma GPU para usar na captura.", + "adapter_name_desc_linux_2": "para encontrar todos os dispositivos capazes do VAAPI", + "adapter_name_desc_linux_3": "Substitua ``renderD129`` pelo dispositivo de cima para listar o nome e os recursos do dispositivo. Para ser apoiado pelo Sol, ele precisa ter no mínimo:", + "adapter_name_desc_win": "Especifique manualmente uma GPU para usar na captura. Se não definido, a GPU é escolhida automaticamente. É altamente recomendável deixar este campo em branco para usar a seleção GPU automática! Nota: Esta GPU deve ter um display conectado e ligado. Os valores apropriados podem ser encontrados usando o seguinte comando:", + "adapter_name_placeholder_win": "Radeon série RX 580", + "add": "Adicionar", + "address_family": "Família de endereços", + "address_family_both": "IPv6 + IPv6", + "address_family_desc": "Definir a família de endereços usada pelo Sunshine", + "address_family_ipv4": "Apenas IPv4", + "always_send_scancodes": "Sempre enviar Scancodes", + "always_send_scancodes_desc": "O envio de códigos de verificação melhora a compatibilidade com jogos e aplicativos, mas pode resultar em uma entrada incorreta de teclado de certos clientes que não estão usando um layout de teclado inglês dos EUA. Habilitar se a entrada de teclado não estiver funcionando em certas aplicações. Desative se as chaves no cliente estão gerando a entrada errada no host.", + "amd_coder": "Codificador AMF (H264)", + "amd_coder_desc": "Permite que você selecione a codificação entropia para priorizar a qualidade ou a velocidade de codificação. Somente H.264.", + "amd_enforce_hrd": "Aplicação de Decodificador de Referência Hipotetica (HRD) AMF", + "amd_enforce_hrd_desc": "Aumenta as restrições de controle de taxa para atender aos requisitos do modelo de hash. Isso reduz consideravelmente os transbordos de bitrato, mas pode causar a codificação de artefatos ou uma redução de qualidade em certas cartas.", + "amd_preanalysis": "Pré-análise AMF", + "amd_preanalysis_desc": "Isto permite a pré-análise de controle, que pode aumentar a qualidade em detrimento de uma maior latência de codificação.", + "amd_quality": "Qualidade AMF", + "amd_quality_balanced": "Balanceado - balanceado (padrão)", + "amd_quality_desc": "Isto controla o equilíbrio entre a velocidade de codificação e a qualidade.", + "amd_quality_group": "Configurações de qualidade AMF", + "amd_quality_quality": "qualidade -- preferir qualidade", + "amd_quality_speed": "velocidade -- preferir velocidade", + "amd_rc": "Controle de Taxa AMF", + "amd_rc_cbr": "cbr -- taxa de bits constante (padrão)", + "amd_rc_cqp": "cqp -- modo qp constante", + "amd_rc_desc": "Isto controla o método de controle da taxa para garantir que não estamos a exceder o alvo da taxa de bits do cliente. 'cqp' não é adequado para segmentação de taxa de bits e outras opções além de 'vbr_latency' dependem da aplicação HRD para ajudar a restringir os fluxos de taxa de bits.", + "amd_rc_group": "Configurações de controle de taxa AMF", + "amd_rc_vbr_latency": "latência vbr_ency -- taxa de bits com restrição de latência", + "amd_rc_vbr_peak": "vbr_pico -- pico de taxa de bits variável restrita", + "amd_usage": "Uso do AMF", + "amd_usage_desc": "Isso define o perfil de codificação base. Todas as opções apresentadas abaixo substituirão um subconjunto do perfil de uso, mas há configurações ocultas adicionais aplicadas que não podem ser configuradas em outro lugar.", + "amd_usage_lowlatency": "baixa latência - baixa latência (mais rápido)", + "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - baixa latência, alta qualidade (rápido)", + "amd_usage_transcoding": "transcodificação -- transcodificando (mais lento)", + "amd_usage_ultralowlatency": "ultralowlatência - latência ultra baixa (mais rápida)", + "amd_usage_webcam": "webcam -- câmera (lenta)", + "amd_vbaq": "Variação da Variação Baseada na Quantização Adaptativa (VBAQ)", + "amd_vbaq_desc": "O sistema visual humano é tipicamente menos sensível a artefatos em áreas altamente texturadas. No modo VBAQ, a variação de pixel é usada para indicar a complexidade das texturas espaciais, permitindo que o codificador aloce mais bits em áreas mais suaves. Habilitar este recurso leva a melhorias na qualidade visual subjetiva com algum conteúdo.", + "apply_note": "Clique em 'Aplicar' para reiniciar o Sunshine e aplicar as alterações. Isto encerrará todas as sessões em execução.", + "audio_sink": "Pia de Áudio", + "audio_sink_desc_linux": "O nome do afundamento de áudio usado para o loop de áudio. Se você não especificar esta variável, o pulseaudio selecionará o dispositivo de monitor padrão. Você pode encontrar o nome do sumidouro de áudio usando qualquer comando:", + "audio_sink_desc_macos": "O nome do sumidouro de áudio usado para o loop de áudio. O Sunshine só pode acessar microfones no macOS devido a limitações do sistema. Para fazer streaming de áudio do sistema usando Soundflower ou BlackHole.", + "audio_sink_desc_win": "Especifique manualmente um dispositivo de áudio específico para capturar. Se não for definido, o dispositivo será escolhido automaticamente. Recomendamos fortemente deixar este campo em branco para usar a seleção automática de dispositivo! Se você tiver vários dispositivos de áudio com nomes idênticos, você pode obter o ID do dispositivo usando o seguinte comando:", + "audio_sink_placeholder_macos": "BlackHole 2ch", + "audio_sink_placeholder_win": "Alto-falantes (Dispositivo de Áudio de Alta Definição)", + "av1_mode": "Suporte AV1", + "av1_mode_0": "O Sunshine anunciará o suporte para a AV1 com base nos recursos do codificador (recomendado)", + "av1_mode_1": "O sol não anunciará o suporte para a AV1", + "av1_mode_2": "O Sunshine anunciará o suporte para o perfil AV1 de 8 bits", + "av1_mode_3": "A luz do sol anunciará o suporte para os perfis AV1 (8-bit principal) e de 10 bits (HDR)", + "av1_mode_desc": "Permite ao cliente solicitar fluxos de vídeo AV1 principal de 8 bits ou de 10 bits. AV1 usa mais CPU para codificar, então permite que isso reduza o desempenho ao usar a codificação do software.", + "back_button_timeout": "Tempo de Emulação do Botão Home/Guia", + "back_button_timeout_desc": "Se o botão Voltar / Selecionar for mantido pressionado para o número especificado de milissegundos, um botão Home/Guia será pressionado. Se definido como um valor < 0 (padrão), segurar o botão Voltar/Selecionar não irá simular o botão Home/Guia.", + "capture": "Forçar um Método de Captura Específica", + "capture_desc": "Modo automático Sunshine usará o primeiro que funciona. NvFBC requer drivers nvidia corrigidos.", + "cert": "Certificado", + "cert_desc": "O certificado usado para a interface do usuário da web e o pareamento do cliente Moonlight. Para a melhor compatibilidade, isso deve ter uma chave pública RSA-2048.", + "channels": "Máximo de Clientes Conectados", + "channels_desc_1": "Sunshine pode permitir que uma única sessão de streaming seja compartilhada com vários clientes simultaneamente.", + "channels_desc_2": "Alguns codificadores de hardware podem ter limitações que reduzem o desempenho com vários fluxos.", + "coder_cabac": "cabac -- contexto adaptável de programação aritmética binária - qualidade superior", + "coder_cavlc": "cavlc -- código adaptável de comprimento de variável de contexto - decodificação mais rápida", + "configuration": "Configuração", + "controller": "Enable Gamepad Input", + "controller_desc": "Permite que os convidados controlem o sistema de host com controle / controle do gamepad", + "credentials_file": "Arquivo de credenciais", + "credentials_file_desc": "Armazenar Usuário/Senha separadamente do arquivo de estado da Sunshine.", + "ds4_back_as_touchpad_click": "Mapear Voltar/Selecionar para o Touchpad Clique", + "ds4_back_as_touchpad_click_desc": "Ao forçar a emulação do DS4, selecione um Voltar/Selecione para o Touchpad Clique", + "encoder": "Forçar um Codificador Específico", + "encoder_desc": "Força um codificador específico, caso contrário, Sunshine selecionará a melhor opção disponível. Nota: Se você especificar um codificador de hardware no Windows, ele deve coincidir com a GPU onde a tela está conectada.", + "encoder_software": "Software", + "external_ip": "IP externo", + "external_ip_desc": "Se nenhum endereço IP externo for dado, Sunshine detectará automaticamente IP externo", + "fec_percentage": "Porcentagem FEC", + "fec_percentage_desc": "Porcentagem de erro corrigindo pacotes por pacote de dados em cada quadro de vídeo. Valores mais altos podem corrigir para mais perda de pacotes de rede, mas ao custo de aumentar o uso de largura de banda.", + "ffmpeg_auto": "auto -- let ffmpeg decide (padrão)", + "file_apps": "Arquivo de apps", + "file_apps_desc": "O arquivo onde os aplicativos atuais de Sunshine são armazenados.", + "file_state": "Arquivo de estado", + "file_state_desc": "O arquivo onde o estado atual de Sunshine é armazenado", + "fps": "FPS anunciado", + "gamepad": "Tipo de controle emulado", + "gamepad_auto": "Opções de seleção automáticas", + "gamepad_desc": "Escolha qual tipo de controle será emulado no host", + "gamepad_ds4": "DS4 (PS4)", + "gamepad_manual": "Opções de DS4 manual", + "gamepad_x360": "X360 (Xbox 360)", + "global_prep_cmd": "Preparações do Comando", + "global_prep_cmd_desc": "Configure uma lista de comandos a serem executados antes ou depois de executar qualquer aplicativo. Se algum dos comandos de preparação especificados falhar, o processo de lançamento do aplicativo será abortado.", + "hevc_mode": "Suporte ao HEVC", + "hevc_mode_0": "Sunshine anunciará suporte para o HEVC com base em recursos de codificador (recomendado)", + "hevc_mode_1": "O sol não anunciará o suporte ao HEVC", + "hevc_mode_2": "O sol anunciará o suporte para o perfil principal do HEVC", + "hevc_mode_3": "A luz do sol anunciará o suporte para os perfis HEVC Main e Main10 (HDR)", + "hevc_mode_desc": "Permite ao cliente solicitar fluxos de vídeo HEVC principal ou HEVC Main10. HEVC é mais intenso em CPU para codificar, então permitir que isso possa reduzir o desempenho ao usar a codificação do software.", + "high_resolution_scrolling": "Suporte a Alta Resolução", + "high_resolution_scrolling_desc": "Quando habilitado, o Sunshine irá passar através de eventos de rolagem de alta resolução a partir de clientes de luz Lunar. Isso pode ser útil para desativar para aplicativos mais antigos que rolam muito rápido com eventos de rolagem de alta resolução.", + "install_steam_audio_drivers": "Instalar drivers de áudio Steam", + "install_steam_audio_drivers_desc": "Se o Steam estiver instalado, isso irá instalar automaticamente o driver de Alto-falantes de Streaming do Steam para suportar o som Surround 5.1/7.1 e silenciar o áudio do host.", + "key_repeat_delay": "Atraso da repetição da chave", + "key_repeat_delay_desc": "Controla a rapidez com que as teclas se irão repetir. O atraso inicial em milissegundos antes de repetir as chaves.", + "key_repeat_frequency": "Frequência de repetição de chave", + "key_repeat_frequency_desc": "Com que frequência as chaves se repetem a cada segundo. Esta opção configurável suporta decimais.", + "key_rightalt_to_key_win": "Tecla Alt Right Map para a tecla Windows", + "key_rightalt_to_key_win_desc": "É possível que você não possa enviar diretamente a chave Windows do Moonlight. Nesses casos, pode ser útil fazer Sunshine pensar que a tecla Alt direita é a tecla Windows", + "keyboard": "Habilitar Entrada de Teclado", + "keyboard_desc": "Permite aos convidados controlar o sistema de host com o teclado", + "lan_encryption_mode": "Modo de Criptografia LAN", + "lan_encryption_mode_1": "Habilitado para clientes suportados", + "lan_encryption_mode_2": "Obrigatório para todos os clientes", + "lan_encryption_mode_desc": "Isso determina quando a criptografia será usada no streaming em sua rede local. A criptografia pode reduzir o desempenho do streaming, particularmente em hosts e clientes menos poderosos.", + "locale": "Localidade", + "locale_desc": "A localidade usada para a interface de usuário do Sunshine.", + "log_level": "Nível do Registro", + "log_level_0": "Verbose", + "log_level_1": "Debug", + "log_level_2": "Informações", + "log_level_3": "ATENÇÃO", + "log_level_4": "ERRO", + "log_level_5": "Fatal", + "log_level_6": "Nenhuma", + "log_level_desc": "O nível mínimo de log impresso no padrão", + "log_path": "Caminho do Logfile", + "log_path_desc": "O arquivo onde os logs atuais de Sunshine são armazenados.", + "min_threads": "Contagem mínima de tópicos da CPU", + "min_threads_desc": "Aumentar o valor reduz ligeiramente a eficiência da codificação, mas a troca geralmente vale a pena para ganhar o uso de mais núcleos da CPU para codificação. O valor ideal é o mais baixo que pode codificar, de forma confiável, as configurações de streaming desejadas no seu hardware.", + "misc": "Opções diversas", + "motion_as_ds4": "Emular um gamepad DS4 se o cliente reportar sensores de movimento estiverem presentes", + "motion_as_ds4_desc": "Se desativado, os sensores de movimento não serão tidos em conta durante a seleção de tipo gamepad", + "mouse": "Habilitar Entrada do Mouse", + "mouse_desc": "Permite aos convidados controlar o sistema de host com o mouse", + "native_pen_touch": "Suporte nativo para Pen/Toque", + "native_pen_touch_desc": "Quando ativado, o Sunshine irá passar por eventos nativos de caneta/toque de clientes de lua. Isto pode ser útil para desativar aplicações mais antigas sem o suporte nativo ao canal/toque.", + "nvenc_h264_cavlc": "Preferir CAVLC ao CABAC no H.264", + "nvenc_h264_cavlc_desc": "Forma simples de codificação de entrope. CAVLC precisa de cerca de 10% mais bitrate para a mesma qualidade. Somente relevante para dispositivos de decodificação realmente antigos.", + "nvenc_latency_over_power": "Prefere latência de codificação inferior sobre economia de energia", + "nvenc_latency_over_power_desc": "O Sunshine solicita o máximo de velocidade de relógio com GPU durante a transmissão, para reduzir a latência de codificação. Desativação não é recomendado, uma vez que isso pode levar a um aumento significativo da latência de codificação.", + "nvenc_opengl_vulkan_on_dxgi": "Apresentar OpenGL/Vulkan em cima de DXGI", + "nvenc_opengl_vulkan_on_dxgi_desc": "O Sunshine não pode capturar programas OpenGL e Vulkan de tela cheia a uma taxa de quadros completa, a menos que eles apresentem em cima do DXGI. Essa configuração é de todo o sistema que é revertida na saída sunshine do programa.", + "nvenc_preset": "Predefinição de desempenho", + "nvenc_preset_1": "(mais rápido, padrão)", + "nvenc_preset_7": "(mais lento)", + "nvenc_preset_desc": "Valores maiores melhoram a compressão (qualidade em taxa de bits dada) ao custo de maior latência de codificação. Recomendado para mudar apenas quando limitado por rede ou descodificador, caso contrário, o efeito semelhante pode ser alcançado aumentando a taxa de bits.", + "nvenc_realtime_hags": "Use prioridade em tempo real em agendamento de gpu acelerado por hardware", + "nvenc_realtime_hags_desc": "Atualmente os motoristas da NVIDIA podem congelar no codificador quando o HAGS estiver ativado, a prioridade em tempo real é usada e a utilização da VRAM está próxima do máximo. Desabilitar esta opção reduz a prioridade ao alto, contornando o congelamento ao custo de desempenho reduzido quando a GPU está fortemente carregada.", + "nvenc_spatial_aq": "Spatial AQ", + "nvenc_spatial_aq_desc": "Atribuir valores mais elevados de QP a regiões planas do vídeo. Recomendado para permitir o streaming em taxas de bits mais baixas.", + "nvenc_spatial_aq_disabled": "Desativado (mais rápido, padrão)", + "nvenc_spatial_aq_enabled": "Ativado (mais lento)", + "nvenc_twopass": "Modo de duas passagens", + "nvenc_twopass_desc": "Adiciona passe de codificação preliminar. Isso permite detectar mais vetores de movimento, distribuir melhor a taxa de bits pelo quadro e aderir de forma mais rigorosa aos limites de bits. Desabilitar não é recomendado uma vez que isso pode levar a uma superação de bits ocasional e a perda de pacotes subsequentes.", + "nvenc_twopass_disabled": "Desativado (mais rápido, não recomendado)", + "nvenc_twopass_full_res": "Resolução completa (mais lento)", + "nvenc_twopass_quarter_res": "Resolução de trimestre (mais rápido, padrão)", + "nvenc_vbv_increase": "Porcentagem de VBV/HRD de Um-frame", + "nvenc_vbv_increase_desc": "Por padrão, o sunshine usa um simples frame VBV/HRD, o que significa que qualquer tamanho de quadro de vídeo codificado não é esperado exceder a bitrate solicitada dividida pela taxa de quadros solicitada. Relaxar esta restrição pode ser benéfico e agir como taxa de bits variável de baixa latência, mas também pode levar à perda de pacotes se a rede não tiver espaço de armazenamento para manipular espinhos de taxa de bits. O valor máximo aceito é 400, o que corresponde a 5x de aumento no limite máximo do quadro de vídeo codificado.", + "origin_web_ui_allowed": "Interface de Origem Web Permitida", + "origin_web_ui_allowed_desc": "A origem do endereço do endpoint remoto que não é negado o acesso à Web UI", + "origin_web_ui_allowed_lan": "Somente aqueles em LAN podem acessar a interface Web", + "origin_web_ui_allowed_pc": "Somente localhost pode acessar a Web UI", + "origin_web_ui_allowed_wan": "Alguém pode acessar a interface web", + "output_name_desc_linux": "Durante a inicialização do sol, você deve ver a lista de monitores detectados. Você precisa usar o valor antes do dois-pontos na saída. Por exemplo:", + "output_name_desc_win": "Especifique manualmente um display a ser usado para captura. Se não for definido, o display primário é capturado. Nota: Se você especificou uma GPU acima, essa tela deve estar conectada à GPU. Os valores apropriados podem ser encontrados usando o seguinte comando:", + "output_name_linux": "Número de monitor", + "output_name_win": "Nome da saída", + "ping_timeout": "Tempo limite", + "ping_timeout_desc": "Quanto tempo esperar em milissegundos por dados do luar antes de desligar o fluxo", + "pkey": "Chave Privada", + "pkey_desc": "A chave privada usada para a interface do usuário da web e o pareamento do cliente Moonlight. Para a melhor compatibilidade, esta deve ser uma chave privada RSA-2048.", + "port": "Porta", + "port_alert_1": "O sol não pode usar portas abaixo de 1024!", + "port_alert_2": "Portas acima de 65535 não estão disponíveis!", + "port_desc": "Definir a família dos portos usados pelo Sunshine", + "port_http_port_note": "Use esta porta para conectar com o Luar.", + "port_note": "Observação", + "port_port": "Porta", + "port_protocol": "Protocol", + "port_tcp": "TCP", + "port_udp": "UDP", + "port_warning": "Expor a interface da web à internet é um risco de segurança! Proceda por sua própria conta e risco!", + "port_web_ui": "Web UI", + "qp": "Parâmetro de Quantização", + "qp_desc": "Alguns dispositivos podem não suportar Taxa de Bits Constante. Para esses dispositivos, QP é usado. Valores maiores significam mais compressão, mas menos qualidade.", + "qsv_coder": "Programador QuickSync (H264)", + "qsv_preset": "QuickSync Preset", + "qsv_preset_fast": "rápido (baixa qualidade)", + "qsv_preset_faster": "mais rápido (menor qualidade)", + "qsv_preset_medium": "médio (padrão)", + "qsv_preset_slow": "lento (boa qualidade)", + "qsv_preset_slower": "mais lento (melhor qualidade)", + "qsv_preset_slowest": "mais lento (melhor qualidade)", + "qsv_preset_veryfast": "mais rápido (menor qualidade)", + "qsv_slow_hevc": "Permitir codificação lenta do HEVC", + "qsv_slow_hevc_desc": "Isto pode habilitar a codificação HEVC em GPUs mais antigas, ao custo de maior uso da GPU e pior desempenho.", + "res_fps_desc": "Os modos de exibição anunciados pelo Sol. Algumas versões do Moonlight, como Moonlight-nx (Switch), dependem destas listas para garantir que as resoluções e fugas solicitadas sejam apoiadas. Esta configuração não altera a forma como o fluxo de tela é enviado para o Moonlight.", + "resolutions": "Resoluções anunciadas", + "restart_note": "O sol está reiniciando para aplicar mudanças.", + "sunshine_name": "Nome do Sol", + "sunshine_name_desc": "O nome exibido pela luz da lua. Se não for especificado, o nome do host do PC é usado", + "sw_preset": "Predefinições SW", + "sw_preset_desc": "Otimize a troca entre a velocidade de codificação (quadros codificados por segundo) e a eficiência de compressão (qualidade por bit no bitstream). O padrão é super rápido.", + "sw_preset_fast": "rápido", + "sw_preset_faster": "mais rápido", + "sw_preset_medium": "Médio", + "sw_preset_slow": "devagar", + "sw_preset_slower": "lento", + "sw_preset_superfast": "super rápido (padrão)", + "sw_preset_ultrafast": "anular", + "sw_preset_veryfast": "veryfast", + "sw_preset_veryslow": "veryslow", + "sw_tune": "Ajuste SW", + "sw_tune_animation": "animação -- boa para desenhos; usa maior debargamento e mais quadros de referência", + "sw_tune_desc": "Ajuste as opções que são aplicadas após a predefinição. O padrão é zero.", + "sw_tune_fastdecode": "fastdecode -- permite uma decodificação mais rápida desabilitando certos filtros", + "sw_tune_film": "filme - usado para conteúdo de filmes de alta qualidade; reduz o deblocking", + "sw_tune_grain": "grãos - preserva a estrutura de grãos em material cinematográfico antigo e cinzento", + "sw_tune_stillimage": "ainda - bom para conteúdo parecido com a apresentação de slides", + "sw_tune_zerolatency": "zerolatência -- bom para codificação rápida e streaming de baixa latência (padrão)", + "touchpad_as_ds4": "Emule um gamepad DS4 se o cliente controla um touchpad estiver presente", + "touchpad_as_ds4_desc": "Se desativada, a presença de touchpad não será tida em conta durante a seleção de tipos de controle.", + "upnp": "UPNP", + "upnp_desc": "Configurar automaticamente o encaminhamento de portas para transmissão na Internet", + "virtual_sink": "Pia Virtual", + "virtual_sink_desc": "Especifique manualmente um dispositivo de áudio virtual para usar. Se não for definido, o dispositivo é escolhido automaticamente. Recomendamos fortemente deixar este campo em branco para usar a seleção automática de dispositivo!", + "virtual_sink_placeholder": "Alto-falantes de streaming Steam", + "vt_coder": "VideoToolbox Coder", + "vt_realtime": "Codificação em Tempo Real VideoToolbox", + "vt_software": "Codificação VideoToolbox Software", + "vt_software_allowed": "Permitido", + "vt_software_forced": "Forçado", + "wan_encryption_mode": "Modo de Criptografia WAN", + "wan_encryption_mode_1": "Habilitado para clientes suportados (padrão)", + "wan_encryption_mode_2": "Obrigatório para todos os clientes", + "wan_encryption_mode_desc": "Isso determina quando a criptografia será usada no streaming pela internet. A criptografia pode reduzir o desempenho do streaming, particularmente em hosts e clientes menos poderosos." + }, + "index": { + "description": "O sol é um anfitrião de jogos auto-hospedado para o Moonlight.", + "download": "BAIXAR", + "loading_latest": "Carregando a última versão...", + "new_nightly": "Um novo Nightly versão está disponível!", + "new_stable": "Uma nova versão Stable está disponível!", + "startup_errors": "Atenção! A Sunshine detectou estes erros durante o arranque. Recomendamos vivamente que os corrija antes de transmitir.", + "version_dirty": "Obrigado por ajudar a fazer do sol um software melhor!", + "version_latest": "Você está executando a última versão do Sunshine", + "welcome": "Olá, Sunshine!" + }, + "navbar": { + "applications": "Aplicações", + "configuration": "Configuração", + "home": "Residencial", + "password": "Mudar a senha", + "pin": "PIN", + "troubleshoot": "Solução de problemas" + }, + "password": { + "confirm_password": "Confirmar senha", + "current_creds": "Credenciais atuais", + "new_creds": "Novas Credenciais", + "new_username_desc": "Se não for especificado, o nome de usuário não irá mudar", + "password_change": "Alteração de senha", + "success_msg": "A senha foi alterada com sucesso! Essa página será recarregada em breve, seu navegador irá pedir as novas credenciais." + }, + "pin": { + "pair_failure": "Falha no pareamento: Verifique se o PIN é digitado corretamente", + "pair_success": "Sucesso! Por favor, verifique a Lua Lunar para continuar", + "pin_pairing": "PIN Pairing", + "send": "Mandar", + "warning_msg": "Certifique-se de que você tem acesso ao cliente com o qual está emparelhando. Este software pode dar controle total ao seu computador, então tenha cuidado!" + }, + "resource_card": { + "github_discussions": "GitHub Discussions", + "legal": "Informações", + "legal_desc": "Ao continuar a usar este software, você concorda com os termos e condições nos seguintes documentos.", + "license": "Tipo:", + "lizardbyte_website": "Portal LizardByte", + "resources": "Recursos", + "resources_desc": "Recursos para luz solar!", + "third_party_notice": "Aviso de terceiros" + }, + "troubleshooting": { + "force_close": "Forçar fechamento", + "force_close_desc": "Se o Moonlight reclamar de um aplicativo em execução, forçar o fechamento do aplicativo deve resolver o problema.", + "force_close_error": "Erro ao fechar o aplicativo", + "force_close_success": "Aplicativo fechado com sucesso!", + "logs": "Registros", + "logs_desc": "Veja os logs carregados por Sunshine", + "logs_find": "Localizar...", + "restart_sunshine": "Reiniciar o Sunshine", + "restart_sunshine_desc": "Se o sol não estiver funcionando corretamente, você pode tentar reiniciá-lo. Isso encerrará todas as sessões em execução.", + "restart_sunshine_success": "A luz do sol está reiniciando", + "troubleshooting": "Solução de problemas", + "unpair_all": "Desconectar todos", + "unpair_all_desc": "Remova todos os seus dispositivos pareados", + "unpair_all_error": "Erro ao desemparelhar", + "unpair_all_success": "Desemparelhado com sucesso!" + }, + "welcome": { + "confirm_password": "Confirmar a senha", + "create_creds": "Antes de começar, precisamos que você crie um novo nome de usuário e senha para acessar a interface da web.", + "create_creds_alert": "As credenciais abaixo são necessárias para acessar a interface da Web do Sunshine. Mantenha-as seguras, já que você nunca vai vê-las novamente!", + "greeting": "Bem-vindo ao Sol!", + "login": "Conectar-se", + "welcome_success": "Esta página será recarregada em breve, seu navegador irá pedir novas credenciais" + } +} diff --git a/src_assets/common/assets/web/public/assets/locale/ru.json b/src_assets/common/assets/web/public/assets/locale/ru.json index 12c382f3d6..c99f4fddb3 100644 --- a/src_assets/common/assets/web/public/assets/locale/ru.json +++ b/src_assets/common/assets/web/public/assets/locale/ru.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Всегда отправлять коды", "always_send_scancodes_desc": "Отправка scancodes улучшает совместимость с играми и приложениями, но может привести к неправильному вводу клавиатуры от некоторых клиентов, которые не используют американскую клавиатуру. Включите, если ввод клавиатуры вообще не работает в некоторых приложениях. Отключено, если ключи на клиенте генерируют неправильный входной параметр на хосте.", "amd_coder": "AMF Coder (H264)", + "amd_coder_desc": "Позволяет выбрать энтропическую кодировку для приоритизации скорости или качества кодирования. H.264 только.", "amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", + "amd_enforce_hrd_desc": "Увеличивает ограничения на контроль за скоростью для удовлетворения требований модели HRD. Это значительно снижает переполнение битрейта, но может вызвать кодировку артефактов или уменьшить качество на некоторых картах.", "amd_preanalysis": "Предварительный анализ AMF", + "amd_preanalysis_desc": "Это позволяет проводить предварительный анализ скорости управления, который может повысить качество за счет увеличения задержки кодирования.", "amd_quality": "Качество AMF", "amd_quality_balanced": "сбалансированный -- сбалансированный (по умолчанию)", + "amd_quality_desc": "Это определяет баланс между скоростью кодирования и качеством.", + "amd_quality_group": "Настройки качества AMF", "amd_quality_quality": "качество -- предпочитаемое качество", "amd_quality_speed": "скорость - скорость отдачи", "amd_rc": "Контроль скорости AMF", "amd_rc_cbr": "cbr -- постоянный битрейт", "amd_rc_cqp": "cqp -- постоянный режим qp", + "amd_rc_desc": "Это контролирует способ контроля тарифов, чтобы убедиться, что мы не превысили цели битрейта клиента. 'cqp' не подходит для таргетинга битрейта, а другие параметры помимо 'vbr_latency' зависят от соблюдения HRD Enforcement для ограничения переполнения битрейта.", + "amd_rc_group": "Настройки контроля скорости AMF", "amd_rc_vbr_latency": "vbr_latency -- Задержка ограничивает битрейт (по умолчанию)", "amd_rc_vbr_peak": "vbr_peak -- пиковый ограниченный битрейт", "amd_usage": "Использование AMF", + "amd_usage_desc": "Определяет базовую кодировку профиля. Все параметры, представленные ниже, переопределят поднабор пользовательского профиля, но есть дополнительные скрытые настройки, которые не могут быть настроены в другом месте.", "amd_usage_lowlatency": "низкая задержка - низкая задержка (быстро)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - низкая задержка, высокое качество (быстро)", "amd_usage_transcoding": "перекодирование -- перекодирование (медленно)", "amd_usage_ultralowlatency": "ультразвуковая задержка - ультра низкая задержка (быстрый)", "amd_usage_webcam": "веб-камера -- веб-камера (медленно)", "amd_vbaq": "Адаптивное квантование на основе отклонений AMF (VBAQ)", + "amd_vbaq_desc": "Как правило, визуальная система человека менее чувствительна к артефактам в особо текстурированных районах. В режиме VBAQ отклонение пикселей используется для обозначения сложности пространственной текстуры, что позволяет кодировщику выделять больше битов для более плавности зон. Включение этой функции приводит к улучшению субъективного качества зрения с некоторым содержимым.", "apply_note": "Нажмите 'Применить', чтобы перезапустить Sunshine и применить изменения. Все запущенные сессии будут завершены.", "audio_sink": "Снимок звука", "audio_sink_desc_linux": "Название звуковой сигнала, используемой для аудиоциклов. Если эта переменная не указана, пульс будет выбирать стандартное устройство монитора. Вы можете найти название звуковой раковины, используя либо команду:", diff --git a/src_assets/common/assets/web/public/assets/locale/sv.json b/src_assets/common/assets/web/public/assets/locale/sv.json index 347a6ac5f2..24492c0626 100644 --- a/src_assets/common/assets/web/public/assets/locale/sv.json +++ b/src_assets/common/assets/web/public/assets/locale/sv.json @@ -92,24 +92,33 @@ "always_send_scancodes": "Skicka alltid sökkoder", "always_send_scancodes_desc": "Att skicka skanningskoder förbättrar kompatibiliteten med spel och appar men kan resultera i felaktig tangentbordsinmatning från vissa klienter som inte använder en amerikansk engelsk tangentbordslayout. Aktivera om tangentbordsinmatningen inte fungerar alls i vissa program. Inaktivera om nycklar på klienten genererar fel indata på värden.", "amd_coder": "AMF-kod (H264)", + "amd_coder_desc": "Låter dig välja entropi-kodning för att prioritera kvalitet eller kodningshastighet. H.264 endast.", "amd_enforce_hrd": "AMF Hypotetisk referensavkodare (HRD) verkställighet", + "amd_enforce_hrd_desc": "Ökar begränsningarna för hastighetskontroll för att uppfylla kraven i HRD-modellen. Detta minskar kraftigt bithastighetsöverflöden, men kan orsaka kodning artefakter eller minskad kvalitet på vissa kort.", "amd_preanalysis": "AMF Föranalys", + "amd_preanalysis_desc": "Detta möjliggör föranalys av hastighetskontroll, vilket kan öka kvaliteten på bekostnad av ökad kodningstid.", "amd_quality": "AMF Kvalitet", "amd_quality_balanced": "balanced -- balanserad (standard)", + "amd_quality_desc": "Detta styr balansen mellan kodningshastighet och kvalitet.", + "amd_quality_group": "AMF Kvalitetsinställningar", "amd_quality_quality": "kvalitet – föredra kvalitet", "amd_quality_speed": "speed -- föredra hastighet", "amd_rc": "AMF Rate kontroll", "amd_rc_cbr": "cbr – konstant bithastighet", "amd_rc_cqp": "cqp – konstant qp-läge", + "amd_rc_desc": "Detta styr metoden för att säkerställa att vi inte överskrider klientens bithastighetsmål. 'cqp' är inte lämplig för bitrate targeting, och andra alternativ förutom 'vbr_latency' beror på HRD Enforcement för att begränsa bitrate overflows.", + "amd_rc_group": "Inställningar för AMF Rate", "amd_rc_vbr_latency": "vbr_latency – fördröjningsbegränsad variabelbithastighet (standard)", "amd_rc_vbr_peak": "vbr_peak – peak constrained variabelbithastighet", "amd_usage": "AMF användning", + "amd_usage_desc": "Detta ställer in grundkodningsprofilen. Alla alternativ som presenteras nedan kommer att åsidosätta en delmängd av användarprofilen, men det finns ytterligare dolda inställningar som inte kan konfigureras någon annanstans.", "amd_usage_lowlatency": "låg latens - låg latens (snabb)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - låg latens, hög kvalitet (snabb)", "amd_usage_transcoding": "transcoding – Omkodning (långsammare)", "amd_usage_ultralowlatency": "ultralowlatens - extremt låg latens (snabbast)", "amd_usage_webcam": "webcam – webbkamera (långsam)", "amd_vbaq": "AMF Variansbaserad adaptiv kvantisering (VBAQ)", + "amd_vbaq_desc": "Det mänskliga visuella systemet är typiskt mindre känsligt för artefakter i mycket texturerade områden. I VBAQ läge används pixelvarians för att indikera komplexiteten i rumsliga texturer, vilket gör att kodaren kan allokera fler bitar till jämnare områden. Att aktivera denna funktion leder till förbättringar i subjektiv visuell kvalitet med lite innehåll.", "apply_note": "Klicka på \"Tillämpa\" för att starta om solsken och tillämpa ändringar. Detta kommer att avsluta alla pågående sessioner.", "audio_sink": "Ljud Sink", "audio_sink_desc_linux": "Namnet på ljuddiskbänken som används för Audio Loopback. Om du inte anger denna variabel, kommer pulseaudio att välja standardövervakningsenheten. Du kan hitta namnet på audiosänkan med hjälp av antingen kommandot:", diff --git a/src_assets/common/assets/web/public/assets/locale/zh.json b/src_assets/common/assets/web/public/assets/locale/zh.json index fac14e2b59..c5efef9783 100644 --- a/src_assets/common/assets/web/public/assets/locale/zh.json +++ b/src_assets/common/assets/web/public/assets/locale/zh.json @@ -5,9 +5,9 @@ "autodetect": "自动检测(推荐)", "cancel": "取消", "disabled": "禁用", - "disabled_def": "禁用(默认)", - "do_cmd": "执行命令", - "elevated": "权限提升", + "disabled_def": "禁用(默认)", + "do_cmd": "打开应用时执行命令", + "elevated": "提权运行", "enabled": "启用", "enabled_def": "启用(默认)", "error": "错误!", @@ -17,7 +17,7 @@ "save": "保存", "see_more": "查看更多", "success": "成功!", - "undo_cmd": "撤销命令", + "undo_cmd": "退出应用时执行命令", "username": "用户名", "warning": "警告!" }, @@ -27,45 +27,45 @@ "add_new": "添加新应用", "app_name": "应用名称", "app_name_desc": "在 Moonlight 显示的应用名称", - "applications_desc": "只有重启客户端时应用才会被刷新", + "applications_desc": "只有重启客户端时应用列表才会被刷新", "applications_title": "应用", - "auto_detach": "如果应用程序快速关闭,继续串流", + "auto_detach": "启动串流后应用突然关闭时不退出串流", "auto_detach_desc": "这将尝试自动检测启动器类型的应用程序,这些应用程序会在启动另一个程序或自身实例后迅速关闭。当检测到启动器类型的应用程序时,它将被视为独立的应用程序。", "cmd": "命令", - "cmd_desc": "要启动的主程序。如果为空,则不会启动任何应用程序。", + "cmd_desc": "要启动的主应用程序。如果为空,则不会启动任何应用程序。", "cmd_note": "如果命令中可执行文件的路径包含空格,则必须用引号括起来。", "cmd_prep_desc": "此应用运行前/后要运行的命令列表。如果任何前置命令失败,应用的启动过程将被中止。", - "cmd_prep_name": "命令准备工作", - "covers_found": "找到封面", + "cmd_prep_name": "启动/退出时执行命令", + "covers_found": "找到的封面", "delete": "删除", "detached_cmds": "独立命令", "detached_cmds_add": "添加独立命令", "detached_cmds_desc": "要在后台运行的命令列表。", - "detached_cmds_note": "如果命令中可执行文件的路径包含空格,则必须用引号括起来。", + "detached_cmds_note": "如果命令可执行文件的路径包含空格,您必须在引号里将其贴出。", "edit": "编辑", "env_app_id": "应用 ID", "env_app_name": "应用名称", "env_client_audio_config": "客户端请求的音频配置 (2.0/5.1/7.1)", - "env_client_enable_sops": "客户端请求自动更改游戏设置以实现最佳串流效果 (true/false)", - "env_client_fps": "客户请求的 FPS (int)", + "env_client_enable_sops": "客户端请求自动更改游戏设置以实现最佳串流效果 (布尔值)", + "env_client_fps": "客户端请求的帧率(int值)", "env_client_gcmap": "客户端请求的游戏手柄掩码,采用 bitset/bitfield 格式 (int)", - "env_client_hdr": "客户端已启用 HDR (true/false)", - "env_client_height": "客户端请求的高度 (int)", + "env_client_hdr": "HDR 已被客户端启用 (true/false)", + "env_client_height": "客户端请求的分辨率的高度(int值, 单位: 像素)", "env_client_host_audio": "客户端请求在主机播放声音 (true/false)", - "env_client_width": "客户端请求的宽度 (int)", + "env_client_width": "客户端请求的分辨率的宽度(int值, 单位: 像素)", "env_displayplacer_example": "示例 - 使用 displayplacer 自动更改分辨率:", "env_qres_example": "示例 - 使用 QRes 自动更改分辨率:", "env_qres_path": "QRes 路径", "env_var_name": "变量名称", "env_vars_about": "关于环境变量", - "env_vars_desc": "默认情况下,所有命令都会得到这些环境变量:", + "env_vars_desc": "默认情况下,以下的环境变量均可在上方调用", "env_xrandr_example": "示例 - 使用 Xrandr 自动更改分辨率:", "exit_timeout": "退出超时", "exit_timeout_desc": "请求退出时,等待所有应用进程正常关闭的秒数。 如果未设置,默认等待5秒钟。如果设置为零或负值,应用程序将立即终止。", "find_cover": "查找封面", "global_prep_desc": "启用/禁用此应用程序的全局预处理命令。", "global_prep_name": "全局预处理命令", - "image": "图片", + "image": "封面", "image_desc": "发送到客户端的应用程序图标/图片/图像的路径。图片必须是 PNG 文件。如果未设置,Sunshine 将发送默认图片。", "loading": "加载中...", "name": "名称", @@ -92,24 +92,33 @@ "always_send_scancodes": "总是发送键盘扫描码", "always_send_scancodes_desc": "发送键盘扫描码可增强与游戏和应用程序的兼容性,但可能会导致某些不使用美式英语键盘布局的客户端键盘输入不正确。如果键盘输入在某些应用程序中完全不工作,请启用。如果客户端上的按键在主机上产生错误输入,则禁用。", "amd_coder": "AMF 编码器 (H264)", + "amd_coder_desc": "允许您选择用于优先质量或编码速度的缠绕编码。 H.264。", "amd_enforce_hrd": "AMF 推测参考解码器 (HRD)", + "amd_enforce_hrd_desc": "提高对费率控制的限制,以满足人力资源开发模式的要求。 这大大减少了比特率过量流量,但可能导致编码伪影或降低某些卡片的质量。", "amd_preanalysis": "AMF 预分析", + "amd_preanalysis_desc": "这使得能够进行比率控制预分析,这可能会以增加编码延迟为代价提高质量。", "amd_quality": "AMF 质量", "amd_quality_balanced": "balanced -- 平衡(默认)", + "amd_quality_desc": "这将控制编码速度和质量之间的平衡。", + "amd_quality_group": "AMF 质量设置", "amd_quality_quality": "quality -- 偏好质量", "amd_quality_speed": "speed -- 偏好速度", - "amd_rc": "AMF 速率控制", + "amd_rc": "AMF 码率控制", "amd_rc_cbr": "cbr -- 恒定比特率(默认)", "amd_rc_cqp": "cqp -- 恒定 QP 模式", + "amd_rc_desc": "这将控制费率控制方法,以确保我们不超过客户端比特率目标。 “cqp”不适合于比特率定位,除“vbr_latency”之外的其他选项依赖于人力资源开发的执行来帮助抑制比特率过多。", + "amd_rc_group": "AMF 费率控制设置", "amd_rc_vbr_latency": "vbr_latency -- 受延迟限制的可变比特率", "amd_rc_vbr_peak": "vbr_peak -- 受峰值限制的可变比特率", - "amd_usage": "AMF 使用", + "amd_usage": "AMF 工作模式", + "amd_usage_desc": "设置基本编码配置文件。 以下列出的所有选项将覆盖使用情况简介的子集,但是应用到了其他不可配置的隐藏设置。", "amd_usage_lowlatency": "lowlatency -- 低延迟(最快)", "amd_usage_lowlatency_high_quality": "lowlatency_high_quality -- 低延迟、高质量(快速)", "amd_usage_transcoding": "transcoding -- 转码(最慢)", "amd_usage_ultralowlatency": "ultralowlatency -- 超低延迟(最快)", "amd_usage_webcam": "webcam -- 网络摄像头(慢)", "amd_vbaq": "AMF 基于方差的自适应量化 (VBAQ)", + "amd_vbaq_desc": "人的视觉系统通常对高成形地区的艺术品不太敏感。 在 VBAQ 模式下,像素差异用于表示空间纹理的复杂性,使编码器能够将更多的比特分配给较平的区域。 启用此功能可提高主观视觉品质及一些内容。", "apply_note": "点击“应用”重启 Sunshine 并应用更改。这将终止任何正在运行的会话。", "audio_sink": "音频输出设备", "audio_sink_desc_linux": "手动指定需要抓取的音频输出设备。如果您没有指定此变量,PulseAudio 将选择默认监测设备。 您可以使用以下任何命令找到音频输出设备的名称:", @@ -137,7 +146,7 @@ "configuration": "配置", "controller": "启用游戏手柄输入", "controller_desc": "允许客户端使用游戏手柄控制主机系统", - "credentials_file": "凭据文件", + "credentials_file": "登录凭据文件", "credentials_file_desc": "将用户名/密码与 Sunshine 的状态文件分开保存。", "ds4_back_as_touchpad_click": "映射回/选择触摸板点击", "ds4_back_as_touchpad_click_desc": "强制使用 DS4 仿真时,地图返回/选择触摸板点击", @@ -146,12 +155,12 @@ "encoder_software": "软件编码", "external_ip": "外部 IP", "external_ip_desc": "如果没有指定外部 IP 地址,Sunshine 将自动检测外部 IP", - "fec_percentage": "FEC 百分比", + "fec_percentage": "FEC (前向纠错) 参数", "fec_percentage_desc": "每个视频帧中的错误纠正数据包百分比。较高的值可纠正更多的网络数据包丢失,但代价是增加带宽使用量。", "ffmpeg_auto": "auto -- 由 ffmpeg 决定(默认)", - "file_apps": "应用程序文件", + "file_apps": "应用程序配置文件", "file_apps_desc": "Sunshine 保存应用程序配置的文件。", - "file_state": "状态文件", + "file_state": "实时状态文件", "file_state_desc": "Sunshine 保存当前状态的文件", "fps": "通告 FPS", "gamepad": "模拟游戏手柄类型", @@ -165,10 +174,10 @@ "hevc_mode": "HEVC 支持", "hevc_mode_0": "Sunshine 将根据编码器能力通告对 HEVC 的支持(推荐)", "hevc_mode_1": "Sunshine 将不会通告对 HEVC 的支持", - "hevc_mode_2": "Sunshine 将通告 HEVC Main 配置支持", + "hevc_mode_2": "Sunshine 将为HEVC 主配置文件做广告支持", "hevc_mode_3": "Sunshine 将通告 HEVC Main 和 Main10 (HDR) 配置支持", "hevc_mode_desc": "允许客户端请求 HEVC Main 或 HEVC Main10 视频流。HEVC 的编码对 CPU 的要求较高,因此在使用软件编码时,启用此功能可能会降低性能。", - "high_resolution_scrolling": "高分辨率滚动支持", + "high_resolution_scrolling": "高分辨率鼠标滚动支持", "high_resolution_scrolling_desc": "启用后,Sunshine 将透传来自 Moonlight 客户端的高分辨率滚动事件。对于那些使用高分辨率滚动事件时滚动速度过快的旧版应用程序来说,禁用此功能非常有用。", "install_steam_audio_drivers": "安装 Steam 音频驱动程序", "install_steam_audio_drivers_desc": "如果安装了 Steam,则会自动安装 Steam Streaming Speakers 驱动程序,以支持 5.1/7.1 环绕声和主机音频静音。", @@ -197,7 +206,7 @@ "log_level_desc": "打印到标准输出的最小日志级别", "log_path": "日志文件路径", "log_path_desc": "Sunshine 当前日志存储的文件。", - "min_threads": "最低 CPU 线程数", + "min_threads": "最小CPU 线程计数", "min_threads_desc": "提高该值会略微降低编码效率,但为了获得更多的 CPU 内核用于编码,通常是值得的。理想值是在您的硬件配置上以所需的串流设置进行可靠编码的最低值。", "misc": "杂项选项", "motion_as_ds4": "如果客户端报告游戏手柄存在陀螺仪,则模拟一个 DS4 游戏手柄", @@ -265,7 +274,7 @@ "qsv_preset_slower": "slower - 更慢(更高质量)", "qsv_preset_slowest": "slowest - 最慢(最高质量)", "qsv_preset_veryfast": "veryfast - 最快 (最低质量)", - "qsv_slow_hevc": "允许较慢的 HEVC 编码", + "qsv_slow_hevc": "允许慢速 HEVC 编码", "qsv_slow_hevc_desc": "这可以在较旧的 Intel GPU 上启用 HEVC 编码,但代价是 GPU 占用率更高,性能更差。", "res_fps_desc": "由 Sunshine 通告的显示模式。 某些版本的 Moonlight,如 Moonlight-nx (Switch),依靠这些清单来确保支持所请求的分辨率和 fps。 此设置不会改变屏幕串流送至 Moonlight 的方式。", "resolutions": "通告分辨率", @@ -331,7 +340,7 @@ "confirm_password": "确认密码", "current_creds": "当前账户信息", "new_creds": "新的账户信息", - "new_username_desc": "如果未指定,用户名将不会更改", + "new_username_desc": "如果不输入新的用户名, 用户名将保持不变", "password_change": "密码更改", "success_msg": "密码已成功更改!此页面即将重新加载,您的浏览器将要求您输入新的账户信息。" }, @@ -353,7 +362,7 @@ "third_party_notice": "第三方声明" }, "troubleshooting": { - "force_close": "强制关闭", + "force_close": "强制结束运行", "force_close_desc": "如果 Moonlight 抱怨某个应用正在运行,强制关闭该应用应该可以解决问题。", "force_close_error": "关闭应用时出错", "force_close_success": "应用关闭成功!", @@ -365,7 +374,7 @@ "restart_sunshine_success": "Sunhine 正在重启", "troubleshooting": "故障排除", "unpair_all": "全部取消配对", - "unpair_all_desc": "删除您所有配对的设备", + "unpair_all_desc": "删除您所有已经配对的设备", "unpair_all_error": "取消配对时出错", "unpair_all_success": "取消配对成功!" }, diff --git a/third-party/wayland-protocols b/third-party/wayland-protocols index 46f201bd7b..08d1c7276d 160000 --- a/third-party/wayland-protocols +++ b/third-party/wayland-protocols @@ -1 +1 @@ -Subproject commit 46f201bd7b328ab5ac531231c030ca5c4090b1da +Subproject commit 08d1c7276d41379acfea353b5c739b72d51827e2 diff --git a/third-party/wlr-protocols b/third-party/wlr-protocols index 4264185db3..2b8d43325b 160000 --- a/third-party/wlr-protocols +++ b/third-party/wlr-protocols @@ -1 +1 @@ -Subproject commit 4264185db3b7e961e7f157e1cc4fd0ab75137568 +Subproject commit 2b8d43325b7012cc3f9b55c08d26e50e42beac7d