diff --git a/.dockerignore b/.dockerignore index e7ccaee35bf..a6ccb41e660 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,6 +8,7 @@ !/.rstcheck.cfg # ignore repo directories and files +docker/ gh-pages-template/ scripts/ tools/ @@ -15,6 +16,7 @@ crowdin.yml # ignore dev directories build/ +cmake-*/ venv/ # ignore artifacts diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index ebdd4c11e33..26371651fbe 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -500,18 +500,20 @@ 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 + uses: codecov/codecov-action@v4 with: + 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' }} @@ -562,10 +564,12 @@ jobs: echo "This is a PUSH event" clone_url=${{ github.event.repository.clone_url }} branch="${{ github.ref_name }}" + 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 }}" + default_branch="${{ github.event.pull_request.head.repo.default_branch }}" fi echo "Branch: ${branch}" echo "Clone URL: ${clone_url}" @@ -575,6 +579,7 @@ jobs: cmake \ -DGITHUB_BRANCH="${branch}" \ -DGITHUB_CLONE_URL="${clone_url}" \ + -DGITHUB_DEFAULT_BRANCH="${default_branch}" \ -DSUNSHINE_CONFIGURE_HOMEBREW=ON \ -DSUNSHINE_CONFIGURE_ONLY=ON \ .. @@ -610,7 +615,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.409.24405 with: formula_file: ${{ github.workspace }}/homebrew/sunshine.rb git_email: ${{ secrets.GH_BOT_EMAIL }} @@ -791,7 +796,6 @@ jobs: done - name: Run tests - if: always() id: test timeout-minutes: 10 run: | @@ -819,8 +823,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 \ @@ -829,10 +833,12 @@ jobs: - name: Upload coverage # any except canceled or skipped if: always() && (steps.test_report.outcome == 'success') - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: + 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 }} @@ -966,28 +972,30 @@ jobs: - name: Setup Dependencies Windows uses: msys2/setup-msys2@v2 with: - msystem: ucrt64 update: true install: >- + base-devel + diffutils doxygen git - mingw-w64-ucrt-x86_64-boost - mingw-w64-ucrt-x86_64-cmake - mingw-w64-ucrt-x86_64-cppwinrt - mingw-w64-ucrt-x86_64-curl - mingw-w64-ucrt-x86_64-graphviz - mingw-w64-ucrt-x86_64-miniupnpc - mingw-w64-ucrt-x86_64-nlohmann-json - mingw-w64-ucrt-x86_64-nodejs - mingw-w64-ucrt-x86_64-nsis - mingw-w64-ucrt-x86_64-onevpl - mingw-w64-ucrt-x86_64-openssl - mingw-w64-ucrt-x86_64-opus - mingw-w64-ucrt-x86_64-toolchain + + 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-graphviz + mingw-w64-x86_64-miniupnpc + mingw-w64-x86_64-nlohmann-json + mingw-w64-x86_64-nodejs + mingw-w64-x86_64-nsis + mingw-w64-x86_64-onevpl + mingw-w64-x86_64-openssl + mingw-w64-x86_64-opus + mingw-w64-x86_64-toolchain nasm wget yasm - make - name: Setup python # use this instead of msys2 python due to known issues using wheels, https://www.msys2.org/docs/python/ @@ -1056,18 +1064,20 @@ 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 + uses: codecov/codecov-action@v4 with: + 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/CHANGELOG.md b/CHANGELOG.md index d4fbff3a4ff..0ca2b370d21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [0.23.0] - 2024-04-06 +Attention, this release contains critical security fixes. Please update as soon as possible. + +**Breaking** +- (Linux) Drop support for Ubuntu 20.04 +- (Linux) No longer provide arm64 rpm packages, due to extreme compile time on GitHub hosted runners + +**Fixed** +- (Network) Ensure unpairing takes effect without restart +- (Capture/Linux) Fix logical comparison of texture size +- (Service/Windows) Quote the path to sunshinesvc.exe when launching the termination helper + +**Added** +- (WebUI) Localization support +- (Capture/Linux) Populate host latency for kmx/x11 grab +- (Capture/Windows) AMF rate control improvements +- (Linux) Add support for Ubuntu 24.04 (x86_64 only) + +**Dependencies** +- Bump rstcheck from 6.2.0 to 6.2.1 +- Bump org.flatpak.Builder.BaseApp from 644487f to 6e295e6 +- Bump ffmpeg +- Bump @fortawesome/fontawesome-free from 6.5.1 to 6.5.2 + +**Misc** +- (Style) Refactored video encoder declarations +- (CI) Refactored Linux build in CI +- (CI) Added unit testing and code coverage +- (Docs/macOS) Update curl command for Portfile install +- (Style) Refactor logging initialization + + ## [0.22.2] - 2024-03-15 **Fixed** - (Tray/Windows) Fix broken system tray icon on some systems @@ -766,3 +798,4 @@ settings. In v0.17.0, games now run under your user account without elevated pri [0.22.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.22.0 [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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d6ac864322..180a9911bdc 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.22.2 +project(Sunshine VERSION 0.23.0 DESCRIPTION "Self-hosted game stream host for Moonlight" HOMEPAGE_URL "https://app.lizardbyte.dev/Sunshine") @@ -29,6 +29,9 @@ include(${CMAKE_MODULE_PATH}/prep/build_version.cmake) # cmake build flags include(${CMAKE_MODULE_PATH}/prep/options.cmake) +# initial prep +include(${CMAKE_MODULE_PATH}/prep/init.cmake) + # configure special package files, such as sunshine.desktop, Flatpak manifest, Portfile , etc. include(${CMAKE_MODULE_PATH}/prep/special_package_configuration.cmake) diff --git a/README.rst b/README.rst index b06fba3fe77..080329644c7 100644 --- a/README.rst +++ b/README.rst @@ -17,69 +17,48 @@ System Requirements **Minimum Requirements** -+------------+------------------------------------------------------------+ -| GPU | AMD: VCE 1.0 or higher, see `obs-amd hardware support`_ | -| +------------------------------------------------------------+ -| | Intel: VAAPI-compatible, see: `VAAPI hardware support`_ | -| +------------------------------------------------------------+ -| | Nvidia: NVENC enabled cards, see `nvenc support matrix`_ | -+------------+------------------------------------------------------------+ -| CPU | AMD: Ryzen 3 or higher | -| +------------------------------------------------------------+ -| | Intel: Core i3 or higher | -+------------+------------------------------------------------------------+ -| RAM | 4GB or more | -+------------+------------------------------------------------------------+ -| OS | Windows: 10+ (Windows Server not supported) | -| +------------------------------------------------------------+ -| | macOS: 12+ | -| +------------------------------------------------------------+ -| | Linux/Debian: 11 (bullseye) | -| +------------------------------------------------------------+ -| | Linux/Fedora: 38+ | -| +------------------------------------------------------------+ -| | Linux/Ubuntu: 20.04+ (focal) | -+------------+------------------------------------------------------------+ -| Network | Host: 5GHz, 802.11ac | -| +------------------------------------------------------------+ -| | Client: 5GHz, 802.11ac | -+------------+------------------------------------------------------------+ +.. csv-table:: + :widths: 15, 60 + + "GPU", "AMD: VCE 1.0 or higher, see: `obs-amd hardware support `_" + "", "Intel: VAAPI-compatible, see: `VAAPI hardware support `_" + "", "Nvidia: NVENC enabled cards, see: `nvenc support matrix `_" + "CPU", "AMD: Ryzen 3 or higher" + "", "Intel: Core i3 or higher" + "RAM", "4GB or more" + "OS", "Windows: 10+ (Windows Server does not support virtual gamepads)" + "", "macOS: 12+" + "", "Linux/Debian: 11 (bullseye)" + "", "Linux/Fedora: 38+" + "", "Linux/Ubuntu: 22.04+ (jammy)" + "Network", "Host: 5GHz, 802.11ac" + "", "Client: 5GHz, 802.11ac" **4k Suggestions** -+------------+------------------------------------------------------------+ -| GPU | AMD: Video Coding Engine 3.1 or higher | -| +------------------------------------------------------------+ -| | Intel: HD Graphics 510 or higher | -| +------------------------------------------------------------+ -| | Nvidia: GeForce GTX 1080 or higher | -+------------+------------------------------------------------------------+ -| CPU | AMD: Ryzen 5 or higher | -| +------------------------------------------------------------+ -| | Intel: Core i5 or higher | -+------------+------------------------------------------------------------+ -| Network | Host: CAT5e ethernet or better | -| +------------------------------------------------------------+ -| | Client: CAT5e ethernet or better | -+------------+------------------------------------------------------------+ +.. csv-table:: + :widths: 15, 60 + + "GPU", "AMD: Video Coding Engine 3.1 or higher" + "", "Intel: HD Graphics 510 or higher" + "", "Nvidia: GeForce GTX 1080 or higher" + "CPU", "AMD: Ryzen 5 or higher" + "", "Intel: Core i5 or higher" + "Network", "Host: CAT5e ethernet or better" + "", "Client: CAT5e ethernet or better" **HDR Suggestions** -+------------+------------------------------------------------------------+ -| GPU | AMD: Video Coding Engine 3.4 or higher | -| +------------------------------------------------------------+ -| | Intel: UHD Graphics 730 or higher | -| +------------------------------------------------------------+ -| | Nvidia: Pascal-based GPU (GTX 10-series) or higher | -+------------+------------------------------------------------------------+ -| CPU | AMD: todo | -| +------------------------------------------------------------+ -| | Intel: todo | -+------------+------------------------------------------------------------+ -| Network | Host: CAT5e ethernet or better | -| +------------------------------------------------------------+ -| | Client: CAT5e ethernet or better | -+------------+------------------------------------------------------------+ +.. csv-table:: + :widths: 15, 60 + + "GPU", "AMD: Video Coding Engine 3.4 or higher" + "", "Intel: UHD Graphics 730 or higher" + "", "Nvidia: Pascal-based GPU (GTX 10-series) or higher" + "CPU", "AMD: todo" + "", "Intel: todo" + "Network", "Host: CAT5e ethernet or better" + "", "Client: CAT5e ethernet or better" Integrations ------------ @@ -126,7 +105,3 @@ Stats .. image:: https://img.shields.io/github/stars/lizardbyte/sunshine.svg?logo=github&style=for-the-badge :alt: GitHub stars :target: https://github.com/LizardByte/Sunshine - -.. _nvenc support matrix: https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new -.. _obs-amd hardware support: https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support -.. _VAAPI hardware support: https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index 56d8f00e5ad..ce63ccead5f 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -8,10 +8,6 @@ if(${SUNSHINE_BUILD_APPIMAGE}) string(REPLACE "${CMAKE_INSTALL_PREFIX}" ".${CMAKE_INSTALL_PREFIX}" SUNSHINE_ASSETS_DIR_DEF ${SUNSHINE_ASSETS_DIR}) endif() -if(NOT DEFINED SUNSHINE_EXECUTABLE_PATH) - set(SUNSHINE_EXECUTABLE_PATH "sunshine") -endif() - # cuda set(CUDA_FOUND OFF) if(${SUNSHINE_ENABLE_CUDA}) @@ -203,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/compile_definitions/windows.cmake b/cmake/compile_definitions/windows.cmake index 24c17f259c7..e6884946db2 100644 --- a/cmake/compile_definitions/windows.cmake +++ b/cmake/compile_definitions/windows.cmake @@ -9,9 +9,6 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") # gcc complains about misleading indentation in some mingw includes list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-misleading-indentation) -# see gcc bug 98723 -add_definitions(-DUSE_BOOST_REGEX) - # curl add_definitions(-DCURL_STATICLIB) include_directories(SYSTEM ${CURL_STATIC_INCLUDE_DIRS}) @@ -50,7 +47,6 @@ set(PLATFORM_TARGET_FILES "${CMAKE_SOURCE_DIR}/src/platform/windows/display_base.cpp" "${CMAKE_SOURCE_DIR}/src/platform/windows/display_vram.cpp" "${CMAKE_SOURCE_DIR}/src/platform/windows/display_ram.cpp" - "${CMAKE_SOURCE_DIR}/src/platform/windows/display_wgc.cpp" "${CMAKE_SOURCE_DIR}/src/platform/windows/audio.cpp" "${CMAKE_SOURCE_DIR}/src/platform/windows/display_device/device_hdr_states.cpp" "${CMAKE_SOURCE_DIR}/src/platform/windows/display_device/device_modes.cpp" diff --git a/cmake/packaging/common.cmake b/cmake/packaging/common.cmake index ad3f9bc0682..c7c5b3a5cc9 100644 --- a/cmake/packaging/common.cmake +++ b/cmake/packaging/common.cmake @@ -12,10 +12,18 @@ set(CPACK_PACKAGE_ICON ${PROJECT_SOURCE_DIR}/sunshine.png) set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}") set(CPACK_STRIP_FILES YES) -#install common assets +# install common assets install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/" DESTINATION "${SUNSHINE_ASSETS_DIR}" PATTERN "web" EXCLUDE) +# copy assets to build directory, for running without install +file(GLOB_RECURSE ALL_ASSETS + RELATIVE "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/" "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/*") +list(FILTER ALL_ASSETS EXCLUDE REGEX "^web/.*$") # Filter out the web directory +foreach(asset ${ALL_ASSETS}) # Copy assets to build directory, excluding the web directory + file(COPY "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/${asset}" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/assets") +endforeach() # install built vite assets install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/assets/web" diff --git a/cmake/packaging/linux.cmake b/cmake/packaging/linux.cmake index 499f058c8bd..4d9cfbcec72 100644 --- a/cmake/packaging/linux.cmake +++ b/cmake/packaging/linux.cmake @@ -2,6 +2,9 @@ install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/" DESTINATION "${SUNSHINE_ASSETS_DIR}") +# copy assets to build directory, for running without install +file(COPY "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/" + DESTINATION "${CMAKE_BINARY_DIR}/assets") if(${SUNSHINE_BUILD_APPIMAGE} OR ${SUNSHINE_BUILD_FLATPAK}) install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/60-sunshine.rules" DESTINATION "${SUNSHINE_ASSETS_DIR}/udev/rules.d") diff --git a/cmake/packaging/macos.cmake b/cmake/packaging/macos.cmake index f7c3a518c97..a16fdb66a26 100644 --- a/cmake/packaging/macos.cmake +++ b/cmake/packaging/macos.cmake @@ -10,15 +10,16 @@ if(SUNSHINE_PACKAGE_MACOS) # todo set(MAC_PREFIX "${CMAKE_PROJECT_NAME}.app/Contents") set(INSTALL_RUNTIME_DIR "${MAC_PREFIX}/MacOS") - install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/macos/assets/" - DESTINATION "${SUNSHINE_ASSETS_DIR}") - install(TARGETS sunshine BUNDLE DESTINATION . COMPONENT Runtime RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} COMPONENT Runtime) else() - install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/macos/assets/" - DESTINATION "${SUNSHINE_ASSETS_DIR}") install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/macos/misc/uninstall_pkg.sh" DESTINATION "${SUNSHINE_ASSETS_DIR}") endif() + +install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/macos/assets/" + DESTINATION "${SUNSHINE_ASSETS_DIR}") +# copy assets to build directory, for running without install +file(COPY "${SUNSHINE_SOURCE_ASSETS_DIR}/macos/assets/" + DESTINATION "${CMAKE_BINARY_DIR}/assets") diff --git a/cmake/packaging/windows.cmake b/cmake/packaging/windows.cmake index 2b512ed6999..bbd497ee3a0 100644 --- a/cmake/packaging/windows.cmake +++ b/cmake/packaging/windows.cmake @@ -39,6 +39,9 @@ install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/gamepad/" install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/assets/" DESTINATION "${SUNSHINE_ASSETS_DIR}" COMPONENT assets) +# copy assets to build directory, for running without install +file(COPY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/assets/" + DESTINATION "${CMAKE_BINARY_DIR}/assets") # set(CPACK_NSIS_MUI_HEADERIMAGE "") # TODO: image should be 150x57 bmp set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\sunshine.ico") diff --git a/cmake/prep/init.cmake b/cmake/prep/init.cmake new file mode 100644 index 00000000000..93e8b597721 --- /dev/null +++ b/cmake/prep/init.cmake @@ -0,0 +1,9 @@ +if (WIN32) +elseif (APPLE) +elseif (UNIX) + include(GNUInstallDirs) + + if(NOT DEFINED SUNSHINE_EXECUTABLE_PATH) + set(SUNSHINE_EXECUTABLE_PATH "sunshine") + endif() +endif () diff --git a/cmake/prep/special_package_configuration.cmake b/cmake/prep/special_package_configuration.cmake index ec0c110b565..17e724c90d0 100644 --- a/cmake/prep/special_package_configuration.cmake +++ b/cmake/prep/special_package_configuration.cmake @@ -6,8 +6,6 @@ if (APPLE) configure_file(packaging/macos/sunshine.rb sunshine.rb @ONLY) endif() elseif (UNIX) - include(GNUInstallDirs) # this needs to be included prior to configuring the desktop files - # configure the .desktop file if(${SUNSHINE_BUILD_APPIMAGE}) configure_file(packaging/linux/AppImage/sunshine.desktop sunshine.desktop @ONLY) diff --git a/cmake/targets/common.cmake b/cmake/targets/common.cmake index 012f17aca93..094bbca7c20 100644 --- a/cmake/targets/common.cmake +++ b/cmake/targets/common.cmake @@ -2,9 +2,18 @@ # this file will also load platform specific macros add_executable(sunshine ${SUNSHINE_TARGET_FILES}) -set_target_properties(sunshine PROPERTIES CXX_STANDARD 17 - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) + +# Homebrew build fails the vite build if we set these environment variables +# this block must be before the platform specific code +if(${SUNSHINE_BUILD_HOMEBREW}) + set(NPM_SOURCE_ASSETS_DIR "") + set(NPM_ASSETS_DIR "") + set(NPM_BUILD_HOMEBREW "true") +else() + set(NPM_SOURCE_ASSETS_DIR ${SUNSHINE_SOURCE_ASSETS_DIR}) + set(NPM_ASSETS_DIR ${CMAKE_BINARY_DIR}) + set(NPM_BUILD_HOMEBREW "") +endif() # platform specific target definitions if(WIN32) @@ -27,6 +36,9 @@ endif() target_link_libraries(sunshine ${SUNSHINE_EXTERNAL_LIBRARIES} ${EXTRA_LIBS}) target_compile_definitions(sunshine PUBLIC ${SUNSHINE_DEFINITIONS}) +set_target_properties(sunshine PROPERTIES CXX_STANDARD 17 + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) # CLion complains about unknown flags after running cmake, and cannot add symbols to the index for cuda files if(CUDA_INHERIT_COMPILE_OPTIONS) @@ -37,23 +49,6 @@ endif() target_compile_options(sunshine PRIVATE $<$:${SUNSHINE_COMPILE_OPTIONS}>;$<$:${SUNSHINE_COMPILE_OPTIONS_CUDA};-std=c++17>) # cmake-lint: disable=C0301 -# Homebrew build fails the vite build if we set these environment variables -if(${SUNSHINE_BUILD_HOMEBREW}) - set(NPM_SOURCE_ASSETS_DIR "") - set(NPM_ASSETS_DIR "") - set(NPM_BUILD_HOMEBREW "true") -else() - set(NPM_SOURCE_ASSETS_DIR ${SUNSHINE_SOURCE_ASSETS_DIR}) - set(NPM_ASSETS_DIR ${CMAKE_BINARY_DIR}) - set(NPM_BUILD_HOMEBREW "") -endif() - -#WebUI build -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 - # tests if(BUILD_TESTS) add_subdirectory(tests) @@ -61,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 @@ -79,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 047a0b3d381..5527a9874fa 100644 --- a/cmake/targets/unix.cmake +++ b/cmake/targets/unix.cmake @@ -1,2 +1,8 @@ # unix specific target definitions # put anything here that applies to both linux and macos + +#WebUI build +add_custom_target(web-ui ALL + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT "Installing NPM Dependencies and Building the Web UI" + 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/cmake/targets/windows.cmake b/cmake/targets/windows.cmake index ca8a6963086..e429feaa821 100644 --- a/cmake/targets/windows.cmake +++ b/cmake/targets/windows.cmake @@ -1,9 +1,12 @@ # windows specific target definitions -set_target_properties(sunshine PROPERTIES - CXX_STANDARD 20 - LINK_SEARCH_START_STATIC 1) +set_target_properties(sunshine PROPERTIES LINK_SEARCH_START_STATIC 1) set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") find_library(ZLIB ZLIB1) list(APPEND SUNSHINE_EXTERNAL_LIBRARIES - Windowsapp.lib Wtsapi32.lib) + +#WebUI build +add_custom_target(web-ui ALL + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT "Installing NPM Dependencies and Building the Web UI" + COMMAND cmd /C "npm install && set \"SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR}\" && set \"SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR}\" && npm run build") # cmake-lint: disable=C0301 diff --git a/codecov.yml b/codecov.yml index 59209e46432..b50701c758b 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 3af5dd4f45d..204450bf1c9 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 7f49bb1a493..34cf29bedc9 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 5e0667f0180..2a491559083 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/fedora-38.dockerfile b/docker/fedora-38.dockerfile index 50d9fd66acb..52796d509f1 100644 --- a/docker/fedora-38.dockerfile +++ b/docker/fedora-38.dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.4 # artifacts: true -# platforms: linux/amd64,linux/arm64/v8 +# platforms: linux/amd64 # platforms_pr: linux/amd64 # no-cache-filters: sunshine-base,artifacts,sunshine ARG BASE=fedora diff --git a/docker/fedora-39.dockerfile b/docker/fedora-39.dockerfile index eff8194877a..262b40fc7ac 100644 --- a/docker/fedora-39.dockerfile +++ b/docker/fedora-39.dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.4 # artifacts: true -# platforms: linux/amd64,linux/arm64/v8 +# platforms: linux/amd64 # platforms_pr: linux/amd64 # no-cache-filters: sunshine-base,artifacts,sunshine ARG BASE=fedora diff --git a/docker/ubuntu-22.04.dockerfile b/docker/ubuntu-22.04.dockerfile index 65b8929c0c2..e02ca1eba91 100644 --- a/docker/ubuntu-22.04.dockerfile +++ b/docker/ubuntu-22.04.dockerfile @@ -37,7 +37,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/ubuntu-20.04.dockerfile b/docker/ubuntu-24.04.dockerfile similarity index 77% rename from docker/ubuntu-20.04.dockerfile rename to docker/ubuntu-24.04.dockerfile index 8a88d72bd91..7ef83bfba39 100644 --- a/docker/ubuntu-20.04.dockerfile +++ b/docker/ubuntu-24.04.dockerfile @@ -1,10 +1,10 @@ # syntax=docker/dockerfile:1.4 # artifacts: true -# platforms: linux/amd64,linux/arm64/v8 +# platforms: linux/amd64 # platforms_pr: linux/amd64 # no-cache-filters: sunshine-base,artifacts,sunshine ARG BASE=ubuntu -ARG TAG=20.04 +ARG TAG=24.04 FROM ${BASE}:${TAG} AS sunshine-base ENV DEBIAN_FRONTEND=noninteractive @@ -31,18 +31,18 @@ set -e apt-get update -y apt-get install -y --no-install-recommends \ build-essential \ + cmake=3.28.* \ ca-certificates \ doxygen \ - gcc-10=10.5.* \ - g++-10=10.5.* \ + gcc-11 \ + g++-11 \ git \ graphviz \ libayatana-appindicator3-dev \ - libavdevice-dev \ - libboost-filesystem-dev=1.71.* \ - libboost-locale-dev=1.71.* \ - libboost-log-dev=1.71.* \ - libboost-program-options-dev=1.71.* \ + libboost-filesystem-dev=1.83.* \ + libboost-locale-dev=1.83.* \ + libboost-log-dev=1.83.* \ + libboost-program-options-dev=1.83.* \ libcap-dev \ libcurl4-openssl-dev \ libdrm-dev \ @@ -63,8 +63,8 @@ apt-get install -y --no-install-recommends \ libxfixes-dev \ libxrandr-dev \ libxtst-dev \ - python3.9 \ - python3.9-venv \ + python3.12 \ + python3.12-venv \ udev \ wget \ x11-xserver-utils \ @@ -77,6 +77,7 @@ apt-get clean rm -rf /var/lib/apt/lists/* _DEPS + #Install Node # hadolint ignore=SC1091 RUN <<_INSTALL_NODE @@ -94,35 +95,13 @@ RUN <<_GCC_ALIAS #!/bin/bash set -e update-alternatives --install \ - /usr/bin/gcc gcc /usr/bin/gcc-10 100 \ - --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ - --slave /usr/bin/gcov gcov /usr/bin/gcov-10 \ - --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-10 \ - --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-10 + /usr/bin/gcc gcc /usr/bin/gcc-11 100 \ + --slave /usr/bin/g++ g++ /usr/bin/g++-11 \ + --slave /usr/bin/gcov gcov /usr/bin/gcov-11 \ + --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-11 \ + --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-11 _GCC_ALIAS -# install cmake -# sunshine requires cmake >= 3.18 -WORKDIR /build/cmake -# https://cmake.org/download/ -ENV CMAKE_VERSION="3.25.1" -# hadolint ignore=SC3010 -RUN <<_INSTALL_CMAKE -#!/bin/bash -set -e -cmake_prefix="https://github.com/Kitware/CMake/releases/download/v" -if [[ "${TARGETPLATFORM}" == 'linux/amd64' ]]; then - cmake_arch="x86_64" -elif [[ "${TARGETPLATFORM}" == 'linux/arm64' ]]; then - cmake_arch="aarch64" -fi -url="${cmake_prefix}${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${cmake_arch}.sh" -echo "cmake url: ${url}" -wget "$url" --progress=bar:force:noscroll -q --show-progress -O ./cmake.sh -sh ./cmake.sh --prefix=/usr/local --skip-license -rm ./cmake.sh -_INSTALL_CMAKE - # install cuda WORKDIR /build/cuda # versions: https://developer.nvidia.com/cuda-toolkit-archive @@ -160,6 +139,7 @@ set -e #Set Node version source "$HOME/.nvm/nvm.sh" nvm use 20.9.0 +#Actually build cmake \ -DBUILD_WERROR=ON \ -DCMAKE_CUDA_COMPILER:PATH=/build/cuda/bin/nvcc \ @@ -214,9 +194,9 @@ EXPOSE 48010 EXPOSE 47998-48000/udp # setup user -ARG PGID=1000 +ARG PGID=1001 ENV PGID=${PGID} -ARG PUID=1000 +ARG PUID=1001 ENV PUID=${PUID} ENV TZ="UTC" ARG UNAME=lizard diff --git a/docs/requirements.txt b/docs/requirements.txt index f7104d627c8..46e47734df9 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 142545ef08a..b7cbce24627 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -200,7 +200,7 @@ editing the `conf` file in a text editor. Use the examples as reference. .. code-block:: text gamepad = auto - + `ds4_back_as_touchpad_click `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -378,7 +378,7 @@ editing the `conf` file in a text editor. Use the examples as reference. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Description** - When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. + When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support. @@ -1111,25 +1111,25 @@ keybindings **Description** Force specific screen capture method. + .. caution:: Applies to Linux only. + **Choices** .. table:: :widths: auto - ========= ======== =========== - Value Platform Description - ========= ======== =========== - nvfbc Linux Use NVIDIA Frame Buffer Capture to capture direct to GPU memory. This is usually the fastest method for - NVIDIA cards. For GeForce cards it will only work with drivers patched with - `nvidia-patch `__ - or `nvlax `__. - wlr Linux Capture for wlroots based Wayland compositors via DMA-BUF. - kms Linux DRM/KMS screen capture from the kernel. This requires that sunshine has cap_sys_admin capability. - See :ref:`Linux Setup `. - x11 Linux Uses XCB. This is the slowest and most CPU intensive so should be avoided if possible. - ddx Windows Use DirectX Desktop Duplication API to capture the display. This is well-supported on Windows machines. - wgc Windows (beta feature) Use Windows.Graphics.Capture to capture the display. - ========= ======== =========== + ========= =========== + Value Description + ========= =========== + nvfbc Use NVIDIA Frame Buffer Capture to capture direct to GPU memory. This is usually the fastest method for + NVIDIA cards. For GeForce cards it will only work with drivers patched with + `nvidia-patch `__ + or `nvlax `__. + wlr Capture for wlroots based Wayland compositors via DMA-BUF. + kms DRM/KMS screen capture from the kernel. This requires that sunshine has cap_sys_admin capability. + See :ref:`Linux Setup `. + x11 Uses XCB. This is the slowest and most CPU intensive so should be avoided if possible. + ========= =========== **Default** Automatic. Sunshine will use the first capture method available in the order of the table above. @@ -1549,12 +1549,12 @@ keybindings =========== =========== **Default** - ``vbr_latency`` + ``cbr`` **Example** .. code-block:: text - amd_rc = vbr_latency + amd_rc = cbr `amd_usage `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1569,14 +1569,15 @@ keybindings .. table:: :widths: auto - =============== =========== - Value Description - =============== =========== - transcoding transcoding (slowest) - webcam webcam (slow) - lowlatency low latency (fast) - ultralowlatency ultra low latency (fastest) - =============== =========== + ======================= =========== + 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** ``ultralowlatency`` @@ -1618,6 +1619,22 @@ keybindings amd_vbaq = enabled +`amd_enforce_hrd `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Description** + Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate. + + .. note:: This option only applies when using amdvce `encoder`_. + +**Default** + ``enabled`` + +**Example** + .. code-block:: text + + amd_enforce_hrd = enabled + `amd_coder `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/about/setup.rst b/docs/source/about/setup.rst index 2a2b015ce9c..5c70c11a004 100644 --- a/docs/source/about/setup.rst +++ b/docs/source/about/setup.rst @@ -45,8 +45,8 @@ Install sunshine-debian-bullseye-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 sunshine-fedora-38-{arch}.rpm 12.4.0 525.60.13 50;52;60;61;62;70;75;80;86;90 sunshine-fedora-39-{arch}.rpm 12.4.0 525.60.13 50;52;60;61;62;70;75;80;86;90 - sunshine-ubuntu-20.04-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 sunshine-ubuntu-22.04-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 + sunshine-ubuntu-24.04-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 =========================================== ============== ============== ================================ .. tab:: AppImage @@ -307,7 +307,7 @@ Install mkdir -p ~/ports/multimedia/sunshine cd ~/ports/multimedia/sunshine - curl -O https://github.com/LizardByte/Sunshine/releases/latest/download/Portfile + curl -OL https://github.com/LizardByte/Sunshine/releases/latest/download/Portfile cd ~/ports portindex sudo port install sunshine diff --git a/docs/source/building/linux.rst b/docs/source/building/linux.rst index 789409e4174..d263a7d07fd 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 \ @@ -88,9 +87,8 @@ Install Requirements wget \ # necessary for cuda install with `run` file which # necessary for cuda install with `run` file -Ubuntu 20.04 +Ubuntu 22.04 ^^^^^^^^^^^^ -End of Life: April 2030 Install Requirements .. code-block:: bash @@ -98,9 +96,7 @@ Install Requirements sudo apt update && sudo apt install \ build-essential \ cmake \ - g++-10 \ - libayatana-appindicator3-dev \ - libavdevice-dev \ + libappindicator3-dev \ libboost-filesystem-dev \ libboost-locale-dev \ libboost-log-dev \ @@ -117,7 +113,6 @@ Install Requirements libpulse-dev \ libssl-dev \ libva-dev \ # VA-API - libvdpau-dev \ libwayland-dev \ # Wayland libx11-dev \ # X11 libxcb-shm0-dev \ # X11 @@ -128,21 +123,11 @@ Install Requirements libxtst-dev \ # X11 nodejs \ npm \ - wget # necessary for cuda install with `run` file - -Update gcc alias - .. code-block:: bash - - update-alternatives --install \ - /usr/bin/gcc gcc /usr/bin/gcc-10 100 \ - --slave /usr/bin/g++ g++ /usr/bin/g++-10 \ - --slave /usr/bin/gcov gcov /usr/bin/gcov-10 \ - --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-10 \ - --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-10 + nvidia-cuda-dev \ # CUDA, NvFBC + nvidia-cuda-toolkit # CUDA, NvFBC -Ubuntu 22.04 +Ubuntu 24.04 ^^^^^^^^^^^^ -End of Life: April 2027 Install Requirements .. code-block:: bash @@ -150,8 +135,9 @@ Install Requirements sudo apt update && sudo apt install \ build-essential \ cmake \ + gcc-11 \ + g++-11 \ libappindicator3-dev \ - libavdevice-dev \ libboost-filesystem-dev \ libboost-locale-dev \ libboost-log-dev \ @@ -181,11 +167,22 @@ Install Requirements nvidia-cuda-dev \ # CUDA, NvFBC nvidia-cuda-toolkit # CUDA, NvFBC +Update gcc alias + .. code-block:: bash + + update-alternatives --install \ + /usr/bin/gcc gcc /usr/bin/gcc-11 100 \ + --slave /usr/bin/g++ g++ /usr/bin/g++-11 \ + --slave /usr/bin/gcov gcov /usr/bin/gcov-11 \ + --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-11 \ + --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-11 + CUDA ---- If the version of CUDA available from your distro is not adequate, manually install CUDA. .. tip:: The version of CUDA you use will determine compatibility with various GPU generations. + At the time of writing, the recommended version to use is CUDA ~11.8. See `CUDA compatibility `__ for more info. Select the appropriate run file based on your desired CUDA version and architecture according to diff --git a/docs/source/building/windows.rst b/docs/source/building/windows.rst index c49bd1f32bc..8b1e8c40371 100644 --- a/docs/source/building/windows.rst +++ b/docs/source/building/windows.rst @@ -3,7 +3,7 @@ Windows Requirements ------------ -First you need to install `MSYS2 `__, then startup "MSYS2 UCRT64" and execute the following +First you need to install `MSYS2 `__, then startup "MSYS2 MinGW 64-bit" and execute the following codes. Update all packages: @@ -15,22 +15,26 @@ Install dependencies: .. code-block:: bash pacman -S \ + base-devel \ + cmake \ + diffutils \ doxygen \ + gcc \ git \ - mingw-w64-ucrt-x86_64-boost \ - mingw-w64-ucrt-x86_64-cmake \ - mingw-w64-ucrt-x86_64-cppwinrt \ - mingw-w64-ucrt-x86_64-curl \ - mingw-w64-ucrt-x86_64-graphviz \ - mingw-w64-ucrt-x86_64-miniupnpc \ - mingw-w64-ucrt-x86_64-nlohmann-json \ - mingw-w64-ucrt-x86_64-nodejs \ - mingw-w64-ucrt-x86_64-nsis \ - mingw-w64-ucrt-x86_64-onevpl \ - mingw-w64-ucrt-x86_64-openssl \ - mingw-w64-ucrt-x86_64-opus \ - mingw-w64-ucrt-x86_64-rust \ - mingw-w64-ucrt-x86_64-toolchain \ + 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-graphviz \ + 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 \ python \ python-pip make \ diff --git a/docs/source/contributing/localization.rst b/docs/source/contributing/localization.rst index 0148b8170e4..21cd330e487 100644 --- a/docs/source/contributing/localization.rst +++ b/docs/source/contributing/localization.rst @@ -48,6 +48,11 @@ Extraction .. note:: The json keys should be sorted alphabetically. You can use `jsonabc `__ to sort the keys. + .. attention:: Due to the integration with Crowdin, it is important to only add strings to the `en.json` file, + and to not modify any other language files. After the PR is merged, the translations can take place + on `CrowdIn `__. Once the translations are complete, a PR will be made + to merge the translations into Sunshine. + - Use the string in a Vue component. .. code-block:: html @@ -101,3 +106,8 @@ Extraction .. code-block:: bash python ./scripts/_locale.py --compile + + .. attention:: Due to the integration with Crowdin, it is important to not include any extracted or compiled files in + Pull Requests. The files are automatically generated and updated by the workflow. Once the PR is merged, the + translations can take place on `CrowdIn `__. Once the translations are + complete, a PR will be made to merge the translations into Sunshine. diff --git a/package.json b/package.json index 706c23384ce..db309cb7ec9 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,13 @@ "dev": "vite build --watch" }, "dependencies": { - "@fortawesome/fontawesome-free": "6.5.1", + "@fortawesome/fontawesome-free": "6.5.2", "@popperjs/core": "2.11.8", "@vitejs/plugin-vue": "4.6.2", "bootstrap": "5.3.3", "vite": "4.5.2", "vite-plugin-ejs": "1.6.4", "vue": "3.4.5", - "vue-i18n": "9.10.2" + "vue-i18n": "9.11.0" } } diff --git a/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp b/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp index 644487fc314..6e295e63074 160000 --- a/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp +++ b/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp @@ -1 +1 @@ -Subproject commit 644487fc314a069d06219b754b04c39a807ca8d9 +Subproject commit 6e295e630740ae8ef82c6291724e709b36477042 diff --git a/packaging/macos/sunshine.rb b/packaging/macos/sunshine.rb index ca8c7e26d11..1853c0c8c75 100644 --- a/packaging/macos/sunshine.rb +++ b/packaging/macos/sunshine.rb @@ -7,7 +7,7 @@ class @PROJECT_NAME@ < Formula tag: "@GITHUB_BRANCH@" version "@PROJECT_VERSION@" license all_of: ["GPL-3.0-only"] - head "@GITHUB_CLONE_URL@", branch: "nightly" + head "@GITHUB_CLONE_URL@", branch: "@GITHUB_DEFAULT_BRANCH@" depends_on "boost" => :build depends_on "cmake" => :build diff --git a/scripts/_locale.py b/scripts/_locale.py index d967974e3f5..884805702e5 100644 --- a/scripts/_locale.py +++ b/scripts/_locale.py @@ -22,16 +22,19 @@ year = datetime.datetime.now().year -# retroarcher target locales +# target locales target_locales = [ - 'de', # Deutsch + 'de', # German 'en', # English 'en_GB', # English (United Kingdom) 'en_US', # English (United States) - 'es', # español - 'fr', # français - 'it', # italiano - 'ru', # русский + 'es', # Spanish + 'fr', # French + 'it', # Italian + 'ja', # Japanese + 'ru', # Russian + 'sv', # Swedish + 'zh', # Chinese ] diff --git a/src/config.cpp b/src/config.cpp index 04efadc20b1..e2bad7b1984 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -86,14 +86,17 @@ namespace config { #define AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY 1 #define AMF_VIDEO_ENCODER_AV1_USAGE_ULTRA_LOW_LATENCY 2 #define AMF_VIDEO_ENCODER_AV1_USAGE_WEBCAM 3 - #define AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING 0 + #define AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY_HIGH_QUALITY 5 + #define AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING 0 #define AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY 1 #define AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY 2 #define AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM 3 - #define AMF_VIDEO_ENCODER_USAGE_TRANSCONDING 0 + #define AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY 5 + #define AMF_VIDEO_ENCODER_USAGE_TRANSCODING 0 #define AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY 1 #define AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY 2 #define AMF_VIDEO_ENCODER_USAGE_WEBCAM 3 + #define AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY 5 #define AMF_VIDEO_ENCODER_UNDEFINED 0 #define AMF_VIDEO_ENCODER_CABAC 1 #define AMF_VIDEO_ENCODER_CALV 2 @@ -145,20 +148,23 @@ namespace config { enum class usage_av1_e : int { transcoding = AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING, webcam = AMF_VIDEO_ENCODER_AV1_USAGE_WEBCAM, + lowlatency_high_quality = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY_HIGH_QUALITY, lowlatency = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY, ultralowlatency = AMF_VIDEO_ENCODER_AV1_USAGE_ULTRA_LOW_LATENCY }; enum class usage_hevc_e : int { - transcoding = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING, + transcoding = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING, webcam = AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM, + lowlatency_high_quality = AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY, lowlatency = AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY, ultralowlatency = AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY }; enum class usage_h264_e : int { - transcoding = AMF_VIDEO_ENCODER_USAGE_TRANSCONDING, + transcoding = AMF_VIDEO_ENCODER_USAGE_TRANSCODING, webcam = AMF_VIDEO_ENCODER_USAGE_WEBCAM, + lowlatency_high_quality = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY, lowlatency = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY, ultralowlatency = AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY }; @@ -196,12 +202,13 @@ namespace config { template std::optional - usage_from_view(const std::string_view &rc) { + usage_from_view(const std::string_view &usage) { #define _CONVERT_(x) \ - if (rc == #x##sv) return (int) T::x + if (usage == #x##sv) return (int) T::x _CONVERT_(transcoding); _CONVERT_(webcam); _CONVERT_(lowlatency); + _CONVERT_(lowlatency_high_quality); _CONVERT_(ultralowlatency); #undef _CONVERT_ return std::nullopt; @@ -347,14 +354,15 @@ namespace config { (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::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) + (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) 0, // preanalysis 1, // vbaq + 1, // enforce_hrd (int) amd::coder_e::_auto, // coder }, // amd @@ -1034,13 +1042,14 @@ namespace config { std::string usage; string_f(vars, "amd_usage", usage); if (!usage.empty()) { - video.amd.amd_usage_h264 = amd::usage_from_view(rc); - video.amd.amd_usage_hevc = amd::usage_from_view(rc); - video.amd.amd_usage_av1 = amd::usage_from_view(rc); + 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); } bool_f(vars, "amd_preanalysis", (bool &) video.amd.amd_preanalysis); bool_f(vars, "amd_vbaq", (bool &) video.amd.amd_vbaq); + bool_f(vars, "amd_enforce_hrd", (bool &) video.amd.amd_enforce_hrd); int_f(vars, "vt_coder", video.vt.vt_coder, vt::coder_from_view); int_f(vars, "vt_software", video.vt.vt_allow_sw, vt::allow_software_from_view); @@ -1161,6 +1170,7 @@ namespace config { "es"sv, // Spanish "fr"sv, // French "it"sv, // Italian + "ja"sv, // Japanese "ru"sv, // Russian "sv"sv, // Swedish "zh"sv, // Chinese @@ -1226,7 +1236,7 @@ namespace config { auto line = argv[x]; if (line == "--help"sv) { - print_help(*argv); + logging::print_help(*argv); return 1; } #ifdef _WIN32 @@ -1246,7 +1256,7 @@ namespace config { break; } if (apply_flags(line + 1)) { - print_help(*argv); + logging::print_help(*argv); return -1; } } @@ -1260,7 +1270,7 @@ namespace config { else { TUPLE_EL(var, 1, parse_option(line, line_end)); if (!var) { - print_help(*argv); + logging::print_help(*argv); return -1; } diff --git a/src/config.h b/src/config.h index d24bf39af43..1e1e1e911e3 100644 --- a/src/config.h +++ b/src/config.h @@ -59,6 +59,7 @@ namespace config { std::optional amd_usage_av1; std::optional amd_preanalysis; std::optional amd_vbaq; + std::optional amd_enforce_hrd; int amd_coder; } amd; diff --git a/src/crypto.cpp b/src/crypto.cpp index e92e6e9e7db..9a5ef5a474e 100644 --- a/src/crypto.cpp +++ b/src/crypto.cpp @@ -17,6 +17,10 @@ namespace crypto { X509_STORE_add_cert(x509_store.get(), cert.get()); _certs.emplace_back(std::make_pair(std::move(cert), std::move(x509_store))); } + void + cert_chain_t::clear() { + _certs.clear(); + } static int openssl_verify_cb(int ok, X509_STORE_CTX *ctx) { diff --git a/src/crypto.h b/src/crypto.h index eb355f576c8..410d3c802a5 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -73,6 +73,9 @@ namespace crypto { void add(x509_t &&cert); + void + clear(); + const char * verify(x509_t::element_type *cert); diff --git a/src/entry_handler.cpp b/src/entry_handler.cpp index 146a4dfb07b..8d17b7d270a 100644 --- a/src/entry_handler.cpp +++ b/src/entry_handler.cpp @@ -87,12 +87,12 @@ namespace args { * * EXAMPLES: * ```cpp - * print_help("sunshine", 0, nullptr); + * help("sunshine", 0, nullptr); * ``` */ int help(const char *name, int argc, char *argv[]) { - print_help(name); + logging::print_help(name); return 0; } @@ -109,7 +109,7 @@ namespace args { */ int version(const char *name, int argc, char *argv[]) { - std::cout << PROJECT_NAME << " version: v" << PROJECT_VER << std::endl; + // version was already logged at startup return 0; } diff --git a/src/input.cpp b/src/input.cpp index 89f7291f11a..2e26d5b00a8 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 bc9fea8479f..33a9ee42741 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/logging.cpp b/src/logging.cpp index 70a2ae82a00..e03bcbf5134 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -4,9 +4,11 @@ */ // standard includes +#include #include // lib includes +#include #include #include #include @@ -16,6 +18,10 @@ // local includes #include "logging.h" +extern "C" { +#include +} + using namespace std::literals; namespace bl = boost::log; @@ -29,45 +35,182 @@ bl::sources::severity_logger warning(3); // Strange events bl::sources::severity_logger error(4); // Recoverable errors bl::sources::severity_logger fatal(5); // Unrecoverable errors -/** - * @brief Flush the log. - * - * EXAMPLES: - * ```cpp - * log_flush(); - * ``` - */ -void -log_flush() { - sink->flush(); -} +BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", int) -/** - * @brief Print help to stdout. - * @param name The name of the program. - * - * EXAMPLES: - * ```cpp - * print_help("sunshine"); - * ``` - */ -void -print_help(const char *name) { - std::cout - << "Usage: "sv << name << " [options] [/path/to/configuration_file] [--cmd]"sv << std::endl - << " Any configurable option can be overwritten with: \"name=value\""sv << std::endl - << std::endl - << " Note: The configuration will be created if it doesn't exist."sv << std::endl - << std::endl - << " --help | print help"sv << std::endl - << " --creds username password | set user credentials for the Web manager"sv << std::endl - << " --version | print the version of sunshine"sv << std::endl - << std::endl - << " flags"sv << std::endl - << " -0 | Read PIN from stdin"sv << std::endl - << " -1 | Do not load previously saved state and do retain any state after shutdown"sv << std::endl - << " | Effectively starting as if for the first time without overwriting any pairings with your devices"sv << std::endl - << " -2 | Force replacement of headers in video stream"sv << std::endl - << " -p | Enable/Disable UPnP"sv << std::endl - << std::endl; -} +namespace logging { + /** + * @brief A destructor that restores the initial state. + */ + deinit_t::~deinit_t() { + deinit(); + } + + /** + * @brief Deinitialize the logging system. + * + * EXAMPLES: + * ```cpp + * deinit(); + * ``` + */ + void + deinit() { + log_flush(); + bl::core::get()->remove_sink(sink); + sink.reset(); + } + + /** + * @brief Initialize the logging system. + * @param min_log_level The minimum log level to output. + * @param log_file The log file to write to. + * @returns A deinit_t object that will deinitialize the logging system when it goes out of scope. + * + * EXAMPLES: + * ```cpp + * log_init(2, "sunshine.log"); + * ``` + */ + [[nodiscard]] std::unique_ptr + init(int min_log_level, const std::string &log_file) { + if (sink) { + // Deinitialize the logging system before reinitializing it. This can probably only ever be hit in tests. + deinit(); + } + + setup_av_logging(min_log_level); + + sink = boost::make_shared(); + + boost::shared_ptr stream { &std::cout, boost::null_deleter() }; + sink->locked_backend()->add_stream(stream); + sink->locked_backend()->add_stream(boost::make_shared(log_file)); + sink->set_filter(severity >= min_log_level); + + sink->set_formatter([](const bl::record_view &view, bl::formatting_ostream &os) { + constexpr const char *message = "Message"; + constexpr const char *severity = "Severity"; + constexpr int DATE_BUFFER_SIZE = 21 + 2 + 1; // Full string plus ": \0" + + auto log_level = view.attribute_values()[severity].extract().get(); + + std::string_view log_type; + switch (log_level) { + case 0: + log_type = "Verbose: "sv; + break; + case 1: + log_type = "Debug: "sv; + break; + case 2: + log_type = "Info: "sv; + break; + case 3: + log_type = "Warning: "sv; + break; + case 4: + log_type = "Error: "sv; + break; + case 5: + log_type = "Fatal: "sv; + break; + }; + + char _date[DATE_BUFFER_SIZE]; + std::time_t t = std::time(nullptr); + strftime(_date, DATE_BUFFER_SIZE, "[%Y:%m:%d:%H:%M:%S]: ", std::localtime(&t)); + + os << _date << log_type << view.attribute_values()[message].extract(); + }); + + // Flush after each log record to ensure log file contents on disk isn't stale. + // This is particularly important when running from a Windows service. + sink->locked_backend()->auto_flush(true); + + bl::core::get()->add_sink(sink); + return std::make_unique(); + } + + /** + * @brief Setup AV logging. + * @param min_log_level The log level. + */ + void + setup_av_logging(int min_log_level) { + if (min_log_level >= 1) { + av_log_set_level(AV_LOG_QUIET); + } + else { + av_log_set_level(AV_LOG_DEBUG); + } + av_log_set_callback([](void *ptr, int level, const char *fmt, va_list vl) { + static int print_prefix = 1; + char buffer[1024]; + + av_log_format_line(ptr, level, fmt, vl, buffer, sizeof(buffer), &print_prefix); + if (level <= AV_LOG_ERROR) { + // We print AV_LOG_FATAL at the error level. FFmpeg prints things as fatal that + // are expected in some cases, such as lack of codec support or similar things. + BOOST_LOG(error) << buffer; + } + else if (level <= AV_LOG_WARNING) { + BOOST_LOG(warning) << buffer; + } + else if (level <= AV_LOG_INFO) { + BOOST_LOG(info) << buffer; + } + else if (level <= AV_LOG_VERBOSE) { + // AV_LOG_VERBOSE is less verbose than AV_LOG_DEBUG + BOOST_LOG(debug) << buffer; + } + else { + BOOST_LOG(verbose) << buffer; + } + }); + } + + /** + * @brief Flush the log. + * + * EXAMPLES: + * ```cpp + * log_flush(); + * ``` + */ + void + log_flush() { + if (sink) { + sink->flush(); + } + } + + /** + * @brief Print help to stdout. + * @param name The name of the program. + * + * EXAMPLES: + * ```cpp + * print_help("sunshine"); + * ``` + */ + void + print_help(const char *name) { + std::cout + << "Usage: "sv << name << " [options] [/path/to/configuration_file] [--cmd]"sv << std::endl + << " Any configurable option can be overwritten with: \"name=value\""sv << std::endl + << std::endl + << " Note: The configuration will be created if it doesn't exist."sv << std::endl + << std::endl + << " --help | print help"sv << std::endl + << " --creds username password | set user credentials for the Web manager"sv << std::endl + << " --version | print the version of sunshine"sv << std::endl + << std::endl + << " flags"sv << std::endl + << " -0 | Read PIN from stdin"sv << std::endl + << " -1 | Do not load previously saved state and do retain any state after shutdown"sv << std::endl + << " | Effectively starting as if for the first time without overwriting any pairings with your devices"sv << std::endl + << " -2 | Force replacement of headers in video stream"sv << std::endl + << " -p | Enable/Disable UPnP"sv << std::endl + << std::endl; + } +} // namespace logging diff --git a/src/logging.h b/src/logging.h index 47a08555a0b..24f9d169082 100644 --- a/src/logging.h +++ b/src/logging.h @@ -10,7 +10,6 @@ #include #include -extern boost::shared_ptr> sink; using text_sink = boost::log::sinks::asynchronous_sink; extern boost::log::sources::severity_logger verbose; @@ -20,8 +19,20 @@ extern boost::log::sources::severity_logger warning; extern boost::log::sources::severity_logger error; extern boost::log::sources::severity_logger fatal; -// functions -void -log_flush(); -void -print_help(const char *name); +namespace logging { + class deinit_t { + public: + ~deinit_t(); + }; + + void + deinit(); + [[nodiscard]] std::unique_ptr + init(int min_log_level, const std::string &log_file); + void + setup_av_logging(int min_log_level); + void + log_flush(); + void + print_help(const char *name); +} // namespace logging diff --git a/src/main.cpp b/src/main.cpp index a56886d1035..5f8cb5dc861 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,13 +4,11 @@ */ // standard includes +#include #include #include #include -// lib includes -#include - // local includes #include "confighttp.h" #include "display_device/session.h" @@ -27,19 +25,10 @@ #include "video.h" extern "C" { -#include #include } using namespace std::literals; -namespace bl = boost::log; - -struct NoDelete { - void - operator()(void *) {} -}; - -BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", int) std::map> signal_handlers; void @@ -119,84 +108,10 @@ main(int argc, char *argv[]) { return 0; } - if (config::sunshine.min_log_level >= 1) { - av_log_set_level(AV_LOG_QUIET); - } - else { - av_log_set_level(AV_LOG_DEBUG); + auto log_deinit_guard = logging::init(config::sunshine.min_log_level, config::sunshine.log_file); + if (!log_deinit_guard) { + BOOST_LOG(error) << "Logging failed to initialize"sv; } - av_log_set_callback([](void *ptr, int level, const char *fmt, va_list vl) { - static int print_prefix = 1; - char buffer[1024]; - - av_log_format_line(ptr, level, fmt, vl, buffer, sizeof(buffer), &print_prefix); - if (level <= AV_LOG_ERROR) { - // We print AV_LOG_FATAL at the error level. FFmpeg prints things as fatal that - // are expected in some cases, such as lack of codec support or similar things. - BOOST_LOG(error) << buffer; - } - else if (level <= AV_LOG_WARNING) { - BOOST_LOG(warning) << buffer; - } - else if (level <= AV_LOG_INFO) { - BOOST_LOG(info) << buffer; - } - else if (level <= AV_LOG_VERBOSE) { - // AV_LOG_VERBOSE is less verbose than AV_LOG_DEBUG - BOOST_LOG(debug) << buffer; - } - else { - BOOST_LOG(verbose) << buffer; - } - }); - - sink = boost::make_shared(); - - boost::shared_ptr stream { &std::cout, NoDelete {} }; - sink->locked_backend()->add_stream(stream); - sink->locked_backend()->add_stream(boost::make_shared(config::sunshine.log_file)); - sink->set_filter(severity >= config::sunshine.min_log_level); - - sink->set_formatter([message = "Message"s, severity = "Severity"s](const bl::record_view &view, bl::formatting_ostream &os) { - constexpr int DATE_BUFFER_SIZE = 21 + 2 + 1; // Full string plus ": \0" - - auto log_level = view.attribute_values()[severity].extract().get(); - - std::string_view log_type; - switch (log_level) { - case 0: - log_type = "Verbose: "sv; - break; - case 1: - log_type = "Debug: "sv; - break; - case 2: - log_type = "Info: "sv; - break; - case 3: - log_type = "Warning: "sv; - break; - case 4: - log_type = "Error: "sv; - break; - case 5: - log_type = "Fatal: "sv; - break; - }; - - char _date[DATE_BUFFER_SIZE]; - std::time_t t = std::time(nullptr); - strftime(_date, DATE_BUFFER_SIZE, "[%Y:%m:%d:%H:%M:%S]: ", std::localtime(&t)); - - os << _date << log_type << view.attribute_values()[message].extract(); - }); - - // Flush after each log record to ensure log file contents on disk isn't stale. - // This is particularly important when running from a Windows service. - sink->locked_backend()->auto_flush(true); - - bl::core::get()->add_sink(sink); - auto fg = util::fail_guard(log_flush); // logging can begin at this point // if anything is logged prior to this point, it will appear in stdout, but not in the log viewer in the UI @@ -236,7 +151,7 @@ main(int argc, char *argv[]) { nvprefs_instance.modify_application_profile(); // Modify global settings, undo file is produced in the process to restore after improper termination nvprefs_instance.modify_global_profile(); - // Unload dynamic library to survive driver reinstallation + // Unload dynamic library to survive driver re-installation nvprefs_instance.unload(); } @@ -329,7 +244,7 @@ main(int argc, char *argv[]) { auto task = []() { BOOST_LOG(fatal) << "10 seconds passed, yet Sunshine's still running: Forcing shutdown"sv; - log_flush(); + logging::log_flush(); lifetime::debug_trap(); }; force_shutdown = task_pool.pushDelayed(task, 10s).task_id; @@ -343,7 +258,7 @@ main(int argc, char *argv[]) { auto task = []() { BOOST_LOG(fatal) << "10 seconds passed, yet Sunshine's still running: Forcing shutdown"sv; - log_flush(); + logging::log_flush(); lifetime::debug_trap(); }; force_shutdown = task_pool.pushDelayed(task, 10s).task_id; @@ -357,8 +272,8 @@ main(int argc, char *argv[]) { // If any of the following fail, we log an error and continue event though sunshine will not function correctly. // This allows access to the UI to fix configuration problems or view the logs. - auto deinit_guard = platf::init(); - if (!deinit_guard) { + auto platf_deinit_guard = platf::init(); + if (!platf_deinit_guard) { BOOST_LOG(error) << "Platform failed to initialize"sv; } diff --git a/src/nvhttp.cpp b/src/nvhttp.cpp index 7b81469594d..03c3097e5db 100644 --- a/src/nvhttp.cpp +++ b/src/nvhttp.cpp @@ -43,6 +43,8 @@ namespace nvhttp { namespace fs = std::filesystem; namespace pt = boost::property_tree; + crypto::cert_chain_t cert_chain; + class SunshineHttpsServer: public SimpleWeb::Server { public: SunshineHttpsServer(const std::string &certification_file, const std::string &private_key_file): @@ -1041,7 +1043,6 @@ namespace nvhttp { conf_intern.pkey = file_handler::read_file(config::nvhttp.pkey.c_str()); conf_intern.servercert = file_handler::read_file(config::nvhttp.cert.c_str()); - crypto::cert_chain_t cert_chain; for (auto &[_, client] : map_id_client) { for (auto &cert : client.certs) { cert_chain.add(crypto::x509(cert)); @@ -1050,15 +1051,15 @@ namespace nvhttp { auto add_cert = std::make_shared>(30); - // /resume doesn't always get the parameter "localAudioPlayMode" - // /launch will store it in host_audio + // resume doesn't always get the parameter "localAudioPlayMode" + // launch will store it in host_audio bool host_audio {}; https_server_t https_server { config::nvhttp.cert, config::nvhttp.pkey }; http_server_t http_server; // Verify certificates after establishing connection - https_server.verify = [&cert_chain, add_cert](SSL *ssl) { + https_server.verify = [add_cert](SSL *ssl) { crypto::x509_t x509 { SSL_get_peer_certificate(ssl) }; if (!x509) { BOOST_LOG(info) << "unknown -- denied"sv; @@ -1172,6 +1173,7 @@ namespace nvhttp { void erase_all_clients() { map_id_client.clear(); + cert_chain.clear(); save_state(); } } // namespace nvhttp diff --git a/src/platform/common.h b/src/platform/common.h index 7a4102ad5ba..007f7ece61b 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 33c939243f2..ee535d21d2a 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/graphics.cpp b/src/platform/linux/graphics.cpp index 1dbc36bf00c..2cd81dd451e 100644 --- a/src/platform/linux/graphics.cpp +++ b/src/platform/linux/graphics.cpp @@ -39,7 +39,7 @@ namespace gl { } tex_t::~tex_t() { - if (!size() == 0) { + if (size() != 0) { ctx.DeleteTextures(size(), begin()); } } diff --git a/src/platform/linux/input.cpp b/src/platform/linux/input.cpp index 42e239980d8..74d683048f8 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 d4feb3557d8..30a2470f2d3 100644 --- a/src/platform/linux/kmsgrab.cpp +++ b/src/platform/linux/kmsgrab.cpp @@ -1069,7 +1069,7 @@ namespace platf { } inline capture_e - refresh(file_t *file, egl::surface_descriptor_t *sd) { + refresh(file_t *file, egl::surface_descriptor_t *sd, std::optional &frame_timestamp) { // Check for a change in HDR metadata if (connector_id) { auto connector_props = card.connector_props(*connector_id); @@ -1080,6 +1080,7 @@ namespace platf { } plane_t plane = drmModeGetPlane(card.fd.el, plane_id); + frame_timestamp = std::chrono::steady_clock::now(); auto fb = card.fb(plane.get()); if (!fb) { @@ -1192,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); @@ -1303,7 +1309,8 @@ namespace platf { egl::surface_descriptor_t sd; - auto status = refresh(fb_fd, &sd); + std::optional frame_timestamp; + auto status = refresh(fb_fd, &sd, frame_timestamp); if (status != capture_e::ok) { return status; } @@ -1330,6 +1337,8 @@ namespace platf { gl::ctx.GetTextureSubImage(rgb->tex[0], 0, img_offset_x, img_offset_y, 0, width, height, 1, GL_BGRA, GL_UNSIGNED_BYTE, img_out->height * img_out->row_pitch, img_out->data); + img_out->frame_timestamp = frame_timestamp; + if (cursor && captured_cursor.visible) { blend_cursor(*img_out); } @@ -1408,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); @@ -1456,7 +1470,7 @@ namespace platf { auto img = (egl::img_descriptor_t *) img_out.get(); img->reset(); - auto status = refresh(fb_fd, &img->sd); + auto status = refresh(fb_fd, &img->sd, img->frame_timestamp); if (status != capture_e::ok) { return status; } @@ -1671,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 2ea15359fc3..a6ac4adbb96 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 1167d3f5809..0d4c3d38c30 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); @@ -535,6 +540,7 @@ namespace platf { auto img = (x11_img_t *) img_out.get(); XImage *x_img { x11::GetImage(xdisplay.get(), xwindow, offset_x, offset_y, width, height, AllPlanes, ZPixmap) }; + img->frame_timestamp = std::chrono::steady_clock::now(); img->width = x_img->width; img->height = x_img->height; @@ -621,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.h b/src/platform/windows/display.h index 1a3e7b5817f..2d480c5954c 100644 --- a/src/platform/windows/display.h +++ b/src/platform/windows/display.h @@ -11,9 +11,6 @@ #include #include -#include -#include - #include "src/platform/common.h" #include "src/utility.h" #include "src/video.h" @@ -156,6 +153,22 @@ namespace platf::dxgi { bool visible; }; + class duplication_t { + public: + dup_t dup; + bool has_frame {}; + std::chrono::steady_clock::time_point last_protected_content_warning_time {}; + + capture_e + next_frame(DXGI_OUTDUPL_FRAME_INFO &frame_info, std::chrono::milliseconds timeout, resource_t::pointer *res_p); + capture_e + reset(dup_t::pointer dup_p = dup_t::pointer()); + capture_e + release_frame(); + + ~duplication_t(); + }; + class display_base_t: public display_t { public: int @@ -172,6 +185,7 @@ namespace platf::dxgi { output_t output; device_t device; device_ctx_t device_ctx; + duplication_t dup; DXGI_RATIONAL display_refresh_rate; int display_refresh_rate_rounded; @@ -239,32 +253,30 @@ namespace platf::dxgi { virtual bool get_hdr_metadata(SS_HDR_METADATA &metadata) override; - const char * - dxgi_format_to_string(DXGI_FORMAT format); - const char * - colorspace_to_string(DXGI_COLOR_SPACE_TYPE type); - virtual std::vector - get_supported_capture_formats() = 0; - protected: int get_pixel_pitch() { return (capture_format == DXGI_FORMAT_R16G16B16A16_FLOAT) ? 8 : 4; } + const char * + dxgi_format_to_string(DXGI_FORMAT format); + const char * + colorspace_to_string(DXGI_COLOR_SPACE_TYPE type); + virtual capture_e snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) = 0; - virtual capture_e - release_snapshot() = 0; virtual int complete_img(img_t *img, bool dummy) = 0; + virtual std::vector + get_supported_capture_formats() = 0; }; - /** - * Display component for devices that use software encoders. - */ class display_ram_t: public display_base_t { public: + virtual capture_e + snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override; + std::shared_ptr alloc_img() override; int @@ -274,18 +286,22 @@ namespace platf::dxgi { std::vector get_supported_capture_formats() override; + int + init(const ::video::config_t &config, const std::string &display_name); + std::unique_ptr make_avcodec_encode_device(pix_fmt_e pix_fmt) override; + cursor_t cursor; D3D11_MAPPED_SUBRESOURCE img_info; texture2d_t texture; }; - /** - * Display component for devices that use hardware encoders. - */ class display_vram_t: public display_base_t, public std::enable_shared_from_this { public: + virtual capture_e + snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override; + std::shared_ptr alloc_img() override; int @@ -295,6 +311,9 @@ namespace platf::dxgi { std::vector get_supported_capture_formats() override; + int + init(const ::video::config_t &config, const std::string &display_name); + bool is_codec_supported(std::string_view name, const ::video::config_t &config) override; @@ -304,59 +323,6 @@ namespace platf::dxgi { std::unique_ptr make_nvenc_encode_device(pix_fmt_e pix_fmt) override; - std::atomic next_image_id; - }; - - /** - * Display duplicator that uses the DirectX Desktop Duplication API. - */ - class duplication_t { - public: - dup_t dup; - bool has_frame {}; - std::chrono::steady_clock::time_point last_protected_content_warning_time {}; - - int - init(display_base_t *display, const ::video::config_t &config); - capture_e - next_frame(DXGI_OUTDUPL_FRAME_INFO &frame_info, std::chrono::milliseconds timeout, resource_t::pointer *res_p); - capture_e - reset(dup_t::pointer dup_p = dup_t::pointer()); - capture_e - release_frame(); - - ~duplication_t(); - }; - - /** - * Display backend that uses DDAPI with a software encoder. - */ - class display_ddup_ram_t: public display_ram_t { - public: - int - init(const ::video::config_t &config, const std::string &display_name); - capture_e - snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override; - capture_e - release_snapshot() override; - - duplication_t dup; - cursor_t cursor; - }; - - /** - * Display backend that uses DDAPI with a hardware encoder. - */ - class display_ddup_vram_t: public display_vram_t { - public: - int - init(const ::video::config_t &config, const std::string &display_name); - capture_e - snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override; - capture_e - release_snapshot() override; - - duplication_t dup; sampler_state_t sampler_linear; blend_t blend_alpha; @@ -372,64 +338,7 @@ namespace platf::dxgi { texture2d_t old_surface_delayed_destruction; std::chrono::steady_clock::time_point old_surface_timestamp; std::variant> last_frame_variant; - }; - - /** - * Display duplicator that uses the Windows.Graphics.Capture API. - */ - class wgc_capture_t { - winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice uwp_device { nullptr }; - winrt::Windows::Graphics::Capture::GraphicsCaptureItem item { nullptr }; - winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool frame_pool { nullptr }; - winrt::Windows::Graphics::Capture::GraphicsCaptureSession capture_session { nullptr }; - winrt::Windows::Graphics::Capture::Direct3D11CaptureFrame produced_frame { nullptr }, consumed_frame { nullptr }; - SRWLOCK frame_lock = SRWLOCK_INIT; - CONDITION_VARIABLE frame_present_cv; - void - on_frame_arrived(winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool const &sender, winrt::Windows::Foundation::IInspectable const &); - - public: - wgc_capture_t(); - ~wgc_capture_t(); - - int - init(display_base_t *display, const ::video::config_t &config); - capture_e - next_frame(std::chrono::milliseconds timeout, ID3D11Texture2D **out, uint64_t &out_time); - capture_e - release_frame(); - int - set_cursor_visible(bool); - }; - - /** - * Display backend that uses Windows.Graphics.Capture with a software encoder. - */ - class display_wgc_ram_t: public display_ram_t { - wgc_capture_t dup; - - public: - int - init(const ::video::config_t &config, const std::string &display_name); - capture_e - snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override; - capture_e - release_snapshot() override; - }; - - /** - * Display backend that uses Windows.Graphics.Capture with a hardware encoder. - */ - class display_wgc_vram_t: public display_vram_t { - wgc_capture_t dup; - - public: - int - init(const ::video::config_t &config, const std::string &display_name); - capture_e - snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override; - capture_e - release_snapshot() override; + std::atomic next_image_id; }; } // namespace platf::dxgi diff --git a/src/platform/windows/display_base.cpp b/src/platform/windows/display_base.cpp index a56dcd5e157..12113589943 100644 --- a/src/platform/windows/display_base.cpp +++ b/src/platform/windows/display_base.cpp @@ -27,91 +27,6 @@ namespace platf { namespace platf::dxgi { namespace bp = boost::process; - /** - * DDAPI-specific initialization goes here. - */ - int - duplication_t::init(display_base_t *display, const ::video::config_t &config) { - HRESULT status; - - // Capture format will be determined from the first call to AcquireNextFrame() - display->capture_format = DXGI_FORMAT_UNKNOWN; - - // FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD - { - // IDXGIOutput5 is optional, but can provide improved performance and wide color support - dxgi::output5_t output5 {}; - status = display->output->QueryInterface(IID_IDXGIOutput5, (void **) &output5); - if (SUCCEEDED(status)) { - // Ask the display implementation which formats it supports - auto supported_formats = display->get_supported_capture_formats(); - if (supported_formats.empty()) { - BOOST_LOG(warning) << "No compatible capture formats for this encoder"sv; - return -1; - } - - // We try this twice, in case we still get an error on reinitialization - for (int x = 0; x < 2; ++x) { - // Ensure we can duplicate the current display - syncThreadDesktop(); - - status = output5->DuplicateOutput1((IUnknown *) display->device.get(), 0, supported_formats.size(), supported_formats.data(), &dup); - if (SUCCEEDED(status)) { - break; - } - std::this_thread::sleep_for(200ms); - } - - // We don't retry with DuplicateOutput() because we can hit this codepath when we're racing - // with mode changes and we don't want to accidentally fall back to suboptimal capture if - // we get unlucky and succeed below. - if (FAILED(status)) { - BOOST_LOG(warning) << "DuplicateOutput1 Failed [0x"sv << util::hex(status).to_string_view() << ']'; - return -1; - } - } - else { - BOOST_LOG(warning) << "IDXGIOutput5 is not supported by your OS. Capture performance may be reduced."sv; - - dxgi::output1_t output1 {}; - status = display->output->QueryInterface(IID_IDXGIOutput1, (void **) &output1); - if (FAILED(status)) { - BOOST_LOG(error) << "Failed to query IDXGIOutput1 from the output"sv; - return -1; - } - - for (int x = 0; x < 2; ++x) { - // Ensure we can duplicate the current display - syncThreadDesktop(); - - status = output1->DuplicateOutput((IUnknown *) display->device.get(), &dup); - if (SUCCEEDED(status)) { - break; - } - std::this_thread::sleep_for(200ms); - } - - if (FAILED(status)) { - BOOST_LOG(error) << "DuplicateOutput Failed [0x"sv << util::hex(status).to_string_view() << ']'; - return -1; - } - } - } - - DXGI_OUTDUPL_DESC dup_desc; - dup->GetDesc(&dup_desc); - - BOOST_LOG(info) << "Desktop resolution ["sv << dup_desc.ModeDesc.Width << 'x' << dup_desc.ModeDesc.Height << ']'; - BOOST_LOG(info) << "Desktop format ["sv << display->dxgi_format_to_string(dup_desc.ModeDesc.Format) << ']'; - - display->display_refresh_rate = dup_desc.ModeDesc.RefreshRate; - double display_refresh_rate_decimal = (double) display->display_refresh_rate.Numerator / display->display_refresh_rate.Denominator; - BOOST_LOG(info) << "Display refresh rate [" << display_refresh_rate_decimal << "Hz]"; - BOOST_LOG(info) << "Requested frame rate [" << display->client_frame_rate << "fps]"; - display->display_refresh_rate_rounded = lround(display_refresh_rate_decimal); - return 0; - } - capture_e duplication_t::next_frame(DXGI_OUTDUPL_FRAME_INFO &frame_info, std::chrono::milliseconds timeout, resource_t::pointer *res_p) { auto capture_status = release_frame(); @@ -240,7 +155,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 @@ -270,16 +185,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); @@ -349,7 +256,7 @@ namespace platf::dxgi { return status; } - status = release_snapshot(); + status = dup.release_frame(); if (status != platf::capture_e::ok) { return status; } @@ -788,7 +695,81 @@ namespace platf::dxgi { } } + // FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD + { + // IDXGIOutput5 is optional, but can provide improved performance and wide color support + dxgi::output5_t output5 {}; + status = output->QueryInterface(IID_IDXGIOutput5, (void **) &output5); + if (SUCCEEDED(status)) { + // Ask the display implementation which formats it supports + auto supported_formats = get_supported_capture_formats(); + if (supported_formats.empty()) { + BOOST_LOG(warning) << "No compatible capture formats for this encoder"sv; + return -1; + } + + // We try this twice, in case we still get an error on reinitialization + for (int x = 0; x < 2; ++x) { + // Ensure we can duplicate the current display + syncThreadDesktop(); + + status = output5->DuplicateOutput1((IUnknown *) device.get(), 0, supported_formats.size(), supported_formats.data(), &dup.dup); + if (SUCCEEDED(status)) { + break; + } + std::this_thread::sleep_for(200ms); + } + + // We don't retry with DuplicateOutput() because we can hit this codepath when we're racing + // with mode changes and we don't want to accidentally fall back to suboptimal capture if + // we get unlucky and succeed below. + if (FAILED(status)) { + BOOST_LOG(warning) << "DuplicateOutput1 Failed [0x"sv << util::hex(status).to_string_view() << ']'; + return -1; + } + } + else { + BOOST_LOG(warning) << "IDXGIOutput5 is not supported by your OS. Capture performance may be reduced."sv; + + dxgi::output1_t output1 {}; + status = output->QueryInterface(IID_IDXGIOutput1, (void **) &output1); + if (FAILED(status)) { + BOOST_LOG(error) << "Failed to query IDXGIOutput1 from the output"sv; + return -1; + } + + for (int x = 0; x < 2; ++x) { + // Ensure we can duplicate the current display + syncThreadDesktop(); + + status = output1->DuplicateOutput((IUnknown *) device.get(), &dup.dup); + if (SUCCEEDED(status)) { + break; + } + std::this_thread::sleep_for(200ms); + } + + if (FAILED(status)) { + BOOST_LOG(error) << "DuplicateOutput Failed [0x"sv << util::hex(status).to_string_view() << ']'; + return -1; + } + } + } + + DXGI_OUTDUPL_DESC dup_desc; + dup.dup->GetDesc(&dup_desc); + + BOOST_LOG(info) << "Desktop resolution ["sv << dup_desc.ModeDesc.Width << 'x' << dup_desc.ModeDesc.Height << ']'; + BOOST_LOG(info) << "Desktop format ["sv << dxgi_format_to_string(dup_desc.ModeDesc.Format) << ']'; + + display_refresh_rate = dup_desc.ModeDesc.RefreshRate; + double display_refresh_rate_decimal = (double) display_refresh_rate.Numerator / display_refresh_rate.Denominator; + BOOST_LOG(info) << "Display refresh rate [" << display_refresh_rate_decimal << "Hz]"; + display_refresh_rate_rounded = lround(display_refresh_rate_decimal); + client_frame_rate = config.framerate; + BOOST_LOG(info) << "Requested frame rate [" << client_frame_rate << "fps]"; + dxgi::output6_t output6 {}; status = output->QueryInterface(IID_IDXGIOutput6, (void **) &output6); if (SUCCEEDED(status)) { @@ -808,6 +789,9 @@ namespace platf::dxgi { << "Max Full Luminance : "sv << desc1.MaxFullFrameLuminance << " nits"sv; } + // Capture format will be determined from the first call to AcquireNextFrame() + capture_format = DXGI_FORMAT_UNKNOWN; + // Use CREATE_WAITABLE_TIMER_HIGH_RESOLUTION if supported (Windows 10 1809+) timer.reset(CreateWaitableTimerEx(nullptr, nullptr, CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS)); if (!timer) { @@ -1063,47 +1047,23 @@ namespace platf::dxgi { } // namespace platf::dxgi namespace platf { - /** - * Pick a display adapter and capture method. - * @param hwdevice_type enables possible use of hardware encoder - */ std::shared_ptr display(mem_type_e hwdevice_type, const std::string &display_name, const video::config_t &config) { - if (config::video.capture == "ddx" || config::video.capture.empty()) { - if (hwdevice_type == mem_type_e::dxgi) { - auto disp = std::make_shared(); + if (hwdevice_type == mem_type_e::dxgi) { + auto disp = std::make_shared(); - if (!disp->init(config, display_name)) { - return disp; - } - } - else if (hwdevice_type == mem_type_e::system) { - auto disp = std::make_shared(); - - if (!disp->init(config, display_name)) { - return disp; - } + if (!disp->init(config, display_name)) { + return disp; } } + else if (hwdevice_type == mem_type_e::system) { + auto disp = std::make_shared(); - if (config::video.capture == "wgc" || config::video.capture.empty()) { - if (hwdevice_type == mem_type_e::dxgi) { - auto disp = std::make_shared(); - - if (!disp->init(config, display_name)) { - return disp; - } - } - else if (hwdevice_type == mem_type_e::system) { - auto disp = std::make_shared(); - - if (!disp->init(config, display_name)) { - return disp; - } + if (!disp->init(config, display_name)) { + return disp; } } - // ddx and wgc failed return nullptr; } diff --git a/src/platform/windows/display_ram.cpp b/src/platform/windows/display_ram.cpp index 0a8e1a8b8f6..cbe37edfe6b 100644 --- a/src/platform/windows/display_ram.cpp +++ b/src/platform/windows/display_ram.cpp @@ -177,8 +177,9 @@ namespace platf::dxgi { } capture_e - display_ddup_ram_t::snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) { + display_ram_t::snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) { HRESULT status; + DXGI_OUTDUPL_FRAME_INFO frame_info; resource_t::pointer res_p {}; @@ -325,11 +326,6 @@ namespace platf::dxgi { return capture_e::ok; } - capture_e - display_ddup_ram_t::release_snapshot() { - return dup.release_frame(); - } - std::shared_ptr display_ram_t::alloc_img() { auto img = std::make_shared(); @@ -386,8 +382,8 @@ namespace platf::dxgi { } int - display_ddup_ram_t::init(const ::video::config_t &config, const std::string &display_name) { - if (display_base_t::init(config, display_name) || dup.init(this, config)) { + display_ram_t::init(const ::video::config_t &config, const std::string &display_name) { + if (display_base_t::init(config, display_name)) { return -1; } diff --git a/src/platform/windows/display_vram.cpp b/src/platform/windows/display_vram.cpp index ae0e6407347..4aa1800ba45 100644 --- a/src/platform/windows/display_vram.cpp +++ b/src/platform/windows/display_vram.cpp @@ -945,8 +945,9 @@ namespace platf::dxgi { } capture_e - display_ddup_vram_t::snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) { + display_vram_t::snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) { HRESULT status; + DXGI_OUTDUPL_FRAME_INFO frame_info; resource_t::pointer res_p {}; @@ -1328,14 +1329,9 @@ namespace platf::dxgi { return capture_e::ok; } - capture_e - display_ddup_vram_t::release_snapshot() { - return dup.release_frame(); - } - int - display_ddup_vram_t::init(const ::video::config_t &config, const std::string &display_name) { - if (display_base_t::init(config, display_name) || dup.init(this, config)) { + display_vram_t::init(const ::video::config_t &config, const std::string &display_name) { + if (display_base_t::init(config, display_name)) { return -1; } @@ -1414,80 +1410,6 @@ namespace platf::dxgi { return 0; } - /** - * Get the next frame from the Windows.Graphics.Capture API and copy it into a new snapshot texture. - * @param pull_free_image_cb call this to get a new free image from the video subsystem. - * @param img_out the captured frame is returned here - * @param timeout how long to wait for the next frame - * @param cursor_visible - */ - capture_e - display_wgc_vram_t::snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) { - texture2d_t src; - uint64_t frame_qpc; - dup.set_cursor_visible(cursor_visible); - auto capture_status = dup.next_frame(timeout, &src, frame_qpc); - if (capture_status != capture_e::ok) - return capture_status; - - auto frame_timestamp = std::chrono::steady_clock::now() - qpc_time_difference(qpc_counter(), frame_qpc); - D3D11_TEXTURE2D_DESC desc; - src->GetDesc(&desc); - - // It's possible for our display enumeration to race with mode changes and result in - // mismatched image pool and desktop texture sizes. If this happens, just reinit again. - if (desc.Width != width_before_rotation || desc.Height != height_before_rotation) { - BOOST_LOG(info) << "Capture size changed ["sv << width << 'x' << height << " -> "sv << desc.Width << 'x' << desc.Height << ']'; - return capture_e::reinit; - } - - // It's also possible for the capture format to change on the fly. If that happens, - // reinitialize capture to try format detection again and create new images. - if (capture_format != desc.Format) { - BOOST_LOG(info) << "Capture format changed ["sv << dxgi_format_to_string(capture_format) << " -> "sv << dxgi_format_to_string(desc.Format) << ']'; - return capture_e::reinit; - } - - std::shared_ptr img; - if (!pull_free_image_cb(img)) - return capture_e::interrupted; - - auto d3d_img = std::static_pointer_cast(img); - d3d_img->blank = false; // image is always ready for capture - if (complete_img(d3d_img.get(), false) == 0) { - texture_lock_helper lock_helper(d3d_img->capture_mutex.get()); - if (lock_helper.lock()) { - device_ctx->CopyResource(d3d_img->capture_texture.get(), src.get()); - } - else { - BOOST_LOG(error) << "Failed to lock capture texture"; - return capture_e::error; - } - } - else { - return capture_e::error; - } - img_out = img; - if (img_out) { - img_out->frame_timestamp = frame_timestamp; - } - - return capture_e::ok; - } - - capture_e - display_wgc_vram_t::release_snapshot() { - return dup.release_frame(); - } - - int - display_wgc_vram_t::init(const ::video::config_t &config, const std::string &display_name) { - if (display_base_t::init(config, display_name) || dup.init(this, config)) - return -1; - - return 0; - } - std::shared_ptr display_vram_t::alloc_img() { auto img = std::make_shared(); diff --git a/src/platform/windows/display_wgc.cpp b/src/platform/windows/display_wgc.cpp deleted file mode 100644 index b77c600b8f4..00000000000 --- a/src/platform/windows/display_wgc.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/** - * @file src/platform/windows/display_wgc.cpp - * @brief WinRT Windows.Graphics.Capture API - */ -#include - -#include "display.h" - -#include "misc.h" -#include "src/logging.h" - -#include -#include -#include - -namespace platf { - using namespace std::literals; -} - -namespace winrt { - using namespace Windows::Foundation; - using namespace Windows::Graphics::Capture; - using namespace Windows::Graphics::DirectX::Direct3D11; - - extern "C" { - HRESULT __stdcall CreateDirect3D11DeviceFromDXGIDevice(::IDXGIDevice *dxgiDevice, ::IInspectable **graphicsDevice); - } - - /* Windows structures sometimes have compile-time GUIDs. GCC supports this, but in a roundabout way. - * If WINRT_IMPL_HAS_DECLSPEC_UUID is true, then the compiler supports adding this attribute to a struct. For example, Visual Studio. - * If not, then MinGW GCC has a workaround to assign a GUID to a structure. - */ - struct -#if WINRT_IMPL_HAS_DECLSPEC_UUID - __declspec(uuid("A9B3D012-3DF2-4EE3-B8D1-8695F457D3C1")) -#endif - IDirect3DDxgiInterfaceAccess: ::IUnknown { - virtual HRESULT __stdcall GetInterface(REFIID id, void **object) = 0; - }; -} // namespace winrt -#if !WINRT_IMPL_HAS_DECLSPEC_UUID -static constexpr GUID GUID__IDirect3DDxgiInterfaceAccess = { - 0xA9B3D012, 0x3DF2, 0x4EE3, { 0xB8, 0xD1, 0x86, 0x95, 0xF4, 0x57, 0xD3, 0xC1 } - // compare with __declspec(uuid(...)) for the struct above. -}; -template <> -constexpr auto -__mingw_uuidof() -> GUID const & { - return GUID__IDirect3DDxgiInterfaceAccess; -} -#endif - -namespace platf::dxgi { - wgc_capture_t::wgc_capture_t() { - InitializeConditionVariable(&frame_present_cv); - } - - wgc_capture_t::~wgc_capture_t() { - if (capture_session) - capture_session.Close(); - if (frame_pool) - frame_pool.Close(); - item = nullptr; - capture_session = nullptr; - frame_pool = nullptr; - } - - /** - * Initialize the Windows.Graphics.Capture backend. - * @return 0 on success - */ - int - wgc_capture_t::init(display_base_t *display, const ::video::config_t &config) { - HRESULT status; - dxgi::dxgi_t dxgi; - winrt::com_ptr<::IInspectable> d3d_comhandle; - try { - if (!winrt::GraphicsCaptureSession::IsSupported()) { - BOOST_LOG(error) << "Screen capture is not supported on this device for this release of Windows!"sv; - return -1; - } - if (FAILED(status = display->device->QueryInterface(IID_IDXGIDevice, (void **) &dxgi))) { - BOOST_LOG(error) << "Failed to query DXGI interface from device [0x"sv << util::hex(status).to_string_view() << ']'; - return -1; - } - if (FAILED(status = winrt::CreateDirect3D11DeviceFromDXGIDevice(*&dxgi, d3d_comhandle.put()))) { - BOOST_LOG(error) << "Failed to query WinRT DirectX interface from device [0x"sv << util::hex(status).to_string_view() << ']'; - return -1; - } - } - catch (winrt::hresult_error &e) { - BOOST_LOG(error) << "Screen capture is not supported on this device for this release of Windows: failed to acquire device: [0x"sv << util::hex(e.code()).to_string_view() << ']'; - return -1; - } - - DXGI_OUTPUT_DESC output_desc; - uwp_device = d3d_comhandle.as(); - display->output->GetDesc(&output_desc); - - auto monitor_factory = winrt::get_activation_factory(); - if (monitor_factory == nullptr || - FAILED(status = monitor_factory->CreateForMonitor(output_desc.Monitor, winrt::guid_of(), winrt::put_abi(item)))) { - BOOST_LOG(error) << "Screen capture is not supported on this device for this release of Windows: failed to acquire display: [0x"sv << util::hex(status).to_string_view() << ']'; - return -1; - } - - if (config.dynamicRange) - display->capture_format = DXGI_FORMAT_R16G16B16A16_FLOAT; - else - display->capture_format = DXGI_FORMAT_B8G8R8A8_UNORM; - - try { - frame_pool = winrt::Direct3D11CaptureFramePool::CreateFreeThreaded(uwp_device, static_cast(display->capture_format), 2, item.Size()); - capture_session = frame_pool.CreateCaptureSession(item); - frame_pool.FrameArrived({ this, &wgc_capture_t::on_frame_arrived }); - } - catch (winrt::hresult_error &e) { - BOOST_LOG(error) << "Screen capture is not supported on this device for this release of Windows: failed to create capture session: [0x"sv << util::hex(e.code()).to_string_view() << ']'; - return -1; - } - try { - capture_session.IsBorderRequired(false); - } - catch (winrt::hresult_error &e) { - BOOST_LOG(warning) << "Screen capture may not be fully supported on this device for this release of Windows: failed to disable border around capture area: [0x"sv << util::hex(e.code()).to_string_view() << ']'; - } - try { - capture_session.StartCapture(); - } - catch (winrt::hresult_error &e) { - BOOST_LOG(error) << "Screen capture is not supported on this device for this release of Windows: failed to start capture: [0x"sv << util::hex(e.code()).to_string_view() << ']'; - return -1; - } - return 0; - } - - /** - * This function runs in a separate thread spawned by the frame pool and is a producer of frames. - * To maintain parity with the original display interface, this frame will be consumed by the capture thread. - * Acquire a read-write lock, make the produced frame available to the capture thread, then wake the capture thread. - */ - void - wgc_capture_t::on_frame_arrived(winrt::Direct3D11CaptureFramePool const &sender, winrt::IInspectable const &) { - winrt::Windows::Graphics::Capture::Direct3D11CaptureFrame frame { nullptr }; - try { - frame = sender.TryGetNextFrame(); - } - catch (winrt::hresult_error &e) { - BOOST_LOG(warning) << "Failed to capture frame: "sv << e.code(); - return; - } - if (frame != nullptr) { - AcquireSRWLockExclusive(&frame_lock); - if (produced_frame) - produced_frame.Close(); - - produced_frame = frame; - ReleaseSRWLockExclusive(&frame_lock); - WakeConditionVariable(&frame_present_cv); - } - } - - /** - * Get the next frame from the producer thread. - * If not available, the capture thread blocks until one is, or the wait times out. - * @param timeout how long to wait for the next frame - * @param out a texture containing the frame just captured - * @param out_time the timestamp of the frame just captured - */ - capture_e - wgc_capture_t::next_frame(std::chrono::milliseconds timeout, ID3D11Texture2D **out, uint64_t &out_time) { - // this CONSUMER runs in the capture thread - release_frame(); - - AcquireSRWLockExclusive(&frame_lock); - if (produced_frame == nullptr && SleepConditionVariableSRW(&frame_present_cv, &frame_lock, timeout.count(), 0) == 0) { - ReleaseSRWLockExclusive(&frame_lock); - if (GetLastError() == ERROR_TIMEOUT) - return capture_e::timeout; - else - return capture_e::error; - } - if (produced_frame) { - consumed_frame = produced_frame; - produced_frame = nullptr; - } - ReleaseSRWLockExclusive(&frame_lock); - if (consumed_frame == nullptr) // spurious wakeup - return capture_e::timeout; - - auto capture_access = consumed_frame.Surface().as(); - if (capture_access == nullptr) - return capture_e::error; - capture_access->GetInterface(IID_ID3D11Texture2D, (void **) out); - out_time = consumed_frame.SystemRelativeTime().count(); // raw ticks from query performance counter - return capture_e::ok; - } - - capture_e - wgc_capture_t::release_frame() { - if (consumed_frame != nullptr) { - consumed_frame.Close(); - consumed_frame = nullptr; - } - return capture_e::ok; - } - - int - wgc_capture_t::set_cursor_visible(bool x) { - try { - if (capture_session.IsCursorCaptureEnabled() != x) - capture_session.IsCursorCaptureEnabled(x); - return 0; - } - catch (winrt::hresult_error &) { - return -1; - } - } - - int - display_wgc_ram_t::init(const ::video::config_t &config, const std::string &display_name) { - if (display_base_t::init(config, display_name) || dup.init(this, config)) - return -1; - - texture.reset(); - return 0; - } - - /** - * Get the next frame from the Windows.Graphics.Capture API and copy it into a new snapshot texture. - * @param pull_free_image_cb call this to get a new free image from the video subsystem. - * @param img_out the captured frame is returned here - * @param timeout how long to wait for the next frame - * @param cursor_visible - */ - capture_e - display_wgc_ram_t::snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr &img_out, std::chrono::milliseconds timeout, bool cursor_visible) { - HRESULT status; - texture2d_t src; - uint64_t frame_qpc; - dup.set_cursor_visible(cursor_visible); - auto capture_status = dup.next_frame(timeout, &src, frame_qpc); - if (capture_status != capture_e::ok) - return capture_status; - - auto frame_timestamp = std::chrono::steady_clock::now() - qpc_time_difference(qpc_counter(), frame_qpc); - D3D11_TEXTURE2D_DESC desc; - src->GetDesc(&desc); - - // Create the staging texture if it doesn't exist. It should match the source in size and format. - if (texture == nullptr) { - capture_format = desc.Format; - BOOST_LOG(info) << "Capture format ["sv << dxgi_format_to_string(capture_format) << ']'; - - D3D11_TEXTURE2D_DESC t {}; - t.Width = width; - t.Height = height; - t.MipLevels = 1; - t.ArraySize = 1; - t.SampleDesc.Count = 1; - t.Usage = D3D11_USAGE_STAGING; - t.Format = capture_format; - t.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - - auto status = device->CreateTexture2D(&t, nullptr, &texture); - - if (FAILED(status)) { - BOOST_LOG(error) << "Failed to create staging texture [0x"sv << util::hex(status).to_string_view() << ']'; - return capture_e::error; - } - } - - // It's possible for our display enumeration to race with mode changes and result in - // mismatched image pool and desktop texture sizes. If this happens, just reinit again. - if (desc.Width != width || desc.Height != height) { - BOOST_LOG(info) << "Capture size changed ["sv << width << 'x' << height << " -> "sv << desc.Width << 'x' << desc.Height << ']'; - return capture_e::reinit; - } - // It's also possible for the capture format to change on the fly. If that happens, - // reinitialize capture to try format detection again and create new images. - if (capture_format != desc.Format) { - BOOST_LOG(info) << "Capture format changed ["sv << dxgi_format_to_string(capture_format) << " -> "sv << dxgi_format_to_string(desc.Format) << ']'; - return capture_e::reinit; - } - - // Copy from GPU to CPU - device_ctx->CopyResource(texture.get(), src.get()); - - if (!pull_free_image_cb(img_out)) { - return capture_e::interrupted; - } - auto img = (img_t *) img_out.get(); - - // Map the staging texture for CPU access (making it inaccessible for the GPU) - if (FAILED(status = device_ctx->Map(texture.get(), 0, D3D11_MAP_READ, 0, &img_info))) { - BOOST_LOG(error) << "Failed to map texture [0x"sv << util::hex(status).to_string_view() << ']'; - - return capture_e::error; - } - - // Now that we know the capture format, we can finish creating the image - if (complete_img(img, false)) { - device_ctx->Unmap(texture.get(), 0); - img_info.pData = nullptr; - return capture_e::error; - } - - std::copy_n((std::uint8_t *) img_info.pData, height * img_info.RowPitch, (std::uint8_t *) img->data); - - // Unmap the staging texture to allow GPU access again - device_ctx->Unmap(texture.get(), 0); - img_info.pData = nullptr; - - if (img) { - img->frame_timestamp = frame_timestamp; - } - - return capture_e::ok; - } - - capture_e - display_wgc_ram_t::release_snapshot() { - return dup.release_frame(); - } -} // namespace platf::dxgi diff --git a/src/platform/windows/input.cpp b/src/platform/windows/input.cpp index dfc9852f586..5056c2c7246 100644 --- a/src/platform/windows/input.cpp +++ b/src/platform/windows/input.cpp @@ -1411,7 +1411,7 @@ namespace platf { ds4_update_state(gamepad_context_t &gamepad, const gamepad_state_t &gamepad_state) { auto &report = gamepad.report.ds4.Report; - report.wButtons = static_cast(ds4_buttons(gamepad_state)) | static_cast(ds4_dpad(gamepad_state)); + report.wButtons = ds4_buttons(gamepad_state) | ds4_dpad(gamepad_state); report.bSpecial = ds4_special_buttons(gamepad_state); report.bTriggerL = gamepad_state.lt; diff --git a/src/platform/windows/misc.cpp b/src/platform/windows/misc.cpp index e136de66a70..e7bb64e52b8 100644 --- a/src/platform/windows/misc.cpp +++ b/src/platform/windows/misc.cpp @@ -1691,8 +1691,8 @@ namespace platf { } int64_t qpc_counter() { - LARGE_INTEGER performance_counter; - if (QueryPerformanceCounter(&performance_counter)) return performance_counter.QuadPart; + LARGE_INTEGER performace_counter; + if (QueryPerformanceCounter(&performace_counter)) return performace_counter.QuadPart; return 0; } diff --git a/src/stream.cpp b/src/stream.cpp index efe84aec66b..4aba966ddf2 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -1815,7 +1815,7 @@ namespace stream { // The alternative is that Sunshine can never start another session until it's manually restarted. auto task = []() { BOOST_LOG(fatal) << "Hang detected! Session failed to terminate in 10 seconds."sv; - log_flush(); + logging::log_flush(); lifetime::debug_trap(); }; auto force_kill = task_pool.pushDelayed(task, 10s).task_id; diff --git a/src/video.cpp b/src/video.cpp index 3b0421eb9b6..3979f0268fe 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -673,6 +673,7 @@ namespace video { { "quality"s, &config::video.amd.amd_quality_av1 }, { "rc"s, &config::video.amd.amd_rc_av1 }, { "usage"s, &config::video.amd.amd_usage_av1 }, + { "enforce_hrd"s, &config::video.amd.amd_enforce_hrd }, }, {}, // SDR-specific options {}, // HDR-specific options @@ -694,6 +695,7 @@ namespace video { { "rc"s, &config::video.amd.amd_rc_hevc }, { "usage"s, &config::video.amd.amd_usage_hevc }, { "vbaq"s, &config::video.amd.amd_vbaq }, + { "enforce_hrd"s, &config::video.amd.amd_enforce_hrd }, }, {}, // SDR-specific options {}, // HDR-specific options @@ -713,6 +715,7 @@ namespace video { { "rc"s, &config::video.amd.amd_rc_h264 }, { "usage"s, &config::video.amd.amd_usage_h264 }, { "vbaq"s, &config::video.amd.amd_vbaq }, + { "enforce_hrd"s, &config::video.amd.amd_enforce_hrd }, }, // SDR-specific options {}, diff --git a/src/video.h b/src/video.h index eb8eabc358d..ba80474669f 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 ae13e55c2c9..9b25744340d 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -48,6 +48,7 @@

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

+ @@ -361,7 +362,7 @@

- {{ $t('config.adapter_name_desc') }}
+ {{ $t('config.adapter_name_desc_win') }}
tools\dxgi-info.exe
@@ -884,16 +885,14 @@

-
+
{{ $t('config.capture_desc') }}
@@ -1000,7 +999,7 @@

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

- +
@@ -1080,10 +1079,10 @@

@@ -1094,6 +1093,7 @@

+

@@ -1116,6 +1116,15 @@

+ +
+ + +
+
@@ -1346,10 +1355,11 @@

name: "AMD AMF Encoder", options: { "amd_quality": "balanced", - "amd_rc": "vbr_latency", + "amd_rc": "cbr", "amd_usage": "ultralowlatency", "amd_preanalysis": "disabled", "amd_vbaq": "enabled", + "amd_enforce_hrd": "enabled", "amd_coder": "auto", }, }, diff --git a/src_assets/common/assets/web/pin.html b/src_assets/common/assets/web/pin.html index 7acaf590856..530ab44b199 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') }}

- +
@@ -23,7 +23,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 8d1be14d2af..d3967262401 100644 --- a/src_assets/common/assets/web/public/assets/locale/de.json +++ b/src_assets/common/assets/web/public/assets/locale/de.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", - "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "apply": "Anwenden", + "auto": "Automatisch", + "autodetect": "AutoDetection (empfohlen)", + "cancel": "Abbrechen", + "disabled": "Deaktiviert", + "disabled_def": "Deaktiviert (Standard)", + "do_cmd": "Befehl ausführen", + "elevated": "Erhöhte", + "enabled": "Aktiviert", + "enabled_def": "Aktiviert (Standard)", + "error": "Fehler!", + "note": "Hinweis:", + "password": "Passwort", + "run_as": "Als Admin ausführen", + "save": "Speichern", + "see_more": "Mehr ansehen", + "success": "Erfolgreich!", + "undo_cmd": "Befehl rückgängig machen", + "username": "Benutzername", + "warning": "Warnung!" }, "apps": { - "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", - "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", - "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", + "actions": "Aktionen", + "add_cmds": "Befehle hinzufügen", + "add_new": "Neu", + "app_name": "Anwendungsname", + "app_name_desc": "Anwendungsname, wie auf Mondlicht gezeigt", + "applications_desc": "Anwendungen werden nur beim Neustart des Clients aktualisiert", + "applications_title": "Anwendungen", + "auto_detach": "Streaming fortsetzen, wenn die Anwendung schnell beendet wird", + "auto_detach_desc": "Dies wird versuchen, automatisch Apps vom Launcher-Typ zu erkennen, die sich nach dem Start eines anderen Programms oder einer Instanz von sich selbst schnell schließen. Wenn eine Anwendung vom Launcher-Typ erkannt wird, wird sie als abgetrennte App behandelt.", + "cmd": "Befehl", + "cmd_desc": "Die zu startende Hauptanwendung. Wenn leer wird keine Anwendung gestartet.", + "cmd_note": "Wenn der Pfad zum ausführbaren Kommando Leerzeichen enthält, müssen Sie ihn in Anführungszeichen einfügen.", + "cmd_prep_desc": "Eine Liste von Befehlen, die vor oder nach dieser Anwendung ausgeführt werden sollen. Wenn einer der Prep-Befehle fehlschlägt, wird das Starten der Anwendung abgebrochen.", + "cmd_prep_name": "Befehlsvorbereitungen", + "covers_found": "Cover gefunden", + "delete": "Löschen", + "detached_cmds": "Getrennte Befehle", + "detached_cmds_add": "Separiertes Kommando hinzufügen", + "detached_cmds_desc": "Eine Liste von Befehlen, die im Hintergrund ausgeführt werden sollen.", + "detached_cmds_note": "Wenn der Pfad zum ausführbaren Kommando Leerzeichen enthält, müssen Sie ihn in Anführungszeichen einfügen.", + "edit": "Bearbeiten", + "env_app_id": "App-ID", + "env_app_name": "App-Name", + "env_client_audio_config": "Die vom Client angeforderte Audio-Konfiguration (2.0/5.1/7.1)", + "env_client_enable_sops": "Der Client hat die Option angefordert, das Spiel für ein optimales Streaming zu optimieren (true/false)", + "env_client_fps": "Das vom Client angeforderte FPS (int)", + "env_client_gcmap": "Die angeforderte Gamepadmaske im Bitset/Bitfield Format (int)", + "env_client_hdr": "HDR ist vom Client aktiviert (true/false)", + "env_client_height": "Die vom Client angeforderte Höhe (int)", + "env_client_host_audio": "Der Client hat Host-Audio angefordert (true/falsch)", + "env_client_width": "Die vom Client angeforderte Breite (int)", + "env_displayplacer_example": "Beispiel - displayplacer für die Automatisierung der Auflösung:", + "env_qres_example": "Beispiel - QRes für die Automatisierung der Auflösung:", + "env_qres_path": "qres Pfad", "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", - "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", + "env_vars_about": "Über Umgebungsvariablen", + "env_vars_desc": "Alle Befehle erhalten diese Umgebungsvariablen standardmäßig:", + "env_xrandr_example": "Beispiel - Xrandr für die Auflösungsautomatisierung:", + "exit_timeout": "Timeout beenden", + "exit_timeout_desc": "Anzahl der Sekunden, die gewartet werden, bis alle App-Prozesse anmutig beendet werden, wenn sie beendet werden. Wenn nicht gesetzt, ist die Standardeinstellung bis zu 5 Sekunden. Wenn Null oder ein negativer Wert gesetzt wird, wird die App sofort beendet.", + "find_cover": "Cover finden", + "global_prep_desc": "Aktiviere/Deaktiviere die Ausführung von Global Prep Commands für diese Anwendung.", + "global_prep_name": "Globale Vorbereitungsbefehle", + "image": "Bild", + "image_desc": "Symbol/Bild/Bild/Bildpfad, der an den Client gesendet wird. Das Bild muss eine PNG-Datei sein. Falls nicht gesetzt, sendet Sunshine ein Standardbild-Bild.", + "loading": "Wird geladen...", "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", - "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "output_desc": "Die Datei, in der die Ausgabe des Befehls gespeichert wird, wenn sie nicht angegeben ist, wird die Ausgabe ignoriert", + "output_name": "Ausgang", + "run_as_desc": "Dies kann für einige Anwendungen notwendig sein, die Administratorrechte benötigen, um ordnungsgemäß zu funktionieren.", + "wait_all": "Streaming fortsetzen bis alle App-Prozesse beendet sind", + "wait_all_desc": "Dies wird fortgesetzt, bis alle Prozesse, die von der App gestartet werden, beendet sind. Wenn diese Option deaktiviert ist, wird das Streaming gestoppt, wenn der erste App-Prozess beendet wird, auch wenn andere App-Prozesse noch laufen.", + "working_dir": "Arbeitsverzeichnis", + "working_dir_desc": "Das Arbeitsverzeichnis, das an den Prozess übergeben werden soll. Zum Beispiel verwenden einige Anwendungen das Arbeitsverzeichnis, um nach Konfigurationsdateien zu suchen. Falls nicht gesetzt, wird Sunshine standardmäßig das übergeordnete Verzeichnis des Befehls verwenden" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", + "adapter_name": "Adaptername", + "adapter_name_desc_linux_1": "Geben Sie eine GPU für die Aufnahme manuell an.", + "adapter_name_desc_linux_2": "um alle Geräte zu finden, die VAAPI nutzen können", + "adapter_name_desc_linux_3": "Ersetze ``renderD129`` durch das Gerät von oben, um den Namen und die Fähigkeiten des Geräts aufzulisten. Um von Sunshine unterstützt zu werden, muss es zumindest über folgende Punkte verfügen:", + "adapter_name_desc_win": "Legen Sie eine GPU für die Aufnahme manuell fest. Falls nicht festgelegt, wird die GPU automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische GPU-Auswahl zu verwenden! Hinweis: Diese GPU muss ein Display angeschlossen und eingeschaltet haben. Die passenden Werte finden Sie mit dem folgenden Befehl:", + "adapter_name_placeholder_win": "Radeon RX 580-Serie", + "add": "Neu", + "address_family": "Adressfamilie", "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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.", + "address_family_desc": "Adressfamilie einstellen, die von Sunshine verwendet wird", + "address_family_ipv4": "Nur IPv4", + "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_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.", + "amd_enforce_hrd": "Hypothetische Referenz-Decodierer (HRD) durchsetzen", + "amd_preanalysis": "AMF-Voranalyse", + "amd_quality": "AMF-Qualität", + "amd_quality_balanced": "ausgewogen -- Ausgewogen (Standard)", + "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_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_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)", + "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": "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "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:", + "audio_sink_desc_macos": "Der Name des für Audio Loopback verwendeten Audiosenks kann aufgrund von Systembeschränkungen nur auf Mikrofone auf macOS zugreifen. Zum Streamen von System-Audio mit Soundflower oder BlackHole.", + "audio_sink_desc_win": "Geben Sie ein bestimmtes Audiogerät für die Aufnahme manuell an. Wenn nicht gesetzt, wird das Gerät automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische Geräteauswahl zu verwenden! Wenn Sie mehrere Audiogeräte mit identischen Namen haben, können Sie die Geräte-ID mit dem folgenden Befehl erhalten:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", + "audio_sink_placeholder_win": "Lautsprecher (High Definition Audio Device)", "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", - "configuration": "Configuration", + "av1_mode_0": "Sunshine werbt Unterstützung für AV1 basierend auf Encoder Fähigkeiten (empfohlen)", + "av1_mode_1": "Sunshine werbt keinen Support für AV1", + "av1_mode_2": "Sunshine werbt Unterstützung für AV1 Hauptprofil mit 8-Bit", + "av1_mode_3": "Sunshine werbt Unterstützung für AV1 Hauptprofile mit 8-Bit und 10-Bit (HDR)", + "av1_mode_desc": "Ermöglicht dem Client, AV1 Haupt-8-bit oder 10-bit Video-Streams anzufordern. AV1 ist CPU-intensiver zum Kodieren, daher kann die Aktivierung die Leistung bei der Verwendung von Software Codierung verringern.", + "back_button_timeout": "Timeout für Home/Guide Button Emulation", + "back_button_timeout_desc": "Wenn die Schaltfläche Zurück/Auswählen für die angegebene Anzahl an Millisekunden gedrückt gehalten wird, wird die Taste Home/Guide emuliert. Wenn auf einen Wert < 0 (Standard) gesetzt ist, wird die Home/Guide-Taste nicht nachgeahmt.", + "capture": "Erzwinge eine bestimmte Aufnahmemethode", + "capture_desc": "Im automatischen Modus wird Sunshine den ersten verwenden, der funktioniert. NvFBC benötigt gepatchte Nvidia-Treiber.", + "cert": "Zertifikat", + "cert_desc": "Das Zertifikat, das für das Web-UI und Moonlight Client-Paar verwendet wird. Für bestmögliche Kompatibilität sollte dieser einen RSA-2048 öffentlichen Schlüssel haben.", + "channels": "Maximal verbundene Clients", + "channels_desc_1": "Sunshine kann eine einzelne Streaming-Sitzung gleichzeitig mit mehreren Clients teilen.", + "channels_desc_2": "Einige Hardware-Encoder haben möglicherweise Einschränkungen, die die Leistung bei mehreren Streams verringern.", + "coder_cabac": "cabac -- kontextadaptive binäre arithmetische Kodierung - höhere Qualität", + "coder_cavlc": "cavlc -- kontextadaptive Kodierung variabler Länge - schnellere Dekodierung", + "configuration": "Konfiguration", "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", + "controller_desc": "Erlaubt Gästen das Host-System mit einem Gamepad/Controller zu steuern", + "credentials_file": "Anmeldedaten Datei", + "credentials_file_desc": "Speichere Benutzername/Passwort getrennt von Sunshine's Status-Datei.", + "ds4_back_as_touchpad_click": "Zum Touchpad-Klick zurück/auswählen", + "ds4_back_as_touchpad_click_desc": "Beim Erzwingen der DS4-Emulation zum Touchpad-Klick zurück/auswählen", + "encoder": "Erzwinge einen bestimmten Encoder", + "encoder_desc": "Erzwinge einen bestimmten Encoder, sonst wählt Sunshine die beste verfügbare Option. Notiz: Wenn Sie einen Hardwarekodierer unter Windows angeben, muss er mit der GPU übereinstimmen, in der das Display verbunden ist.", "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "external_ip": "Externe IP", + "external_ip_desc": "Wenn keine externe IP-Adresse angegeben ist, erkennt Sunshine automatisch externe IP", + "fec_percentage": "Prozentsatz FEC", + "fec_percentage_desc": "Prozentsatz der Fehlerkorrektur von Paketen pro Datenpaket in jedem Videobild. Höhere Werte können für mehr Netzwerk-Paketverlust korrigieren, aber auf Kosten einer erhöhten Bandbreitennutzung.", + "ffmpeg_auto": "auto -- ffmpeg entscheiden lassen (Standard)", + "file_apps": "App-Datei", + "file_apps_desc": "Die Datei, in der die aktuellen Apps von Sunshine gespeichert werden.", + "file_state": "Zustandsdatei", + "file_state_desc": "Die Datei, in der der aktuelle Zustand von Sunshine gespeichert ist", + "fps": "Angekündigte FPS", + "gamepad": "Emulierter Gamepad-Typ", + "gamepad_auto": "Automatische Auswahloptionen", + "gamepad_desc": "Wähle welche Art von Gamepad emuliert werden soll", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "Manuelle DS4 Optionen", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", + "global_prep_cmd": "Befehlsvorbereitungen", + "global_prep_cmd_desc": "Konfigurieren Sie eine Liste von Befehlen, die vor oder nach Ausführung einer Anwendung ausgeführt werden sollen. Wenn eines der angegebenen Vorbereitungsbefehle fehlschlägt, wird der Anwendungsstart abgebrochen.", + "hevc_mode": "HEVC Unterstützung", + "hevc_mode_0": "Sunshine werbt Unterstützung für HEVC basierend auf Encoderfähigkeiten (empfohlen)", + "hevc_mode_1": "Sunshine werbt keine Unterstützung für HEVC", + "hevc_mode_2": "Sunshine werbt Unterstützung für das HEVC Hauptprofil", + "hevc_mode_3": "Sunshine werbt Unterstützung für HEVC Haupt- und Main10-Profile (HDR)", + "hevc_mode_desc": "Ermöglicht dem Client, HEVC Main oder HEVC Main10 Videostreams anzufordern. HEVC ist CPU-intensiver zum Kodieren, daher kann dies die Leistung bei der Verwendung von Software-Kodierungen verringern.", + "high_resolution_scrolling": "Unterstützung für hochauflösende Scrolling", + "high_resolution_scrolling_desc": "Wenn aktiviert, durchläuft Sunshine hochauflösende Scroll-Ereignisse von Moonlight-Clients. Dies kann nützlich sein, um ältere Anwendungen zu deaktivieren, die bei hochauflösenden Scroll-Ereignissen zu schnell scrollen.", + "install_steam_audio_drivers": "Steam Audio Treiber installieren", + "install_steam_audio_drivers_desc": "Wenn Steam installiert ist, wird der Steam Streaming Speakers Treiber automatisch installiert, um 5.1/7.1 Surround-Sound zu unterstützen und Host-Audio zu mutieren.", + "key_repeat_delay": "Schlüssel-Wiederholung Verzögerung", + "key_repeat_delay_desc": "Legen Sie fest, wie schnell sich die Tasten wiederholen. Die anfängliche Verzögerung in Millisekunden bevor Sie die Tasten wiederholen.", + "key_repeat_frequency": "Tastendruck-Frequenz", + "key_repeat_frequency_desc": "Wie oft Tasten jede Sekunde wiederholen. Diese konfigurierbare Option unterstützt Dezimalstellen.", + "key_rightalt_to_key_win": "Rechter Alt-Taste auf Windows-Taste zuweisen", + "key_rightalt_to_key_win_desc": "Möglicherweise können Sie den Windows-Schlüssel nicht direkt von Moonlight senden. In diesen Fällen kann es nützlich sein, Sunshine glauben zu lassen, dass die rechte Alt-Taste die Windows-Taste ist", + "keyboard": "Tastatureingabe aktivieren", + "keyboard_desc": "Erlaubt Gästen das Host-System mit der Tastatur zu steuern", + "lan_encryption_mode": "LAN-Verschlüsselungsmodus", + "lan_encryption_mode_1": "Für unterstützte Clients aktiviert", + "lan_encryption_mode_2": "Benötigt für alle Kunden", + "lan_encryption_mode_desc": "Dies legt fest, wann die Verschlüsselung beim Streaming über Ihr lokales Netzwerk verwendet wird. Verschlüsselung kann die Streaming-Leistung senken, insbesondere auf weniger leistungsfähigen Hosts und Clients.", + "locale": "Lokal", + "locale_desc": "Die Locale, die für die Benutzeroberfläche von Sunshine verwendet wird.", + "log_level": "Log-Level", "log_level_0": "Verbose", "log_level_1": "Debug", "log_level_2": "Info", - "log_level_3": "Warning", - "log_level_4": "Error", + "log_level_3": "Warnung", + "log_level_4": "Fehler", "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", + "log_level_6": "Keine", + "log_level_desc": "Der minimale Log-Level wird auf Standard gedruckt", + "log_path": "Logdateipfad", + "log_path_desc": "Die Datei, in der die aktuellen Logs von Sunshine gespeichert werden.", + "min_threads": "Minimale CPU-Thread-Anzahl", + "min_threads_desc": "Die Erhöhung des Wertes verringert die Encoding-Effizienz, aber der Abgleich lohnt sich in der Regel, mehr CPU-Kerne für die Kodierung zu verwenden. Der ideale Wert ist der niedrigste Wert, der zuverlässig an den gewünschten Streaming-Einstellungen auf Ihrer Hardware kodieren kann.", + "misc": "Verschiedene Optionen", + "motion_as_ds4": "Ein DS4 Gamepad emulieren, wenn der Client Gamepad Bewegungsmelder meldet", + "motion_as_ds4_desc": "Wenn deaktiviert, werden Bewegungssensor bei der Auswahl des Gamepad-Typs nicht berücksichtigt.", + "mouse": "Maus-Eingabe aktivieren", + "mouse_desc": "Erlaubt Gästen das Host-System mit der Maus zu steuern", + "native_pen_touch": "Native Pen/Touch Unterstützung", + "native_pen_touch_desc": "Wenn aktiviert, durchläuft Sunshine natives Pen / Berühren von Moonlight-Clients. Dies kann nützlich sein, um ältere Anwendungen ohne nativen Stift-/Berührungs-Support zu deaktivieren.", + "nvenc_h264_cavlc": "CAVLC gegenüber CABAC in H.264 bevorzugen", + "nvenc_h264_cavlc_desc": "Einfachere Form der Entropy-Codierung. CAVLC benötigt ca. 10% mehr Bitrate für die gleiche Qualität. Nur relevant für wirklich alte Decodierungsgeräte.", + "nvenc_latency_over_power": "Reduzierte Encoding-Latenz gegenüber Energieeinsparungen bevorzugen", + "nvenc_latency_over_power_desc": "Sunshine fordert die maximale GPU-Taktgeschwindigkeit beim Streaming an, um die Encoding-Latenz zu reduzieren. Deaktivieren wird nicht empfohlen, da dies zu einer signifikant erhöhten Encoding-Latenz führen kann.", + "nvenc_opengl_vulkan_on_dxgi": "OpenGL/Vulkan auf DXGI zeigen", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine kann OpenGL und Vulkan Programme nicht mit voller Bildwiederholrate erfassen, es sei denn, sie sind auf DXGI vorhanden. Dies ist eine systemweite Einstellung, die beim Beenden des Sonnenscheinprogramms rückgängig gemacht wird.", + "nvenc_preset": "Leistungsvorgabe", + "nvenc_preset_1": "(schnellste, Standard)", + "nvenc_preset_7": "(langsamste)", + "nvenc_preset_desc": "Höhere Zahlen verbessern die Komprimierung (Qualität bei der angegebenen Bitrate) auf Kosten einer erhöhten Kodierungslatenz. Wird empfohlen, nur zu ändern, wenn durch Netzwerk oder Decoder begrenzt, sonst kann ein ähnlicher Effekt durch Erhöhung der Bitrate erreicht werden.", + "nvenc_realtime_hags": "Echtzeit-Priorität in der Hardware-beschleunigten gpu Planung verwenden", + "nvenc_realtime_hags_desc": "Derzeit können NVIDIA-Treiber im Encoder einfrieren, wenn HAGS aktiviert ist, Echtzeit-Priorität verwendet wird und die VRAM-Auslastung fast fast erreicht ist. Die Deaktivierung dieser Option senkt die Priorität auf hoch, indem das Einfrieren auf Kosten einer reduzierten Aufnahmeleistung umgangen wird, wenn die GPU stark belastet ist.", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", - "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", + "nvenc_spatial_aq_desc": "Zuweisen von höheren QP-Werten zu flachen Regionen des Videos. Wird empfohlen zu aktivieren, wenn Streaming mit niedrigeren Bitraten.", + "nvenc_spatial_aq_disabled": "Deaktiviert (schneller, Standard)", + "nvenc_spatial_aq_enabled": "Aktiviert (langsamer)", + "nvenc_twopass": "Zwei-Pass-Modus", + "nvenc_twopass_desc": "Fügt vorläufige Kodierungen hinzu. Dies erlaubt es, mehr Bewegungsvektoren zu erkennen, eine bessere Verteilung der Bitrate über den Rahmen und strengere Einhaltung der Bitratengrenzen. Die Deaktivierung ist nicht empfehlenswert, da dies gelegentlich zu Bitraten-Overshoot und anschließendem Paketverlust führen kann.", + "nvenc_twopass_disabled": "Deaktiviert (schnellste, nicht empfohlen)", + "nvenc_twopass_full_res": "Vollständige Auflösung (langsamer)", + "nvenc_twopass_quarter_res": "Viertelauflösung (schneller, Standard)", + "nvenc_vbv_increase": "Prozentsatz Erhöhung des Einzelbild-VBV/HRD", + "nvenc_vbv_increase_desc": "Standardmäßig verwendet Sunshine Einzelbild-VBV/HRD, was bedeutet, dass jegliche kodierte Videobild-Größe nicht voraussichtlich die angeforderte Bitrate überschreiten wird, geteilt durch angeforderte Bildrate. Diese Einschränkung zu lockern, kann vorteilhaft sein und als variable Bitrate mit niedriger Latenz fungieren kann aber auch zu Paketverlusten führen, wenn das Netzwerk keinen Pufferkopf hat, um mit Bitraten-Spitzen umzugehen. Maximal zulässiger Wert ist 400, was einer 5x erhöhten Begrenzung der kodierten Videorahmen.", + "origin_web_ui_allowed": "Ursprungsweb-UI erlaubt", + "origin_web_ui_allowed_desc": "Der Ursprung der Remote-Endpunkt-Adresse, der der Zugriff auf das Web-Interface nicht verweigert wird", + "origin_web_ui_allowed_lan": "Nur LAN-Nutzer können auf Web-UI zugreifen", + "origin_web_ui_allowed_pc": "Nur localhost kann auf Web-UI zugreifen", + "origin_web_ui_allowed_wan": "Jeder kann auf Web-UI zugreifen", + "output_name_desc_linux": "Beim Start von Sunshine sollten Sie die Liste der erkannten Monitore sehen. Sie müssen den Wert vor dem Doppelpunkt in der Ausgabe verwenden. z.B.:", + "output_name_desc_win": "Legen Sie eine Anzeige für die Aufnahme manuell fest. Wenn diese nicht aktiviert ist, wird die primäre Anzeige aufgenommen. Hinweis: Wenn Sie eine GPU oben angegeben haben, muss diese Anzeige mit dieser GPU verbunden sein. Die entsprechenden Werte finden Sie mit dem folgenden Befehl:", + "output_name_linux": "Nummer überwachen", + "output_name_win": "Ausgabename", + "ping_timeout": "Ping-Timeout", + "ping_timeout_desc": "Wie lange warten Sie in Millisekunden auf Daten von Mondlicht bevor Sie den Strom herunterfahren", + "pkey": "Privater Schlüssel", + "pkey_desc": "Der private Schlüssel, der für das Web-UI- und Moonlight-Client-Paar verwendet wird. Für bestmögliche Kompatibilität sollte dies ein privater RSA-2048 Schlüssel sein.", "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", + "port_alert_1": "Sonnenschein kann keine Ports unter 1024 benutzen!", + "port_alert_2": "Ports über 65535 sind nicht verfügbar!", + "port_desc": "Legen Sie die Familie der von Sunshine verwendeten Ports fest", + "port_http_port_note": "Benutzen Sie diesen Port, um sich mit Moonlight zu verbinden.", + "port_note": "Notiz", "port_port": "Port", "port_protocol": "Protocol", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", + "port_warning": "Das Web-Interface dem Internet zu übergeben, ist ein Sicherheitsrisiko! Fahren Sie auf eigene Gefahr!", "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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.", + "qp": "Quantifizierungsparameter", + "qp_desc": "Einige Geräte unterstützen möglicherweise keine Constant Bit-Rate. Für diese Geräte wird stattdessen QP verwendet. Höhere Werte bedeuten mehr Kompression, aber weniger Qualität.", "qsv_coder": "QuickSync Coder (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", - "qsv_preset_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", - "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", - "sw_preset_ultrafast": "ultrafast", + "qsv_preset_fast": "schneller (niedrigere Qualität)", + "qsv_preset_faster": "schnellste (niedrigste Qualität)", + "qsv_preset_medium": "medium (Standard)", + "qsv_preset_slow": "langsam (gute Qualität)", + "qsv_preset_slower": "langsamer (bessere Qualität)", + "qsv_preset_slowest": "langsamste (beste Qualität)", + "qsv_preset_veryfast": "schnellste (niedrigste Qualität)", + "qsv_slow_hevc": "Langsame HEVC Encodierung erlauben", + "qsv_slow_hevc_desc": "Dies kann HEVC-Kodierung auf älteren Intel GPUs ermöglichen, auf Kosten einer höheren GPU-Nutzung und schlechteren Performance.", + "res_fps_desc": "Die von Sunshine beworbenen Anzeigenmodi Einige Versionen von Moonlight, wie Moonlight-nx (Switch), verlassen sich auf diese Listen, um sicherzustellen, dass die angeforderten Auflösungen und fps unterstützt werden. Diese Einstellung ändert nicht die Art und Weise, wie der Bildschirm an Mondlight gesendet wird.", + "resolutions": "Angemeldete Auflösungen", + "restart_note": "Sonnenschein wird neu gestartet, um Änderungen anzuwenden.", + "sunshine_name": "Sonnenscheinname", + "sunshine_name_desc": "Der von Mononlight angezeigte Name, falls nicht angegeben, wird der Hostname des PCs verwendet", + "sw_preset": "SW-Voreinstellungen", + "sw_preset_desc": "Optimieren Sie den Abgleich zwischen der Kodierungsgeschwindigkeit (kodierte Frames pro Sekunde) und der Komprimierungseffizienz (Qualität pro Bit im Bitstream). Standard ist überflüssig.", + "sw_preset_fast": "schnell", + "sw_preset_faster": "schneller", + "sw_preset_medium": "mittel", + "sw_preset_slow": "langsam", + "sw_preset_slower": "langsamer", + "sw_preset_superfast": "superschnell (Standard)", + "sw_preset_ultrafast": "extrem schnell", "sw_preset_veryfast": "veryfast", "sw_preset_veryslow": "veryslow", "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", + "sw_tune_animation": "animation -- gut für Cartoons; verwendet höhere Deblocking und mehr Referenzrahmen", + "sw_tune_desc": "Einstellmöglichkeiten, die nach der Voreinstellung angewendet werden. Standard ist Null.", + "sw_tune_fastdecode": "fastdecode -- ermöglicht eine schnellere Dekodierung durch Deaktivieren bestimmter Filter", + "sw_tune_film": "film -- verwenden für qualitativ hochwertige Filminhalte; senkt Deblocking", + "sw_tune_grain": "korn -- bewahrt die Kornstruktur im alten, körnigen Filmmaterial", + "sw_tune_stillimage": "stillimage -- gut für slideshow-ähnliche Inhalte", + "sw_tune_zerolatency": "Zerolatency -- gut für schnelle Kodierung und Low-Latency Streaming (Standard)", + "touchpad_as_ds4": "Ein DS4 Gamepad emulieren, wenn der Client Gamepad meldet, dass ein Touchpad vorhanden ist", + "touchpad_as_ds4_desc": "Wenn deaktiviert, wird das Touchpad-Vorhandensein bei der Auswahl des Gamepad-Typs nicht berücksichtigt.", "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", - "virtual_sink_placeholder": "Steam Streaming Speakers", + "upnp_desc": "Portweiterleitung für Streaming über das Internet automatisch konfigurieren", + "virtual_sink": "Virtueller Sink", + "virtual_sink_desc": "Legen Sie ein virtuelles Audiogerät manuell fest. Wenn nicht gesetzt, wird das Gerät automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische Geräteauswahl zu verwenden!", + "virtual_sink_placeholder": "Steam Streaming Lautsprecher", "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", + "vt_realtime": "VideoToolbox Echtzeit-Codierung", "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "vt_software_allowed": "Zulässig", + "vt_software_forced": "Erzwungen", + "wan_encryption_mode": "WAN-Verschlüsselungsmodus", + "wan_encryption_mode_1": "Aktiviert für unterstützte Clients (Standard)", + "wan_encryption_mode_2": "Benötigt für alle Kunden", + "wan_encryption_mode_desc": "Dies legt fest, wann Verschlüsselung beim Streaming über das Internet verwendet wird. Verschlüsselung kann die Streaming-Leistung senken, insbesondere auf weniger leistungsfähigen Hosts und Clients." }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", + "description": "Sunshine ist ein selbst gehosteter Game-Stream-Host für Moonlight.", "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hello, Sunshine!" + "loading_latest": "Lade neueste Version...", + "new_nightly": "Eine neue Nachts Version ist verfügbar!", + "new_stable": "Eine neue Stable Version ist verfügbar!", + "startup_errors": "Achtung! Sunshine erkannte diese Fehler während des Starts. Wir STRONGLY EMPFOHLEN beheben sie vor dem Streaming.", + "version_dirty": "Vielen Dank, dass Sie dazu beigetragen haben, Sunshine zu einer besseren Software zu machen!", + "version_latest": "Du verwendest die neueste Version von Sunshine", + "welcome": "Hallo, Sonnenschein!" }, "navbar": { - "applications": "Applications", - "configuration": "Configuration", - "home": "Home", - "password": "Change Password", + "applications": "Anwendungen", + "configuration": "Konfiguration", + "home": "Zuhause", + "password": "Passwort ändern", "pin": "Pin", - "troubleshoot": "Troubleshooting" + "troubleshoot": "Fehlerbehebung" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "Passwort bestätigen", + "current_creds": "Aktuelle Zugangsdaten", + "new_creds": "Neue Zugangsdaten", + "new_username_desc": "Wenn nicht angegeben, wird der Benutzername nicht geändert", + "password_change": "Passwortänderung", + "success_msg": "Passwort wurde erfolgreich geändert! Diese Seite wird bald neu geladen, Ihr Browser wird Sie nach den neuen Zugangsdaten fragen." }, "pin": { + "pair_failure": "Paarung fehlgeschlagen: Prüfen Sie, ob die PIN korrekt eingegeben wurde", + "pair_success": "Erfolgreich! Bitte überprüfe Mondlicht um fortzufahren", "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "send": "Senden", + "warning_msg": "Stellen Sie sicher, dass Sie Zugriff auf den Client haben, mit dem Sie sich verbinden. Diese Software kann Ihrem Computer die totale Kontrolle geben, also seien Sie vorsichtig!" }, "resource_card": { "github_discussions": "GitHub Discussions", - "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "legal": "Rechtlich", + "legal_desc": "Durch die Weiterverwendung dieser Software erklären Sie sich mit den Nutzungsbedingungen in den folgenden Dokumenten einverstanden.", + "license": "Lizenz", + "lizardbyte_website": "LizardByte Webseite", + "resources": "Ressourcen", + "resources_desc": "Ressourcen für Sonnenschein!", + "third_party_notice": "Drittanbieter-Mitteilung" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", + "force_close": "Schließen erzwingen", + "force_close_desc": "Wenn sich Moonlight über eine aktuell laufende App beschwert, sollte das Schließen der App das Problem beheben.", + "force_close_error": "Fehler beim Schließen der Anwendung", + "force_close_success": "Anwendung erfolgreich geschlossen!", "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "logs_desc": "Siehe die Logs hochgeladen von Sunshine", + "logs_find": "Suchen...", + "restart_sunshine": "Sonnenschein neu starten", + "restart_sunshine_desc": "Wenn Sunshine nicht richtig funktioniert, können Sie versuchen, es neu zu starten. Dies wird alle laufenden Sitzungen beenden.", + "restart_sunshine_success": "Sonnenschein wird neu gestartet", + "troubleshooting": "Fehlerbehebung", + "unpair_all": "Alle trennen", + "unpair_all_desc": "Entferne alle deine gekoppelten Geräte", + "unpair_all_error": "Fehler beim Entkoppeln", + "unpair_all_success": "Erfolgreich getrennt!" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", - "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "confirm_password": "Passwort bestätigen", + "create_creds": "Bevor Sie loslegen, müssen Sie einen neuen Benutzernamen und ein neues Passwort für den Zugriff auf die Web-Oberfläche erstellen.", + "create_creds_alert": "Die unten angegebenen Anmeldedaten werden benötigt, um auf das Webinterface von Sunshine zuzugreifen. Halten Sie sie sicher, da Sie sie nie wieder sehen werden!", + "greeting": "Willkommen bei Sunshine!", + "login": "Anmelden", + "welcome_success": "Diese Seite wird bald neu geladen, Ihr Browser wird Sie nach den neuen Anmeldeinformationen fragen" } } 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 65b2c1cb47a..38b0097692c 100644 --- a/src_assets/common/assets/web/public/assets/locale/en.json +++ b/src_assets/common/assets/web/public/assets/locale/en.json @@ -3,7 +3,6 @@ "apply": "Apply", "auto": "Automatic", "autodetect": "Autodetect (recommended)", - "beta": "(beta)", "cancel": "Cancel", "disabled": "Disabled", "disabled_def": "Disabled (default)", @@ -93,18 +92,20 @@ "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_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", "amd_preanalysis": "AMF Preanalysis", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", "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_cbr": "cbr -- constant bitrate (default)", "amd_rc_cqp": "cqp -- constant qp mode", - "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (default)", + "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate", "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", - "amd_usage_lowlatency": "lowlatency - low latency (fast)", + "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_webcam": "webcam -- webcam (slow)", @@ -277,8 +278,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)", @@ -366,6 +367,8 @@ "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." }, "pin": { + "pair_failure": "Pairing Failed: Check if the PIN is typed correctly", + "pair_success": "Success! Please check Moonlight to continue", "pin_pairing": "PIN Pairing", "send": "Send", "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" 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 8d1be14d2af..bc10222217e 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,6 +92,7 @@ "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_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", "amd_preanalysis": "AMF Preanalysis", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", @@ -104,6 +105,7 @@ "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", "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)", @@ -334,6 +336,8 @@ "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." }, "pin": { + "pair_failure": "Pairing Failed: Check if the PIN is typed correctly", + "pair_success": "Success! Please check Moonlight to continue", "pin_pairing": "PIN Pairing", "send": "Send", "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" 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 8d1be14d2af..6fa1f3a04c4 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,18 +92,20 @@ "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_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", "amd_preanalysis": "AMF Preanalysis", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", "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_cbr": "cbr -- constant bitrate (default)", "amd_rc_cqp": "cqp -- constant qp mode", - "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (default)", + "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate", "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", - "amd_usage_lowlatency": "lowlatency - low latency (fast)", + "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_webcam": "webcam -- webcam (slow)", @@ -334,6 +336,8 @@ "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." }, "pin": { + "pair_failure": "Pairing Failed: Check if the PIN is typed correctly", + "pair_success": "Success! Please check Moonlight to continue", "pin_pairing": "PIN Pairing", "send": "Send", "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" 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 3a2a6aee9f3..5b119a97972 100644 --- a/src_assets/common/assets/web/public/assets/locale/es.json +++ b/src_assets/common/assets/web/public/assets/locale/es.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", - "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "apply": "Aplicar", + "auto": "Automático", + "autodetect": "Autodetectar (recomendado)", + "cancel": "Cancelar", + "disabled": "Deshabilitado", + "disabled_def": "Desactivado (por defecto)", + "do_cmd": "Hacer comando", + "elevated": "Elevado", + "enabled": "Habilitado", + "enabled_def": "Habilitado (por defecto)", + "error": "¡Error!", + "note": "Nota:", + "password": "Contraseña", + "run_as": "Ejecutar como administrador", + "save": "Guardar", + "see_more": "Ver más", + "success": "¡Éxito!", + "undo_cmd": "Deshacer comando", + "username": "Usuario", + "warning": "¡Advertencia!" }, "apps": { - "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", - "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", - "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", - "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", - "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", - "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", - "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "actions": "Acciones", + "add_cmds": "Añadir comandos", + "add_new": "Añadir nuevo", + "app_name": "Nombre de la aplicación", + "app_name_desc": "Nombre de la aplicación, como se muestra en Moonlight", + "applications_desc": "Las aplicaciones se actualizan sólo cuando se reinicia Client", + "applications_title": "Aplicaciones", + "auto_detach": "Continuar la transmisión si la aplicación cierra rápidamente", + "auto_detach_desc": "Esto intentará detectar automáticamente aplicaciones de tipo launcher que se cierran rápidamente después de iniciar otro programa o instancia de sí mismos. Cuando se detecta una aplicación tipo launcher, se trata como una aplicación separada.", + "cmd": "Comando", + "cmd_desc": "La aplicación principal a iniciar. Si está en blanco, no se iniciará ninguna aplicación.", + "cmd_note": "Si la ruta al comando ejecutable contiene espacios, debe encerrarla entre comillas.", + "cmd_prep_desc": "Una lista de comandos que se ejecutarán antes/después de esta aplicación. Si alguno de los comandos prep fallan, el inicio de la aplicación es abortado.", + "cmd_prep_name": "Preparaciones de Comando", + "covers_found": "Cubiertas encontradas", + "delete": "Eliminar", + "detached_cmds": "Comandos separados", + "detached_cmds_add": "Añadir comando separado", + "detached_cmds_desc": "Una lista de comandos a ejecutar en segundo plano.", + "detached_cmds_note": "Si la ruta al comando ejecutable contiene espacios, debe encerrarla entre comillas.", + "edit": "Editar", + "env_app_id": "ID de la aplicación", + "env_app_name": "Nombre de la aplicación", + "env_client_audio_config": "La configuración de audio solicitada por el cliente (2.0/5.1/7.1)", + "env_client_enable_sops": "El cliente ha solicitado la opción de optimizar el juego para una transmisión óptima (verdadero/falso)", + "env_client_fps": "El FPS solicitado por el cliente (int)", + "env_client_gcmap": "La máscara de gamepad solicitada, en formato bitset/bitfield (int)", + "env_client_hdr": "HDR está activado por el cliente (verdadero/falso)", + "env_client_height": "La altura solicitada por el cliente (int)", + "env_client_host_audio": "El cliente ha solicitado audio del host (verdadero/falso)", + "env_client_width": "Anchura solicitada por el cliente (int)", + "env_displayplacer_example": "Ejemplo - displayplacer para Automatización de Resoluciones:", + "env_qres_example": "Ejemplo - QRes para Automatización de Resoluciones:", + "env_qres_path": "ruta de qres", + "env_var_name": "Nombre Var", + "env_vars_about": "Acerca de variables de entorno", + "env_vars_desc": "Todos los comandos obtienen estas variables de entorno de forma predeterminada:", + "env_xrandr_example": "Ejemplo - Xrandr para Automatización de Resolución:", + "exit_timeout": "Tiempo de espera de salida", + "exit_timeout_desc": "Número de segundos a esperar a que todos los procesos de la aplicación salgan con gracia cuando se les solicite salir. Si no se activa, el valor predeterminado es esperar hasta 5 segundos. Si se establece a cero o un valor negativo, la aplicación se cerrará inmediatamente.", + "find_cover": "Encontrar portada", + "global_prep_desc": "Activar/Desactivar la ejecución de Comandos de Preparación Global para esta aplicación.", + "global_prep_name": "Comandos de preparación global", + "image": "Imagen", + "image_desc": "Ruta de la aplicación/dibujo/imagen que se enviará al cliente. La imagen debe ser un archivo PNG. Si no se establece, Sunshine enviará la imagen predeterminada de la caja.", + "loading": "Cargando...", + "name": "Nombre", + "output_desc": "El archivo donde se almacena la salida del comando, si no se especifica, se ignora la salida", + "output_name": "Salida", + "run_as_desc": "Esto puede ser necesario para que algunas aplicaciones que requieren permisos de administrador, funcionen correctamente.", + "wait_all": "Continuar la transmisión hasta que todos los procesos de la aplicación salgan", + "wait_all_desc": "Esto continuará transmitiendo hasta que todos los procesos iniciados por la aplicación hayan terminado. Cuando no está marcado, la transmisión se detendrá cuando el proceso inicial de la aplicación se cierre, incluso si otros procesos de aplicación siguen ejecutándose.", + "working_dir": "Directorio de trabajo", + "working_dir_desc": "El directorio de trabajo que debe pasarse al proceso. Por ejemplo, algunas aplicaciones usan el directorio de trabajo para buscar archivos de configuración. Si no se establece, Sunshine se establecerá por defecto en el directorio padre del comando" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", + "adapter_name": "Nombre del adaptador", + "adapter_name_desc_linux_1": "Especifique manualmente un GPU a usar para capturar.", + "adapter_name_desc_linux_2": "para encontrar todos los dispositivos capaces de VAAPI", + "adapter_name_desc_linux_3": "Reemplace ``renderD129`` con el dispositivo de arriba para listar el nombre y las capacidades del dispositivo. Para tener el soporte de Sunshine, necesita tener como mínimo:", + "adapter_name_desc_win": "Especifique manualmente un GPU a usar para capturar. Si no está activado, el GPU se elige automáticamente. Recomendamos encarecidamente dejar este campo en blanco para utilizar la selección automática de GPU! Nota: Esta GPU debe tener una pantalla conectada y encendida. Los valores apropiados se pueden encontrar usando el siguiente comando:", + "adapter_name_placeholder_win": "Serie RX 580 de Radeon", + "add": "Añadir", + "address_family": "Familia de dirección", "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "address_family_desc": "Establecer la familia de direcciones usada por Sunshine", + "address_family_ipv4": "Sólo IPv4", + "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_enforce_hrd": "Aplicación del decodificador de referencia hipotético (HRD) AMF", + "amd_preanalysis": "Análisis previo de AMF", + "amd_quality": "Calidad AMF", + "amd_quality_balanced": "balanceada -- balanceado (por defecto)", + "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_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_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)", + "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:", + "audio_sink_desc_macos": "El nombre de la salida de audio usado para Audio Loopback. Sunshine sólo puede acceder a micrófonos en macOS debido a limitaciones del sistema. Para transmitir audio del sistema usando Soundflower o BlackHole.", + "audio_sink_desc_win": "Especifique manualmente un dispositivo de audio específico a capturar. Si no está activado, el dispositivo se elige automáticamente. ¡Recomendamos encarecidamente dejar este campo en blanco para usar la selección automática de dispositivos! Si tiene varios dispositivos de audio con nombres idénticos, puede obtener el ID del dispositivo usando el siguiente comando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", - "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", - "configuration": "Configuration", - "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", + "audio_sink_placeholder_win": "Altavoces (Dispositivo de audio de alta definición)", + "av1_mode": "Soporte AV1", + "av1_mode_0": "Sunshine anunciará soporte para AV1 basado en las capacidades del codificador (recomendado)", + "av1_mode_1": "Sunshine no anunciará soporte para AV1", + "av1_mode_2": "Sunshine anunciará soporte para el perfil principal de 8 bits AV1", + "av1_mode_3": "Sunshine anunciará soporte para perfiles AV1 de 8-bit y 10-bit (HDR)", + "av1_mode_desc": "Permite al cliente solicitar flujos de vídeo AV1 Main de 8-bit o de 10-bits. AV1 es más intensivo en CPU para codificar, por lo que permitir esto puede reducir el rendimiento al usar la codificación de software.", + "back_button_timeout": "Tiempo de Emulación de Botón de Inicio/Guía", + "back_button_timeout_desc": "Si se mantiene presionado el botón Atrás/Seleccionar para el número de milisegundos especificado, se emula un botón Inicio/Guía. Si se establece un valor < 0 (por defecto), mantener presionado el botón Volver/Seleccionar no se activará el botón Inicio/Guía.", + "capture": "Forzar un método de captura específico", + "capture_desc": "En modo automático Sunshine usará el primero que funcione.", + "cert": "Certificado", + "cert_desc": "El certificado utilizado para la conexión del cliente de UI web y Moonlight. Para la mejor compatibilidad, debe tener una clave pública RSA-2048.", + "channels": "Máximo de clientes conectados", + "channels_desc_1": "Sunshine puede permitir que una sola sesión de transmisión sea compartida con varios clientes simultáneamente.", + "channels_desc_2": "Algunos codificadores de hardware pueden tener limitaciones que reducen el rendimiento con múltiples secuencias.", + "coder_cabac": "cabac -- codificación aritmética binaria adaptativa contextual - mayor calidad", + "coder_cavlc": "cavlc -- codificación de longitud variable adaptativa de contexto - decodificación más rápida", + "configuration": "Configuración", + "controller": "Activar entrada de Gamepad", + "controller_desc": "Permite a los huéspedes controlar el sistema de host con un gamepad / controlador", + "credentials_file": "Archivo de credenciales", + "credentials_file_desc": "Guardar nombre de usuario/contraseña por separado del archivo de estado de Sunshine.", + "ds4_back_as_touchpad_click": "Mapa Atrás/Seleccionar a Touchpad Clic", + "ds4_back_as_touchpad_click_desc": "Al forzar la emulación DS4, mapar Atrás/Seleccionar a Touchpad Clic", + "encoder": "Forzar un codificador específico", + "encoder_desc": "Forzar un codificador específico, de lo contrario Sunshine seleccionará la mejor opción disponible. Nota: Si especifica un codificador de hardware en Windows, debe coincidir con el GPU donde la pantalla está conectada.", "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "external_ip": "IP externa", + "external_ip_desc": "Si no se da ninguna dirección IP externa, Sunshine detectará automáticamente IP externa", + "fec_percentage": "Porcentaje FEC", + "fec_percentage_desc": "Porcentaje de errores corrigiendo paquetes por paquete de datos en cada fotograma de vídeo. Valores más altos pueden corregir para más pérdida de paquetes de red, pero a costa de aumentar el uso del ancho de banda.", + "ffmpeg_auto": "auto -- dejar que ffmpeg decida (por defecto)", + "file_apps": "Archivo de aplicaciones", + "file_apps_desc": "El archivo donde se almacenan las aplicaciones actuales de Sunshine.", + "file_state": "Archivo de estado", + "file_state_desc": "El archivo donde se almacena el estado actual de Sunshine", + "fps": "FPS anunciada", + "gamepad": "Tipo de Gamepad emulado", + "gamepad_auto": "Opciones de selección automática", + "gamepad_desc": "Elegir qué tipo de gamepad emular en el host", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "Opciones Manual de DS4", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", - "log_level_0": "Verbose", - "log_level_1": "Debug", - "log_level_2": "Info", - "log_level_3": "Warning", + "global_prep_cmd": "Preparaciones de Comando", + "global_prep_cmd_desc": "Configurar una lista de comandos a ejecutar antes o después de ejecutar cualquier aplicación. Si alguno de los comandos de preparación especificados falla, el proceso de inicio de la aplicación será abortado.", + "hevc_mode": "Soporte de HEVC", + "hevc_mode_0": "Sunshine anunciará el soporte para HEVC basado en las capacidades del codificador (recomendado)", + "hevc_mode_1": "Sunshine no anunciará soporte para HEVC", + "hevc_mode_2": "Sunshine anunciará soporte para el perfil principal de HEVC", + "hevc_mode_3": "Sunshine anunciará soporte para perfiles HEVC Main y Main10 (HDR)", + "hevc_mode_desc": "Permite al cliente solicitar videos HEVC Main o HEVC Main10. HEVC es más intensivo en CPU para codificar, por lo que habilitar esto puede reducir el rendimiento al usar la codificación de software.", + "high_resolution_scrolling": "Soporte de desplazamiento de alta resolución", + "high_resolution_scrolling_desc": "Cuando está activado, Sunshine pasará a través de eventos de desplazamiento de alta resolución desde clientes de Moonlight. Esto puede ser útil para aplicaciones antiguas que se desplazan demasiado rápido con eventos de desplazamiento de alta resolución.", + "install_steam_audio_drivers": "Instalar los controladores de audio de Steam", + "install_steam_audio_drivers_desc": "Si Steam está instalado, automáticamente instalará el controlador de altavoces de Steam Streaming para soportar sonido envolvente 5.1/7.1 y silenciar audio del host.", + "key_repeat_delay": "Retardo de repetición de Clave", + "key_repeat_delay_desc": "Controla cómo se repetirán las teclas rápidas. El retardo inicial en milisegundos antes de repetir las teclas.", + "key_repeat_frequency": "Frecuencia de repetición de clave", + "key_repeat_frequency_desc": "Con qué frecuencia las claves se repiten cada segundo. Esta opción configurable soporta decimales.", + "key_rightalt_to_key_win": "Asignar la tecla Alt derecha a la tecla Windows", + "key_rightalt_to_key_win_desc": "Es posible que no pueda enviar directamente la tecla de Windows desde Moonlight. En esos casos puede ser útil hacer que Sunshine piense que la tecla Alt correcta es la clave de Windows", + "keyboard": "Activar entrada de teclado", + "keyboard_desc": "Permite a los invitados controlar el sistema de host con el teclado", + "lan_encryption_mode": "Modo de cifrado LAN", + "lan_encryption_mode_1": "Habilitado para clientes compatibles", + "lan_encryption_mode_2": "Requerido para todos los clientes", + "lan_encryption_mode_desc": "Esto determina cuándo se utilizará el cifrado al transmitir a través de su red local. El cifrado puede reducir el rendimiento de la transmisión, especialmente en hosts y clientes menos poderosos.", + "locale": "Local", + "locale_desc": "La configuración regional utilizada para la interfaz de usuario de Sunshine.", + "log_level": "Nivel de registro", + "log_level_0": "Detallado", + "log_level_1": "Depurar", + "log_level_2": "Información", + "log_level_3": "Advertencia", "log_level_4": "Error", "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", + "log_level_6": "Ninguna", + "log_level_desc": "El nivel mínimo de registro impreso a nivel estándar", + "log_path": "Ruta del archivo de registro", + "log_path_desc": "El archivo donde se almacenan los registros actuales de Sunshine.", + "min_threads": "Recuento mínimo de hilos de CPU", + "min_threads_desc": "Incrementar el valor reduce ligeramente la eficiencia de la codificación, pero la compensación suele valer la pena para obtener el uso de más núcleos de CPU para la codificación. El valor ideal es el valor más bajo que puede codificar de forma fiable en los ajustes de streaming deseados en su hardware.", + "misc": "Opciones varias", + "motion_as_ds4": "Emular un gamepad DS4 si el gamepad del cliente informa que los sensores de movimiento están presentes", + "motion_as_ds4_desc": "Si está desactivado, los sensores de movimiento no se tendrán en cuenta durante la selección del tipo gamepad.", + "mouse": "Activar entrada del ratón", + "mouse_desc": "Permite a los huéspedes controlar el sistema de host con el ratón", + "native_pen_touch": "Soporte de lápiz/táctil nativo", + "native_pen_touch_desc": "Cuando está activado, Sunshine pasará a través de eventos nativos de pluma/táctil de clientes de Sunshine. Esto puede ser útil para deshabilitar para aplicaciones antiguas sin soporte nativo de pluma/táctil.", + "nvenc_h264_cavlc": "Preferir CAVLC sobre CABAC en H.264", + "nvenc_h264_cavlc_desc": "Forma más simple de codificación entropía. CAVLC necesita alrededor del 10% más de la tasa de bits para la misma calidad. Sólo relevante para dispositivos de decodificación realmente antiguos.", + "nvenc_latency_over_power": "Preferir menor latencia de codificación sobre ahorro de energía", + "nvenc_latency_over_power_desc": "Sunshine solicita la máxima velocidad de reloj GPU mientras se transmite para reducir la latencia de codificación. Deshabilitar no es recomendable ya que esto puede llevar a un aumento significativo de la latencia de la codificación.", + "nvenc_opengl_vulkan_on_dxgi": "Presentar OpenGL/Vulkan por encima de DXGI", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine no puede capturar programas OpenGL y Vulkan de pantalla completa a menos que se presenten sobre DXGI. Este es un ajuste para todo el sistema que se revierte al salir del programa Sunshine.", + "nvenc_preset": "Rendimiento predefinido", + "nvenc_preset_1": "(más rápido, por defecto)", + "nvenc_preset_7": "(más lento)", + "nvenc_preset_desc": "Los números más altos mejoran la compresión (calidad a una tasa de bits dada) a costa de una mayor latencia de codificación. Se recomienda cambiar sólo cuando esté limitado por la red o el decodificador; de lo contrario, se puede conseguir un efecto similar aumentando la tasa de bits.", + "nvenc_realtime_hags": "Usar prioridad en tiempo real en la programación de gpu acelerada por hardware", + "nvenc_realtime_hags_desc": "Actualmente los controladores NVIDIA pueden congelarse en el codificador cuando HAGS está habilitado, se utiliza prioridad en tiempo real y la utilización de VRAM está cerca del máximo. Deshabilitar esta opción reduce la prioridad a alto, evitando la congelación a costa de un menor rendimiento de captura cuando la GPU está muy cargada.", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", - "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", - "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", - "port_port": "Port", - "port_protocol": "Protocol", + "nvenc_spatial_aq_desc": "Asigne valores más altos de QP a regiones planas del vídeo. Recomendado para habilitar al transmitir a tasas de bits más bajas.", + "nvenc_spatial_aq_disabled": "Desactivado (más rápido, por defecto)", + "nvenc_spatial_aq_enabled": "Habilitado (más lento)", + "nvenc_twopass": "Modo dos pases", + "nvenc_twopass_desc": "Añade una tarjeta de codificación preliminar. Esto permite detectar más vectores de movimiento, distribuir mejor la tasa de bits a lo largo del fotograma y adherirse más estrictamente a los límites de la tasa de bits. Deshabilitar no es recomendable ya que esto puede llevar a un rebasamiento ocasional de la tasa de bits y a la pérdida posterior de paquetes.", + "nvenc_twopass_disabled": "Desactivado (lo más rápido, no recomendado)", + "nvenc_twopass_full_res": "Resolución completa (más lento)", + "nvenc_twopass_quarter_res": "Resolución de un cuarto (más rápido, por defecto)", + "nvenc_vbv_increase": "Incremento porcentual de VBV/HRD de un solo fotograma", + "nvenc_vbv_increase_desc": "Por defecto, Sunshine utiliza VBV/HRD de fotograma único, lo que significa que no se espera que el tamaño de ningún fotograma de vídeo codificado supere la tasa de bits solicitada dividida por la tasa de fotogramas solicitada. Flexibilizar esta restricción puede ser beneficioso y actuar como una tasa de bit variable de baja latencia, pero también puede conducir a la pérdida de paquetes si la red no tiene espacio en el búfer para manejar los picos de la tasa de bits. El valor máximo aceptado es 400, que corresponde a un límite de tamaño superior de fotograma de vídeo codificado 5 veces mayor.", + "origin_web_ui_allowed": "Origin Web UI Permitido", + "origin_web_ui_allowed_desc": "El origen de la dirección del punto final remoto al que no se le niega el acceso a la UI web", + "origin_web_ui_allowed_lan": "Sólo aquellos en LAN pueden acceder a la Web UI", + "origin_web_ui_allowed_pc": "Sólo localhost puede acceder a la Web UI", + "origin_web_ui_allowed_wan": "Cualquiera puede acceder a Web UI", + "output_name_desc_linux": "Durante el arranque de Sunshine, debería ver la lista de monitoreos detectados. Necesita usar el valor antes de los dos puntos en la salida. Ejemplo:", + "output_name_desc_win": "Especifique manualmente una pantalla a usar para capturar. Si no está activada, se captura la pantalla principal. Nota: Si ha especificado un GPU arriba, esta pantalla debe estar conectada a ese GPU. Los valores apropiados se pueden encontrar usando el siguiente comando:", + "output_name_linux": "Número de seguimiento", + "output_name_win": "Nombre de salida", + "ping_timeout": "Tiempo de espera", + "ping_timeout_desc": "Cuánto tiempo esperar en milisegundos los datos de Moonlight antes de apagar la corriente", + "pkey": "Clave Privada", + "pkey_desc": "La clave privada usada para la conexión del cliente de interfaz web y luz lunar. Para la mejor compatibilidad, debe ser una clave privada RSA-2048.", + "port": "Puerto", + "port_alert_1": "¡Sunshine no puede usar puertos por debajo de 1024!", + "port_alert_2": "¡Los puertos superiores a 65535 no están disponibles!", + "port_desc": "Establecer la familia de puertos utilizados por Sunshine", + "port_http_port_note": "Use este puerto para conectar con Moonlgiht", + "port_note": "Nota", + "port_port": "Puerto", + "port_protocol": "Protocolo", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", + "port_warning": "¡Exponer la UI web a Internet es un riesgo para la seguridad! ¡Proceda bajo su propia responsabilidad!", "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", - "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", - "sw_preset_ultrafast": "ultrafast", - "sw_preset_veryfast": "veryfast", - "sw_preset_veryslow": "veryslow", - "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", + "qp": "Parámetro de Cuantización", + "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_faster": "más rápido (menor calidad)", + "qsv_preset_medium": "medio (por defecto)", + "qsv_preset_slow": "lento (buena calidad)", + "qsv_preset_slower": "lento (mejor calidad)", + "qsv_preset_slowest": "Lo más lento (la mejor calidad)", + "qsv_preset_veryfast": "más rápido (menor calidad)", + "qsv_slow_hevc": "Permitir codificación HEVC lenta", + "qsv_slow_hevc_desc": "Esto puede habilitar la codificación HEVC en GPU de Intel, a costa de un mayor uso de GPU y un peor rendimiento.", + "res_fps_desc": "Los modos de visualización anunciados por Sunshine. Algunas versiones de Moonlight, como Moonlight-nx (Switch), se basan en estas listas para asegurar que las resoluciones y fps solicitadas sean soportadas. Esta configuración no cambia la forma en que la secuencia de pantalla se envía a Moonlight.", + "resolutions": "Resoluciones anunciadas", + "restart_note": "Sunshine se está reiniciando para aplicar cambios.", + "sunshine_name": "Nombre de Sunshine", + "sunshine_name_desc": "El nombre mostrado por Moonlight. Si no se especifica, se utiliza el nombre de host del PC", + "sw_preset": "Preajustes SW", + "sw_preset_desc": "Optimice la compensación entre la velocidad de codificación (fotogramas codificados por segundo) y la eficiencia de la compresión (calidad por bit en el flujo de bits). Por defecto es superrápido.", + "sw_preset_fast": "rápido", + "sw_preset_faster": "más rápido", + "sw_preset_medium": "medio", + "sw_preset_slow": "lento", + "sw_preset_slower": "más lento", + "sw_preset_superfast": "superrápido (por defecto)", + "sw_preset_ultrafast": "Super Veloz", + "sw_preset_veryfast": "muy rápido", + "sw_preset_veryslow": "muy lento", + "sw_tune": "Sintonía SW", + "sw_tune_animation": "animación -- buena para dibujos animados; utiliza un mayor desbloqueo y más fotogramas de referencia", + "sw_tune_desc": "Opciones de ajuste, que se aplican después de la predeterminada. Por defecto es cero.", + "sw_tune_fastdecode": "decodificación rápida -- permite una decodificación más rápida deshabilitando ciertos filtros", + "sw_tune_film": "Película: se utiliza para películas de alta calidad; reduce el desbloqueo.", + "sw_tune_grain": "grano -- conserva la estructura del grano en el viejo material de película de grano", + "sw_tune_stillimage": "imagen fija -- bueno para contenido de diapositivas", + "sw_tune_zerolatency": "latencia cero -- bueno para codificación rápida y transmisión de baja latencia (por defecto)", + "touchpad_as_ds4": "Emular un gamepad DS4 si el gamepad del cliente reporta que un touchpad está presente", + "touchpad_as_ds4_desc": "Si está desactivado, la presencia del touchpad no se tendrá en cuenta durante la selección del tipo gamepad.", "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", - "virtual_sink_placeholder": "Steam Streaming Speakers", - "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", - "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "upnp_desc": "Configurar automáticamente el reenvío de puertos para transmitir a través de Internet", + "virtual_sink": "Enlace virtual", + "virtual_sink_desc": "Especifique manualmente un dispositivo de audio virtual a utilizar. Si no está activado, el dispositivo se elige automáticamente. ¡Recomendamos encarecidamente dejar este campo en blanco para usar la selección automática de dispositivos!", + "virtual_sink_placeholder": "Altavoces de Steam Streaming", + "vt_coder": "Codificador de VideoToolbox", + "vt_realtime": "Codificación de tiempo real de VideoToolbox", + "vt_software": "Codificación de software VideoToolbox", + "vt_software_allowed": "Permitido", + "vt_software_forced": "Forzado", + "wan_encryption_mode": "Modo de cifrado WAN", + "wan_encryption_mode_1": "Activado para clientes compatibles (por defecto)", + "wan_encryption_mode_2": "Requerido para todos los clientes", + "wan_encryption_mode_desc": "Esto determina cuándo se utilizará el cifrado al transmitir a través de Internet. El cifrado puede reducir el rendimiento de la transmisión, especialmente en hosts y clientes menos poderosos." }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", - "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hola, Sunshine!" + "description": "Sunshine es un servidor de transmisión de juego autoalojado para Moonlight.", + "download": "Descargar", + "loading_latest": "Cargando la última versión...", + "new_nightly": "¡Una nueva versión Nocturna está disponible!", + "new_stable": "¡Una nueva versión estable está disponible!", + "startup_errors": "Atención. Sunshine ha detectado estos errores durante el arranque. RECOMENDAMOS ENCARECIDAMENTE solucionarlos antes de transmitir.", + "version_dirty": "¡Gracias por ayudar a hacer de Sunshine un mejor software!", + "version_latest": "Está ejecutando la última versión de Sunshine", + "welcome": "¡Hola, Sunshine!" }, "navbar": { - "applications": "Applications", - "configuration": "Configuration", - "home": "Home", - "password": "Change Password", - "pin": "Pin", - "troubleshoot": "Troubleshooting" + "applications": "Aplicaciones", + "configuration": "Configuración", + "home": "Inicio", + "password": "Cambiar contraseña", + "pin": "Fijar", + "troubleshoot": "Resolución de problemas" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "Confirmar contraseña", + "current_creds": "Credenciales actuales", + "new_creds": "Nuevas credenciales", + "new_username_desc": "Si no se especifica, el nombre de usuario no cambiará", + "password_change": "Cambio de contraseña", + "success_msg": "¡La contraseña se ha cambiado con éxito! Esta página se recargará pronto, su navegador le pedirá las nuevas credenciales." }, "pin": { - "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "pair_failure": "Falló el emparejamiento: Compruebe si el PIN está escrito correctamente", + "pair_success": "¡Éxito! Por favor revise Moonlight para continuar", + "pin_pairing": "Emparejamiento de PIN", + "send": "Enviar", + "warning_msg": "Asegúrate de tener acceso al cliente con el que estás emparejando. Este software puede dar control total a tu computadora, ¡así que ten cuidado!" }, "resource_card": { - "github_discussions": "GitHub Discussions", + "github_discussions": "Discusiones GitHub", "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "legal_desc": "Al continuar utilizando este software usted acepta los términos y condiciones de los siguientes documentos.", + "license": "Licencia", + "lizardbyte_website": "Sitio web de LizardByte", + "resources": "Recursos", + "resources_desc": "¡Recursos para Sunshine!", + "third_party_notice": "Aviso de Terceros" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", - "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "force_close": "Forzar cierre", + "force_close_desc": "Si Moonlight se queja de una aplicación actualmente en funcionamiento, forzar el cierre de la aplicación debería solucionar el problema.", + "force_close_error": "Error al cerrar la aplicación", + "force_close_success": "¡Aplicación cerrada con éxito!", + "logs": "Registros", + "logs_desc": "Ver los registros cargados por Sunshine", + "logs_find": "Encontrar...", + "restart_sunshine": "Reiniciar Sunshine", + "restart_sunshine_desc": "Si Sunshine no funciona correctamente, puede intentar reiniciarlo. Esto terminará cualquier sesión en ejecución.", + "restart_sunshine_success": "Sunshine se está reiniciando", + "troubleshooting": "Resolución de problemas", + "unpair_all": "Desemparejar todo", + "unpair_all_desc": "Elimine todos sus dispositivos emparejados", + "unpair_all_error": "Error al desvincular", + "unpair_all_success": "¡Desvinculación exitosa!" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", - "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "confirm_password": "Confirmar contraseña", + "create_creds": "Antes de empezar, necesitamos que crees un nuevo nombre de usuario y contraseña para acceder a la Web UI.", + "create_creds_alert": "Las credenciales a continuación son necesarias para acceder a la interfaz web de Sunshine. Manténgalas seguras, ¡ya que nunca volverá a verlas!", + "greeting": "¡Bienvenido a Sunshine!", + "login": "Iniciar sesión", + "welcome_success": "Esta página se recargará pronto, su navegador le pedirá las nuevas credenciales" } } 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 8d1be14d2af..9d1559e32a5 100644 --- a/src_assets/common/assets/web/public/assets/locale/fr.json +++ b/src_assets/common/assets/web/public/assets/locale/fr.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", - "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "apply": "Applique", + "auto": "Automatique", + "autodetect": "Détection automatique (recommandé)", + "cancel": "Annuler", + "disabled": "Désactivé", + "disabled_def": "Désactivé (par défaut)", + "do_cmd": "Commande de début", + "elevated": "Élevée", + "enabled": "Activé", + "enabled_def": "Activé (par défaut)", + "error": "Erreur !", + "note": "Note :", + "password": "Mot de passe", + "run_as": "Exécuter en tant qu'Administrateur", + "save": "Sauvegarder", + "see_more": "Voir plus", + "success": "Succès !", + "undo_cmd": "Commande de fin", + "username": "Nom d’utilisateur", + "warning": "Attention !" }, "apps": { "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", + "add_cmds": "Ajouter des commandes", + "add_new": "Ajouter une nouvelle", + "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", "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", - "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", - "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", + "auto_detach": "Continuer le streaming si l'application quitte rapidement", + "auto_detach_desc": "Cela va tenter de détecter automatiquement les applications de type launcher qui se ferment rapidement après le lancement d'un autre programme ou d'une instance d'eux-mêmes. Lorsqu'une application de type lanceur est détectée, elle est traitée comme une application détachée.", + "cmd": "Commande", + "cmd_desc": "L'application principale à démarrer. Si vide, aucune application ne sera démarrée.", + "cmd_note": "Si le chemin vers l'exécutable de la commande contient des espaces, vous devez l'entourer de guillemets.", + "cmd_prep_desc": "Une liste de commandes à exécuter avant/après cette application. Si l'une des commandes préalables échoue, le démarrage de l'application est interrompu.", + "cmd_prep_name": "Commandes de préparation", + "covers_found": "Jaquettes trouvées", + "delete": "Supprimer", + "detached_cmds": "Commandes détachées", + "detached_cmds_add": "Ajouter une commande détachée", + "detached_cmds_desc": "Une liste de commandes à exécuter en arrière-plan.", + "detached_cmds_note": "Si le chemin vers l'exécutable de la commande contient des espaces, vous devez l'entourer de guillemets.", + "edit": "Modifier", + "env_app_id": "ID de l'application", + "env_app_name": "Nom de l'application", + "env_client_audio_config": "La configuration audio demandée par le client (2.0/5.1/7.1)", + "env_client_enable_sops": "Le client a activé l'option pour optimiser le jeu pour une diffusion optimale (true/false)", + "env_client_fps": "FPS demandé par le client (int)", + "env_client_gcmap": "Le masque de manette demandé, au format bitset/bitfield (int)", + "env_client_hdr": "Le HDR est activé par le client (true/false)", + "env_client_height": "La hauteur demandée par le client (int)", + "env_client_host_audio": "Le client a activé l'audio côté audio (true/false)", + "env_client_width": "La largeur demandée par le client (int)", + "env_displayplacer_example": "Exemple - displayplacer pour l'automatisation de la résolution :", + "env_qres_example": "Exemple - QRes pour l'automatisation de la résolution :", + "env_qres_path": "chemin de qres", + "env_var_name": "Nom de la variable", + "env_vars_about": "À propos des variables d'environnement", + "env_vars_desc": "Toutes les commandes récupèrent ces variables d'environnement par défaut :", + "env_xrandr_example": "Exemple - Xrandr pour l'automatisation de la résolution :", + "exit_timeout": "Délai de fermeture", + "exit_timeout_desc": "Nombre de secondes d'attente pour que tous les processus de l'application se ferment gracieusement lorsque demandé à quitter. Si non défini, la valeur par défaut est d'attendre jusqu'à 5 secondes. Si elle est définie à zéro ou à une valeur négative, l'application sera immédiatement fermée.", + "find_cover": "Trouver une jaquette", + "global_prep_desc": "Activer/désactiver l'exécution des commandes globales de préparation pour cette application.", + "global_prep_name": "Commandes globales de préparation", "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", - "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", - "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "image_desc": "Chemin d'accès à l'icône/image de l'application qui sera envoyée au client. L'image doit être un fichier PNG. Si ce n'est pas le cas, Sunshine enverra une jaquette par défaut.", + "loading": "Chargement...", + "name": "Nom", + "output_desc": "Le fichier dans lequel la sortie de la commande est stockée, s'il n'est pas spécifié, la sortie est ignorée", + "output_name": "Sortie", + "run_as_desc": "Cela peut être nécessaire pour certaines applications qui nécessitent des autorisations d'administrateur pour fonctionner correctement.", + "wait_all": "Continuer le streaming jusqu'à ce que tous les processus de l'application quittent", + "wait_all_desc": "Cela continuera le streaming jusqu'à ce que tous les processus démarrés par l'application soient terminés. Si non coché, le streaming s'arrêtera lorsque le processus initial de l'application se terminera, même si d'autres processus sont toujours en cours d'exécution.", + "working_dir": "Démarrer dans", + "working_dir_desc": "Le répertoire de démarrage qui doit être passé au processus. Par exemple, certaines applications utilisent le répertoire de démarrage \n pour rechercher des fichiers de configuration. Si non défini, Sunshine utilisera par défaut le répertoire parent de la commande" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", + "adapter_name": "Nom de l'adaptateur", + "adapter_name_desc_linux_1": "Spécifiez manuellement un GPU à utiliser pour la capture.", + "adapter_name_desc_linux_2": "pour trouver tous les appareils capables d'utiliser l'interface VAAPI", + "adapter_name_desc_linux_3": "Remplacez ``renderD129`` par le dispositif ci-dessus pour énumérer le nom et les capacités du dispositif. Pour être pris en charge par Sunshine, il doit avoir au minimum les caractéristiques suivantes :", + "adapter_name_desc_win": "Spécifiez manuellement un GPU à utiliser pour la capture. Si non défini, le GPU est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique du GPU ! Note: Ce GPU doit avoir un écran connecté et allumé. Les valeurs appropriées peuvent être trouvées en utilisant la commande suivante :", "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", - "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "add": "Ajouter", + "address_family": "Famille d'adresses", + "address_family_both": "IPv4 et IPv6", + "address_family_desc": "Définit la famille d'adresses utilisée par Sunshine", + "address_family_ipv4": "IPv4 uniquement", + "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_enforce_hrd": "Enforcement du Décodeur Hypothetical Reference Decoder (HRD) de l'AMF", + "amd_preanalysis": "Pré-analyse AMF", + "amd_quality": "Qualité AMF", + "amd_quality_balanced": "balanced -- équilibré (par défaut)", + "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_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_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)", + "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:", + "audio_sink_desc_macos": "Le nom du dissipateur audio utilisé pour la boucle audio. Sunshine ne peut accéder aux micros que sur macOS en raison de limitations du système. Diffusez de l'audio système en utilisant Soundflower ou BlackHole.", + "audio_sink_desc_win": "Spécifiez manuellement un périphérique audio spécifique à capturer. Si non défini, le périphérique est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique de l'appareil ! Si vous avez plusieurs périphériques audio avec des noms identiques, vous pouvez obtenir l'ID du périphérique en utilisant la commande suivante :", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", - "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", + "audio_sink_placeholder_win": "Haut-parleurs (High Definition Audio Device)", + "av1_mode": "Support de l'AV1", + "av1_mode_0": "Sunshine annoncera la prise en charge de l'AV1 en fonction des capacités de l'encodeur (recommandé)", + "av1_mode_1": "Sunshine n'annoncera pas la prise en charge de l'AV1", + "av1_mode_2": "Sunshine annoncera la prise en charge de l'AV1 Main 8-bit profile", + "av1_mode_3": "Sunshine annoncera la prise en charge de l'AV1 Main 8-bit et 10-bit (HDR) profiles", + "av1_mode_desc": "Permet au client de demander des flux vidéo AV1 8-bit ou 10-bit. AV1 est plus gourmand en CPU pour l'encodage, ce qui peut réduire les performances lors de l'utilisation de l'encodage logiciel.", + "back_button_timeout": "Délai d'émulation du bouton Home/Guide", + "back_button_timeout_desc": "Si le bouton Précédent/Sélection est enfoncé pour le nombre spécifié de millisecondes, un bouton Accueil/Guide est émulé. Si défini à une valeur < 0 (par défaut), maintenir le bouton Retour/Sélectionner n'émulera pas le bouton Accueil/Guide.", + "capture": "Forcer une méthode de capture spécifique", + "capture_desc": "En mode automatique, Sunshine utilisera le premier qui fonctionne. NvFBC nécessite des pilotes nvidia corrigés.", + "cert": "Certificat", + "cert_desc": "Le certificat utilisé pour l'appairage de l'interface web et du client Moonlight. Pour une meilleure compatibilité, cela devrait avoir une clé publique RSA-2048.", + "channels": "Nombre maximum de clients connectés", + "channels_desc_1": "Sunshine peut permettre à une seule session de streaming d'être partagée simultanément avec plusieurs clients.", + "channels_desc_2": "Certains encodeurs matériels peuvent avoir des limitations qui réduisent les performances avec plusieurs flux.", + "coder_cabac": "cabac -- Contexte de codage arithmétique binaire adaptatif - qualité supérieure", + "coder_cavlc": "cavlc -- codage de la durée adaptative du contexte - décodage plus rapide", "configuration": "Configuration", - "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", - "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "controller": "Activer l'entrée manette", + "controller_desc": "Permet aux invités de contrôler le système hôte avec un manette / contrôleur", + "credentials_file": "Fichier des identifiants", + "credentials_file_desc": "Stocker le nom d'utilisateur/mot de passe séparément du fichier de données de Sunshine.", + "ds4_back_as_touchpad_click": "Mapper Retour/Sélection au clic du pavé tactile", + "ds4_back_as_touchpad_click_desc": "Lorsque vous forcez l'émulation DS4, mapper retour/sélectionner sur Touchpad Clic", + "encoder": "Forcer un encodeur spécifique", + "encoder_desc": "Forcer un encodeur spécifique, sinon Sunshine sélectionnera la meilleure option disponible. Note : Si vous spécifiez un encodeur matériel sous Windows, il doit correspondre au GPU où l'affichage est connecté.", + "encoder_software": "Logiciel", + "external_ip": "Adresse IP externe", + "external_ip_desc": "Si aucune adresse IP externe n'est fournie, Sunshine la détectera automatiquement", + "fec_percentage": "Pourcentage de FEC", + "fec_percentage_desc": "Pourcentage de paquets corrigeant les erreurs par paquet de données dans chaque image vidéo. Des valeurs plus élevées permettent de corriger davantage de pertes de paquets sur le réseau, mais au prix d'une augmentation de l'utilisation de la bande passante.", + "ffmpeg_auto": "auto -- laisser ffmpeg décider (par défaut)", + "file_apps": "Fichier des applications", + "file_apps_desc": "Le fichier où sont stockées les applications de Sunshine.", + "file_state": "Fichier des données", + "file_state_desc": "Le fichier où l'état actuel de Sunshine est stocké", + "fps": "FPS annoncés", + "gamepad": "Type de manette émulée", + "gamepad_auto": "Options automatiques", + "gamepad_desc": "Choisissez le type de manette à émuler sur l'hôte", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "Options manuelles pour DS4", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", - "log_level_0": "Verbose", - "log_level_1": "Debug", + "global_prep_cmd": "Commandes de préparation", + "global_prep_cmd_desc": "Configurer une liste de commandes à exécuter avant ou après l'exécution d'une application. Si l'une des commandes de préparation spécifiées échoue, le processus de lancement de l'application sera abandonné.", + "hevc_mode": "Support du HEVC", + "hevc_mode_0": "Sunshine annoncera la prise en charge de HEVC en fonction des capacités de l'encodeur (recommandé)", + "hevc_mode_1": "Sunshine n'annoncera pas la prise en charge du HEVC", + "hevc_mode_2": "Sunshine annoncera la prise en charge du HEVC Main profile", + "hevc_mode_3": "Sunshine annoncera la prise en charge du HEVC Main et Main10 (HDR)", + "hevc_mode_desc": "Permet au client de demander des flux vidéo HEVC Main ou HEVC Main10. HEVC est plus gourmand en CPU pour l'encodage, ce qui peut réduire les performances lors de l'utilisation de l'encodage logiciel.", + "high_resolution_scrolling": "Prise en charge du défilement haute résolution", + "high_resolution_scrolling_desc": "Lorsque cette option est activée, Sunshine passera par les événements de défilement haute résolution des clients de Lune. Cela peut être utile pour désactiver pour les anciennes applications qui font défiler trop vite avec des événements de défilement haute résolution.", + "install_steam_audio_drivers": "Installer les pilotes audio Steam", + "install_steam_audio_drivers_desc": "Si Steam est installé, cela installera automatiquement le pilote Steam Streaming Speakers pour prendre en charge le son surround 5.1/7.1 et rendre muet l'audio de l'hôte.", + "key_repeat_delay": "Délai de répétition de la clé", + "key_repeat_delay_desc": "Contrôle la vitesse à laquelle les clés se répètent. Le délai initial en millisecondes avant de répéter les clés.", + "key_repeat_frequency": "Fréquence de répétition des touches", + "key_repeat_frequency_desc": "Fréquence de répétition des touches chaque seconde. Cette option configurable prend en charge les décimaux.", + "key_rightalt_to_key_win": "Mapper la touche Alt droite à la touche Windows", + "key_rightalt_to_key_win_desc": "Il est possible que vous ne puissiez pas envoyer directement la touche Windows à partir de Moonlight. Dans ce cas, il peut être utile de faire croire à Sunshine que la touche Alt droite est la touche Windows", + "keyboard": "Activer l'entrée clavier", + "keyboard_desc": "Permet aux invités de contrôler le système hôte avec le clavier", + "lan_encryption_mode": "Mode de chiffrement LAN", + "lan_encryption_mode_1": "Activé pour les clients pris en charge", + "lan_encryption_mode_2": "Obligatoire pour tous les clients", + "lan_encryption_mode_desc": "Ceci détermine quand le chiffrement sera utilisé lors du streaming sur votre réseau local. Le chiffrement peut réduire les performances de streaming, en particulier sur les hôtes et clients moins puissants.", + "locale": "Langue", + "locale_desc": "La langue utilisée pour l'interface utilisateur de Sunshine.", + "log_level": "Niveau de journalisation", + "log_level_0": "Verbeux", + "log_level_1": "Débug", "log_level_2": "Info", - "log_level_3": "Warning", - "log_level_4": "Error", - "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", + "log_level_3": "Avertissements", + "log_level_4": "Erreurs", + "log_level_5": "Erreurs fatales", + "log_level_6": "Aucun", + "log_level_desc": "Le niveau minimum de journal imprimé à la sortie standard", + "log_path": "Chemin du fichier journal", + "log_path_desc": "Le fichier où sont stockés les logs actuels de Sunshine.", + "min_threads": "Nombre minimum de threads CPU", + "min_threads_desc": "Augmenter la valeur réduit légèrement l'efficacité de l'encodage, mais le compromis vaut généralement la peine de gagner l'utilisation de plus de cœurs CPU pour l'encodage. La valeur idéale est la valeur la plus basse qui peut de manière fiable encoder les paramètres de streaming désirés sur votre matériel.", + "misc": "Options diverses", + "motion_as_ds4": "Émuler une manette DS4 si la manette client signale qu'elle dispose de capteurs de mouvement", + "motion_as_ds4_desc": "Si désactivé, la présence de capteurs de mouvement ne sera pas pris en compte lors de la sélection du type de manette.", + "mouse": "Activer l'entrée de la souris", + "mouse_desc": "Permet aux invités de contrôler le système hôte avec le clavier", + "native_pen_touch": "Prise en charge stylo/écran tactile native", + "native_pen_touch_desc": "Lorsque cette option est activée, Sunshine transmet les événements stylo/touche natifs des clients Moonlight. Il peut être utile de désactiver cette fonction pour les applications plus anciennes qui ne prennent pas en charge le stylet et le tactile.", + "nvenc_h264_cavlc": "Préférer CAVLC sur CABAC en H.264", + "nvenc_h264_cavlc_desc": "Forme plus simple de codage entropique. CAVLC a besoin d'environ 10% de débit en plus pour la même qualité. Uniquement pour les périphériques de décodage vraiment anciens.", + "nvenc_latency_over_power": "Préférer une latence d'encodage plus faible aux économies d'énergie", + "nvenc_latency_over_power_desc": "Sunshine demande une vitesse maximale d'horloge GPU pendant le streaming pour réduire la latence d'encodage. La désactivation n'est pas recommandée car cela peut entraîner une augmentation significative de la latence d'encodage.", + "nvenc_opengl_vulkan_on_dxgi": "Présenter OpenGL/Vulkan sur DXGI", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine ne peut pas capturer les programmes plein écran OpenGL et Vulkan à un rythme plein d'images à moins qu'ils ne soient présents sur DXGI. Il s'agit d'un réglage de l'ensemble du système qui est rétabli à la sortie du programme de soleil.", + "nvenc_preset": "Préréglage des performances", + "nvenc_preset_1": "(plus rapide, par défaut)", + "nvenc_preset_7": "(plus lent)", + "nvenc_preset_desc": "Des nombres plus élevés améliorent la compression (qualité à un débit donné) au prix d'une latence d'encodage accrue. Il est recommandé de modifier uniquement lorsque limité par le réseau ou le décodage, sinon l'effet similaire peut être atteint en augmentant le débit.", + "nvenc_realtime_hags": "Utiliser la priorité en temps réel dans la planification matérielle du gpu accéléré", + "nvenc_realtime_hags_desc": "Actuellement, les pilotes NVIDIA peuvent geler dans l'encodeur lorsque HAGS est activé, la priorité en temps réel est utilisée et l'utilisation de VRAM est proche du maximum. Désactiver cette option réduit la priorité à la hauteur, en évitant le gel au prix de performances de capture réduites lorsque le GPU est lourdement chargé.", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", - "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", + "nvenc_spatial_aq_desc": "Assigner des valeurs QP plus élevées aux régions plates de la vidéo. Il est recommandé de l'activer lors du streaming à des débits moins élevés.", + "nvenc_spatial_aq_disabled": "Désactivé (plus rapide, par défaut)", + "nvenc_spatial_aq_enabled": "Activé (plus lent)", + "nvenc_twopass": "Mode bi-passe", + "nvenc_twopass_desc": "Ajoute le passage d'encodage préliminaire. Cela permet de détecter plus de vecteurs de mouvement, de mieux répartir le débit sur la trame et de respecter plus strictement les limites de débit. La désactivation n'est pas recommandée car cela peut entraîner des dépassements occasionnels de débit et des pertes de paquets subséquentes.", + "nvenc_twopass_disabled": "Désactivé (plus rapide, non recommandé)", + "nvenc_twopass_full_res": "Résolution complète (plus lente)", + "nvenc_twopass_quarter_res": "Résolution trimestrielle (plus rapide, par défaut)", + "nvenc_vbv_increase": "Augmentation du pourcentage de VBV/HRD à une seule image", + "nvenc_vbv_increase_desc": "Par défaut, le soleil utilise un VBV/HRD mono-image, ce qui signifie que toute taille d'image vidéo encodée ne devrait pas dépasser le débit demandé divisé par le débit d'images demandé. Relaxer cette restriction peut être bénéfique et agir en tant que débit variable de faible latence, mais peut aussi conduire à une perte de paquets si le réseau ne dispose pas de mémoire tampon pour gérer les pics de débit. La valeur maximale acceptée est de 400, ce qui correspond à la limite de taille supérieure de l'image vidéo encodée de 5x.", + "origin_web_ui_allowed": "Origines autorisées à accéder à l'interface web", + "origin_web_ui_allowed_desc": "L'origine de l'adresse de terminaison distante qui n'est pas refusée l'accès à l'interface Web", + "origin_web_ui_allowed_lan": "Seuls ceux qui sont en LAN peuvent accéder à l'interface Web", + "origin_web_ui_allowed_pc": "Seul localhost peut accéder à l'interface Web", + "origin_web_ui_allowed_wan": "N'importe qui peut accéder à l'interface Web", + "output_name_desc_linux": "Lors du démarrage de Sunshine, vous devriez voir la liste des moniteurs détectés. Vous devez utiliser la valeur avant le deux-points de la sortie. Par exemple:", + "output_name_desc_win": "Spécifier manuellement un affichage à utiliser pour la capture. Si non défini, l'affichage principal est capturé. Note: Si vous avez spécifié un GPU ci-dessus, cet affichage doit être connecté à ce GPU. Les valeurs appropriées peuvent être trouvées en utilisant la commande suivante :", + "output_name_linux": "Numéro de l'écran", + "output_name_win": "Nom de la sortie", + "ping_timeout": "Timeout du ping", + "ping_timeout_desc": "Combien de temps attendre en millisecondes pour des données de Moonlight avant de couper le stream", + "pkey": "Clé privée", + "pkey_desc": "La clé privée utilisée pour l'interface web et pour l'appairage des clients Moonlight. Pour une meilleure compatibilité, il devrait s'agir d'une clé privée RSA-2048.", "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", + "port_alert_1": "Sunshine ne peut pas utiliser les ports inférieurs à 1024 !", + "port_alert_2": "Les ports supérieurs à 65535 ne sont pas disponibles !", + "port_desc": "Définir la famille de ports utilisés par Sunshine", + "port_http_port_note": "Utilisez ce port pour vous connecter avec Moonlight.", + "port_note": "Note ", "port_port": "Port", - "port_protocol": "Protocol", + "port_protocol": "Protocole", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", - "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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)", + "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é.", + "qsv_coder": "Codeur QuickSync (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", - "qsv_preset_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", - "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", + "qsv_preset_fast": "plus rapide (qualité inférieure)", + "qsv_preset_faster": "le plus rapide (qualité la plus basse)", + "qsv_preset_medium": "medium (par défaut)", + "qsv_preset_slow": "lent (bonne qualité)", + "qsv_preset_slower": "plus lent (meilleure qualité)", + "qsv_preset_slowest": "plus lent (meilleure qualité)", + "qsv_preset_veryfast": "le plus rapide (qualité la plus basse)", + "qsv_slow_hevc": "Autoriser l'encodage Slow HEVC", + "qsv_slow_hevc_desc": "Cela peut permettre l'encodage HEVC sur les anciens GPU Intel, au prix d'une utilisation plus élevée du GPU et de performances moins élevées.", + "res_fps_desc": "Les modes d'affichage annoncés par Sunshine. Certaines versions de Lune, telles que Moonlight-nx (Switch), s'appuient sur ces listes pour s'assurer que les résolutions et fps demandées sont prises en charge. Ce paramètre ne change pas comment le flux d'écran est envoyé à Lune.", + "resolutions": "Résolutions annoncées", + "restart_note": "Sunshine redémarre pour appliquer les changements.", + "sunshine_name": "Nom de Sunshine", + "sunshine_name_desc": "Le nom affiché par Moonlight. S'il n'est pas spécifié, le nom d'hôte du PC est utilisé.", + "sw_preset": "Préréglages SW", + "sw_preset_desc": "Optimiser le compromis entre la vitesse d'encodage (images encodées par seconde) et l'efficacité de la compression (qualité par bit dans le flux bit). La valeur par défaut est superfast.", + "sw_preset_fast": "Rapide", + "sw_preset_faster": "plus rapide", + "sw_preset_medium": "Moyen", + "sw_preset_slow": "lent", + "sw_preset_slower": "plus lent", + "sw_preset_superfast": "superfast (par défaut)", "sw_preset_ultrafast": "ultrafast", "sw_preset_veryfast": "veryfast", "sw_preset_veryslow": "veryslow", - "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", + "sw_tune": "Réglage SW", + "sw_tune_animation": "animation -- bonne pour les dessins animés ; utilise un déblocage plus élevé et plus d'images de référence", + "sw_tune_desc": "Les options de réglage, qui sont appliquées après le préréglage. Par défaut, la valeur est zéro.", + "sw_tune_fastdecode": "fastdecode -- permet un décodage plus rapide en désactivant certains filtres", + "sw_tune_film": "film -- utilisé pour le contenu de film de haute qualité; baisse le déblocage", + "sw_tune_grain": "grain -- conserve la structure du grain dans le vieux matériel de film graineux", + "sw_tune_stillimage": "stillimage -- bon pour le contenu du diaporama", + "sw_tune_zerolatency": "zerolatency -- bon pour un encodage rapide et un streaming à faible latence (par défaut)", + "touchpad_as_ds4": "Émuler une manette DS4 si la manette client signale qu'elle dispose d'un pavé tactile", + "touchpad_as_ds4_desc": "Si désactivé, la présence du pavé tactile ne sera pas prise en compte lors de la sélection du type du pavé tactile.", "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", + "upnp_desc": "Configurer automatiquement la redirection de port pour le streaming sur Internet", + "virtual_sink": "Évier virtuel", + "virtual_sink_desc": "Spécifiez manuellement un périphérique audio virtuel à utiliser. Si non défini, le périphérique est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique de l'appareil !", "virtual_sink_placeholder": "Steam Streaming Speakers", "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", - "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "vt_realtime": "Encodage en temps réel de VideoToolbox", + "vt_software": "Encodage du logiciel VideoToolbox", + "vt_software_allowed": "Autorisé", + "vt_software_forced": "Forcé", + "wan_encryption_mode": "Mode de chiffrement WAN", + "wan_encryption_mode_1": "Activé pour les clients pris en charge (par défaut)", + "wan_encryption_mode_2": "Obligatoire pour tous les clients", + "wan_encryption_mode_desc": "Ceci détermine quand le chiffrement sera utilisé lors du streaming par Internet. Le chiffrement peut réduire les performances de streaming, en particulier sur les hôtes et clients moins puissants." }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", - "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hello, Sunshine!" + "description": "Sunshine est un serveur de streaming auto-hébergé pour Moonlight.", + "download": "Télécharger", + "loading_latest": "Chargement de la dernière version...", + "new_nightly": "Une nouvelle version nightly est disponible !", + "new_stable": "Une nouvelle version stable est disponible !", + "startup_errors": "Attention ! Sunshine a détecté ces erreurs lors du démarrage. Nous recommandons vivement de les corriger avant de commencer à streamer.", + "version_dirty": "Merci de contribuer à faire de Sunshine un meilleur logiciel !", + "version_latest": "Vous utilisez la dernière version de Sunshine", + "welcome": "Bonjour, Sunshine!" }, "navbar": { "applications": "Applications", "configuration": "Configuration", - "home": "Home", - "password": "Change Password", + "home": "Accueil", + "password": "Changer le mot de passe", "pin": "Pin", - "troubleshoot": "Troubleshooting" + "troubleshoot": "Dépannage" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "Confirmer le mot de passe", + "current_creds": "Identifiants actuels", + "new_creds": "Nouveaux identifiants", + "new_username_desc": "S'il n'est pas spécifié, le nom d'utilisateur ne changera pas", + "password_change": "Changement du mot de passe", + "success_msg": "Le mot de passe a été modifié avec succès ! Cette page sera bientôt rechargée, votre navigateur vous demandera les nouveaux identifiants." }, "pin": { - "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "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", + "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 !" }, "resource_card": { - "github_discussions": "GitHub Discussions", - "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "github_discussions": "Discussions GitHub", + "legal": "Légal", + "legal_desc": "En continuant à utiliser ce logiciel, vous acceptez les termes et conditions des documents suivants.", + "license": "Licence", + "lizardbyte_website": "Site web de LizardByte", + "resources": "Ressources", + "resources_desc": "Ressources pour Sunshine !", + "third_party_notice": "Avis aux tiers" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", - "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "force_close": "Fermer de force", + "force_close_desc": "Si Moonlight se plaint d'une application en cours d'exécution, forcer la fermeture de l'application devrait résoudre le problème.", + "force_close_error": "Erreur lors de la fermeture de l'application", + "force_close_success": "L'application à bien été fermée !", + "logs": "Journaux", + "logs_desc": "Voir les journaux envoyés par Sunshine", + "logs_find": "Rechercher...", + "restart_sunshine": "Redémarrer Sunshine", + "restart_sunshine_desc": "Si Sunshine ne fonctionne pas correctement, vous pouvez essayer de le redémarrer. Cela mettra fin à toutes les sessions en cours.", + "restart_sunshine_success": "Sunshine redémarre", + "troubleshooting": "Dépannage", + "unpair_all": "Dissocier tous les appareils", + "unpair_all_desc": "Supprimez tous vos appareils appariés", + "unpair_all_error": "Erreur lors de la dissociation", + "unpair_all_success": "Désappairage réussi !" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", - "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "confirm_password": "Confirmation du mot de passe", + "create_creds": "Avant de commencer, vous devez créer un nouveau nom d'utilisateur et un nouveau mot de passe pour accéder à l'interface Web.", + "create_creds_alert": "Les identifiants ci-dessous sont nécessaires pour accéder à l'interface Web de Sunshine. Gardez-les en sécurité, car vous ne les reverrez plus jamais !", + "greeting": "Bienvenue dans Sunshine !", + "login": "Connexion", + "welcome_success": "Cette page se rechargera bientôt, votre navigateur vous demandera les nouveaux identifiants" } } 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 8d1be14d2af..25ee1c6bc26 100644 --- a/src_assets/common/assets/web/public/assets/locale/it.json +++ b/src_assets/common/assets/web/public/assets/locale/it.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", + "apply": "Applica", + "auto": "Automatico", + "autodetect": "Rilevamento automatico (consigliato)", + "cancel": "Annulla", + "disabled": "Disattivato", + "disabled_def": "Disabilitato (predefinito)", + "do_cmd": "Esegui Comando", + "elevated": "Elevato", + "enabled": "Abilitato", + "enabled_def": "Abilitato (predefinito)", + "error": "Errore!", + "note": "Nota:", "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "run_as": "Esegui come amministratore", + "save": "Salva", + "see_more": "Vedi Altro", + "success": "Operazione riuscita!", + "undo_cmd": "Annulla Comando", + "username": "Nome utente", + "warning": "Attenzione!" }, "apps": { - "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", - "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", - "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", - "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", - "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", - "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", + "actions": "Azioni", + "add_cmds": "Aggiungi comandi", + "add_new": "Aggiungi nuovo", + "app_name": "Nome applicazione", + "app_name_desc": "Il Nome dell'applicazione, come mostrato su Moonlight", + "applications_desc": "Le applicazioni vengono aggiornate solo al riavvio del client", + "applications_title": "Applicazioni", + "auto_detach": "Continua lo streaming se l'applicazione esce subito", + "auto_detach_desc": "Cerca di individuare le applicazioni di tipo launcher che si chiudono subito dopo aver avviato un altro programma o una propria istanza. Quando viene rilevata un'app di tipo launcher, viene trattata come un'applicazione separata.", + "cmd": "Comando", + "cmd_desc": "L'applicazione principale da avviare. Se vuoto, non verrà avviata alcuna applicazione.", + "cmd_note": "Se il percorso del comando eseguibile contiene spazi, è necessario racchiuderlo tra virgolette.", + "cmd_prep_desc": "Un elenco di comandi da eseguire prima/dopo questa applicazione. Se uno dei comandi preliminari fallisce, l'avvio dell'applicazione viene interrotto.", + "cmd_prep_name": "Comandi Preliminari", + "covers_found": "Copertine trovate", + "delete": "Cancella", + "detached_cmds": "Comandi Separati", + "detached_cmds_add": "Aggiungi comando separato", + "detached_cmds_desc": "Un elenco di comandi da eseguire in background.", + "detached_cmds_note": "Se il percorso del comando eseguibile contiene spazi, è necessario racchiuderlo tra virgolette.", + "edit": "Modifica", + "env_app_id": "ID dell'applicazione", + "env_app_name": "Nome app", + "env_client_audio_config": "La configurazione audio richiesta dal client (2.0/5.1/7.1)", + "env_client_enable_sops": "Se il client ha richiesto l'opzione \"Ottimizza le impostazioni del gioco per lo streaming\" (TRUE o FALSE)", + "env_client_fps": "FPS richiesti dal client (int)", + "env_client_gcmap": "La maschera del gamepad richiesta, in formato bitset/bitfield (int)", + "env_client_hdr": "Se L'HDR è abilitato dal client (TRUE o FALSE)", + "env_client_height": "L'altezza richiesta dal client (int)", + "env_client_host_audio": "Se Il client ha richiesto l'audio dell'host (TRUE o FALSE)", + "env_client_width": "La larghezza richiesta dal client (int)", + "env_displayplacer_example": "Esempio - displayplacer per l'automazione della risoluzione:", + "env_qres_example": "Esempio - QRes per l'automazione della risoluzione:", + "env_qres_path": "percorso qres", + "env_var_name": "Nome Var", + "env_vars_about": "Informazioni sulle variabili d'ambiente", + "env_vars_desc": "Tutti i comandi ottengono queste variabili d'ambiente per impostazione predefinita:", + "env_xrandr_example": "Esempio - Xrandr per l'automazione della risoluzione:", + "exit_timeout": "Timeout Uscita", + "exit_timeout_desc": "Numero di secondi in cui attendere che tutti i processi delle app si ritirino con grazia quando richiesto di uscire. Se disattivato, il valore predefinito è di attendere fino a 5 secondi. Se impostato a zero o a un valore negativo, l'app verrà immediatamente terminata.", + "find_cover": "Trova Copertina", + "global_prep_desc": "Abilita/Disabilita l'esecuzione dei Comandi Prep Globali per questa applicazione.", + "global_prep_name": "Comandi Prep Globali", + "image": "Immagine", + "image_desc": "Icona dell'applicazione/immagine/percorso dell'immagine che verrà inviato al client. L'immagine deve essere un file PNG. Se non impostata, Sunshine invierà l'immagine predefinita del box.", + "loading": "Caricamento...", + "name": "Nome", + "output_desc": "Il file dove viene memorizzato l'output del comando, se non specificato, l'output viene ignorato", "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "run_as_desc": "Questo può essere necessario per alcune applicazioni che richiedono permessi di amministratore per funzionare correttamente.", + "wait_all": "Continua lo streaming fino all'uscita di tutti i processi app", + "wait_all_desc": "Questo continuerà lo streaming fino a quando tutti i processi avviati dall'app non saranno terminati. Quando non è selezionato, lo streaming si fermerà all'uscita del processo iniziale dell'app, anche se altri processi sono ancora in esecuzione.", + "working_dir": "Directory di Lavoro", + "working_dir_desc": "La directory di lavoro che dovrebbe essere passata al processo. Per esempio, alcune applicazioni usano la directory di lavoro per cercare i file di configurazione. Se non impostato, Sunshine predefinirà la directory padre del comando" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", + "adapter_name": "Nome Adattatore", + "adapter_name_desc_linux_1": "Specifica manualmente una GPU da usare per la cattura.", + "adapter_name_desc_linux_2": "per trovare tutti i dispositivi con capacità VAAPI", + "adapter_name_desc_linux_3": "Sostituisci ``renderD129`` con il dispositivo sopra per elencare il nome e le funzionalità del dispositivo. Per essere supportato da Sunshine, ha bisogno di avere minimo:", + "adapter_name_desc_win": "Specifica manualmente una GPU da usare per la cattura. Se disattivata, la GPU viene scelta automaticamente. Raccomandiamo vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica della GPU! Nota: questa GPU deve avere un display connesso e acceso. I valori appropriati possono essere trovati usando il seguente comando:", "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", + "add": "Aggiungi", + "address_family": "Famiglia Indirizzo", "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "address_family_desc": "Imposta la famiglia di indirizzi utilizzata da Sunshine", + "address_family_ipv4": "Solo IPv4", + "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_enforce_hrd": "Applicazione Decoder di Riferimento Ipotetico AMF (HRD)", + "amd_preanalysis": "Preanalisi AMF", + "amd_quality": "Qualità AMF", + "amd_quality_balanced": "bilanciato -- bilanciato (predefinito)", + "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_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_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)", + "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:", + "audio_sink_desc_macos": "Il nome del lavello audio utilizzato per Audio Loopback. Sunshine può accedere solo ai microfoni su macOS a causa delle limitazioni di sistema. Per trasmettere audio di sistema utilizzando Soundflower o BlackHole.", + "audio_sink_desc_win": "Specifica manualmente un dispositivo audio specifico da catturare. Se non impostato, il dispositivo viene scelto automaticamente. Si consiglia vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica del dispositivo! Se si dispone di più dispositivi audio con nomi identici, è possibile ottenere l'ID dispositivo utilizzando il seguente comando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", - "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", - "configuration": "Configuration", - "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", + "audio_sink_placeholder_win": "Altoparlanti (Dispositivo Audio ad Alta Definizione)", + "av1_mode": "Supporto AV1", + "av1_mode_0": "Sunshine fornirà il supporto per AV1 basandosi sulle funzionalità dell'encoder (raccomandato)", + "av1_mode_1": "Sunshine non fornirà il supporto per AV1", + "av1_mode_2": "Sunshine fornirà il supporto per il profilo principale AV1 a 8 bit", + "av1_mode_3": "Sunshine fornirà il supporto per i profili principali AV1 a 8 bit e 10 bit (HDR)", + "av1_mode_desc": "Consente al client di richiedere flussi video principali AV1 8-bit o 10-bit. AV1 è più intensivo da codificare per la CPU, quindi abilitandolo, si utilizza la codifica software, si possono ridurre le prestazioni.", + "back_button_timeout": "Timeout Emulazione Home/Tasto Guida", + "back_button_timeout_desc": "Se il pulsante Indietro/Select viene premuto per il numero specificato di millisecondi, viene emulato un pulsante Home/Tasto Guida. Se impostato a un valore < 0 (predefinito), tenendo premuto il pulsante Indietro/Select non verrà emulato il pulsante Home/Tasto Guida.", + "capture": "Forza un metodo di acquisizione specifico", + "capture_desc": "In modalità automatica Sunshine userà il primo che funziona. NvFBC richiede driver nvidia patchati.", + "cert": "Certificato", + "cert_desc": "Il certificato utilizzato per l'accoppiamento web UI e il client Moonlight. Per la migliore compatibilità, dovrebbe avere una chiave pubblica RSA-2048.", + "channels": "Massimi Client Connessi", + "channels_desc_1": "Sunshine può consentire che una singola sessione di streaming sia condivisa con più client contemporaneamente.", + "channels_desc_2": "Alcuni codificatori hardware possono avere limitazioni che riducono le prestazioni con più flussi.", + "coder_cabac": "cabac -- codifica aritmetica binaria adattiva contestuale - qualità superiore", + "coder_cavlc": "cavlc -- codifica contestuale adattativa a lunghezza variabile - decodifica più veloce", + "configuration": "Configurazione", + "controller": "Abilita l'input del Gamepad", + "controller_desc": "Permette ai guest di controllare il sistema host con un gamepad / controller", + "credentials_file": "File Credenziali", + "credentials_file_desc": "Memorizza il nome utente/password separatamente dal file di stato di Sunshine.", + "ds4_back_as_touchpad_click": "Mappa Indietro/Select come Clic Touchpad", + "ds4_back_as_touchpad_click_desc": "Quando si forza l'emulazione DS4, mappa Indietro/Select come Clic Touchpad", + "encoder": "Forza un codificatore specifico", + "encoder_desc": "Forza un encoder specifico, altrimenti Sunshine selezionerà l'opzione migliore disponibile. Nota: Se si specifica un codificatore hardware su Windows, deve corrispondere alla GPU a cui è collegato il display.", "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "external_ip": "Ip Esterno", + "external_ip_desc": "Se non viene fornito alcun indirizzo IP esterno, Sunshine lo rileverà automaticamente", + "fec_percentage": "Percentuale FEC", + "fec_percentage_desc": "Percentuale di pacchetti corretti per pacchetto dati in ogni fotogramma video. Valori più elevati possono correggere maggiori perdite di rete, ma al costo di un uso crescente della larghezza di banda.", + "ffmpeg_auto": "auto -- lascia che decida ffmpeg (predefinito)", + "file_apps": "File Applicazioni", + "file_apps_desc": "Il file in cui vengono memorizzate le attuali applicazioni di Sunshine.", + "file_state": "File Stato", + "file_state_desc": "Il file in cui viene memorizzato lo stato attuale di Sunshine", + "fps": "FPS Forniti", + "gamepad": "Tipo di Gamepad Emulato", + "gamepad_auto": "Opzioni di selezione automatica", + "gamepad_desc": "Scegli quale tipo di gamepad emulare sull'host", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "Opzioni manuali DS4", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", - "log_level_0": "Verbose", + "global_prep_cmd": "Comandi di preparazione", + "global_prep_cmd_desc": "Configura un elenco di comandi da eseguire prima o dopo aver eseguito qualsiasi applicazione. Se uno qualsiasi dei comandi di preparazione specificati fallisce, il processo di avvio dell'applicazione verrà interrotto.", + "hevc_mode": "Supporto HEVC", + "hevc_mode_0": "Sunshine fornirà il supporto per HEVC basandosi sulle funzionalità dell'encoder (raccomandato)", + "hevc_mode_1": "Sunshine non fornirà il supporto per HEVC", + "hevc_mode_2": "Sunshine fornirà il supporto per il profilo principale HEVC", + "hevc_mode_3": "Sunshine fornirà il supporto per i profili HEVC Main e Main10 (HDR)", + "hevc_mode_desc": "Consente al client di richiedere flussi video HEVC Main o HEVC Main10. HEVC è più intensivo per la CPU, quindi abilitarlo può ridurre le prestazioni quando si utilizza la codifica software.", + "high_resolution_scrolling": "Supporto Scorrimento Ad Alta Risoluzione", + "high_resolution_scrolling_desc": "Quando abilitato, Sunshine passerà attraverso gli eventi di scorrimento ad alta risoluzione dai client Moonlight. Può essere utile disabilitarlo per le vecchie applicazioni che scorrono troppo velocemente con eventi di scorrimento ad alta risoluzione.", + "install_steam_audio_drivers": "Installa I Driver Audio Di Steam", + "install_steam_audio_drivers_desc": "Se Steam è installato, installerà automaticamente il driver Steam Streaming Speakers per supportare il suono surround 5.1/7.1 e silenziare l'audio host.", + "key_repeat_delay": "Ritardo Ripetizione Chiave", + "key_repeat_delay_desc": "Controlla quanto velocemente i tasti si ripeteranno. È Il ritardo iniziale in millisecondi prima di ripetere i tasti.", + "key_repeat_frequency": "Frequenza Di Ripetizione Tasti", + "key_repeat_frequency_desc": "Quante volte i tasti si ripetono ogni secondo. Questa opzione configurabile supporta i decimali.", + "key_rightalt_to_key_win": "Mappare il tasto Alt Destro come Tasto Windows", + "key_rightalt_to_key_win_desc": "Potrebbe succedere che non sia possibile inviare il Tasto Windows direttamente da Moonlight. In questi casi può essere utile far credere a Sunshine che il tasto Alt Destro è il Tasto Windows", + "keyboard": "Abilita Inserimento da Tastiera", + "keyboard_desc": "Consente ai guest di controllare il sistema host con la tastiera", + "lan_encryption_mode": "Modalità Crittografia LAN", + "lan_encryption_mode_1": "Abilitato per i client supportati", + "lan_encryption_mode_2": "Richiesto per tutti i client", + "lan_encryption_mode_desc": "Questo determina quando la crittografia sarà utilizzata durante lo streaming sulla rete locale. La crittografia può ridurre le prestazioni di streaming, in particolare su host e client meno potenti.", + "locale": "Localizzazione", + "locale_desc": "La localizzazione utilizzata per l'interfaccia utente di Sunshine.", + "log_level": "Livello di Log", + "log_level_0": "Dettagliato", "log_level_1": "Debug", - "log_level_2": "Info", - "log_level_3": "Warning", - "log_level_4": "Error", - "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", - "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", - "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", - "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", - "port_port": "Port", + "log_level_2": "Informazioni", + "log_level_3": "Avviso", + "log_level_4": "Errore", + "log_level_5": "Critico", + "log_level_6": "Nessuno", + "log_level_desc": "Il livello minimo di log sullo standard output", + "log_path": "Percorso File Di Log", + "log_path_desc": "Il file in cui vengono memorizzati i log attuali di Sunshine.", + "min_threads": "Conteggio Minimo Thread Cpu", + "min_threads_desc": "Aumentare leggermente il valore riduce l'efficienza di codifica, ma di solito ne vale la pena per guadagnare l'impiego di più core della CPU per la codifica. Il valore ideale è il valore più basso che può codificare in modo affidabile le impostazioni di streaming desiderate sul vostro hardware.", + "misc": "Opzioni varie", + "motion_as_ds4": "Emula un gamepad DS4 se quello del client segnala che ci sono sensori di movimento", + "motion_as_ds4_desc": "Se disabilitato, i sensori di movimento non saranno presi in considerazione durante la selezione del tipo gamepad.", + "mouse": "Abilita l'Input del Mouse", + "mouse_desc": "Permette ai guest di controllare il sistema host con il mouse", + "native_pen_touch": "Supporto Nativo Della Penna/Tocco", + "native_pen_touch_desc": "Se abilitato, Sunshine passerà direttamente gli eventi nativi della penna/tocco dal client Moonlight. Può essere utile disabilitarlo per le applicazioni più vecchie senza supporto nativo della penna/touch.", + "nvenc_h264_cavlc": "Preferisci CAVLC a CABAC in H.264", + "nvenc_h264_cavlc_desc": "La forma più semplice di codifica dell'entropia. CAVLC ha bisogno di circa il 10% di bitrate in più per la stessa qualità. Rilevante solo per i dispositivi di decodifica molto vecchi.", + "nvenc_latency_over_power": "Preferisci la latenza di codifica più bassa rispetto al risparmio energetico", + "nvenc_latency_over_power_desc": "Sunshine richiede la massima velocità di clock GPU durante lo streaming per ridurre la latenza di codifica. La disabilitazione non è consigliata in quanto ciò può portare ad un aumento significativo della latenza di codifica.", + "nvenc_opengl_vulkan_on_dxgi": "Presentare OpenGL/Vulkan in cima a DXGI", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine non può catturare i programmi OpenGL e Vulkan a schermo intero al frame rate a meno che non presentino in cima a DXGI. Questa è impostazione a livello di sistema che viene ripristinata all'uscita del programma sunshine.", + "nvenc_preset": "Preimpostazione prestazioni", + "nvenc_preset_1": "(più veloce, predefinito)", + "nvenc_preset_7": "(più lento)", + "nvenc_preset_desc": "Numeri più alti intensificano la compressione (qualità a un dato bitrate) al costo di una maggiore latenza di codifica. È consigliata la modifica solo quando c'è un limite di rete o del decoder, altrimenti un effetto simile può essere raggiunto aumentando il bitrate.", + "nvenc_realtime_hags": "Usa la priorità in tempo reale nello scheduling hardware dell'accelerazione gpu", + "nvenc_realtime_hags_desc": "Attualmente i driver NVIDIA possono bloccarsi durante la codifica quando HAGS è abilitato, la priorità in tempo reale viene utilizzata e l'utilizzo VRAM è vicino al massimo. Disabilitare questa opzione riduce la priorità ad alta, eludendo il blocco al costo di una riduzione delle prestazioni di acquisizione quando la GPU è pesantemente caricata.", + "nvenc_spatial_aq": "AQ spaziale", + "nvenc_spatial_aq_desc": "Assegna valori QP più alti alle parti piatte del video. È consigliato abilitarlo per lo streaming a bitrate più bassi.", + "nvenc_spatial_aq_disabled": "Disabilitato (più veloce, predefinito)", + "nvenc_spatial_aq_enabled": "Abilitato (più lento)", + "nvenc_twopass": "Modalità a due passaggi", + "nvenc_twopass_desc": "Aggiunge un passaggio di codifica preliminare. Questo permette di rilevare più vettori di movimento, distribuire meglio il bitrate attraverso il frame e rispettare più rigorosamente i limiti di bitrate. Disabilitarlo non è raccomandato in quanto questo può portare a occasionali bitrate overshoot e successiva perdita del pacchetto.", + "nvenc_twopass_disabled": "Disabilitato (più veloce, non consigliato)", + "nvenc_twopass_full_res": "Risoluzione completa (lenta)", + "nvenc_twopass_quarter_res": "Risoluzione del trimestre (più veloce, predefinito)", + "nvenc_vbv_increase": "Incremento percentuale VBV/HRD singolo telaio", + "nvenc_vbv_increase_desc": "Per impostazione predefinita, il sole utilizza un singolo frame VBV/HRD, il che significa che qualsiasi dimensione del frame video codificato non dovrebbe superare il bitrate richiesto diviso per il frame rate richiesto. Rilassare questa restrizione può essere utile e agire come bitrate variabile a bassa latenza, ma può anche portare alla perdita di pacchetto se la rete non ha headroom buffer per gestire picchi di bitrate. Il valore massimo accettato è di 400, che corrisponde a 5x il limite di dimensione superiore del fotogramma video codificato.", + "origin_web_ui_allowed": "Origine Web UI Consentita", + "origin_web_ui_allowed_desc": "L'origine dell'indirizzo di endpoint remoto a cui non viene negato l'accesso all'interfaccia utente Web", + "origin_web_ui_allowed_lan": "Solo quelli in LAN possono accedere all'interfaccia utente Web", + "origin_web_ui_allowed_pc": "Solo localhost può accedere all'interfaccia Web", + "origin_web_ui_allowed_wan": "Chiunque può accedere all'interfaccia Web", + "output_name_desc_linux": "Durante l'avvio di Sunshine, dovresti vedere l'elenco dei monitor rilevati. Devi usare il valore prima del punto nell'uscita. Ad esempio:", + "output_name_desc_win": "Specifica manualmente un display da usare per la cattura. Se disattivato, viene catturato il display primario. Nota: Se hai specificato una GPU sopra, questo display deve essere collegato a quella GPU. I valori appropriati possono essere trovati usando il seguente comando:", + "output_name_linux": "Numero di monitor", + "output_name_win": "Nome Uscita", + "ping_timeout": "Timeout Ping", + "ping_timeout_desc": "Per quanto tempo attendere in millisecondi per i dati dalla luce della luna prima di spegnere il flusso", + "pkey": "Chiave Privata", + "pkey_desc": "La chiave privata utilizzata per l'accoppiamento web UI e client Moonlight. Per la migliore compatibilità, questa dovrebbe essere una chiave privata RSA-2048.", + "port": "Porta", + "port_alert_1": "Sunshine non può utilizzare porte sotto 1024!", + "port_alert_2": "I porti sopra 65535 non sono disponibili!", + "port_desc": "Imposta la famiglia di porti utilizzati da Sunshine", + "port_http_port_note": "Usa questa porta per connetterti con Moonlight.", + "port_note": "Nota", + "port_port": "Porta", "port_protocol": "Protocol", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", + "port_warning": "Esporre l'interfaccia Web su Internet è un rischio per la sicurezza! Procedi a tuo rischio!", "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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)", + "qp": "Parametro Di Quantizzazione", + "qp_desc": "Alcuni dispositivi potrebbero non supportare Constant Bit Rate. Per questi dispositivi, viene invece utilizzato QP. Valore più alto significa più compressione, ma meno qualità.", + "qsv_coder": "Coder QuickSync (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", - "qsv_preset_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", - "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", + "qsv_preset_fast": "più veloce (qualità inferiore)", + "qsv_preset_faster": "più veloce (qualità minima)", + "qsv_preset_medium": "medio (predefinito)", + "qsv_preset_slow": "lento (buona qualità)", + "qsv_preset_slower": "più lento (migliore qualità)", + "qsv_preset_slowest": "più lento (migliore qualità)", + "qsv_preset_veryfast": "più veloce (qualità minima)", + "qsv_slow_hevc": "Permetti La Lenta Codifica HEVC", + "qsv_slow_hevc_desc": "Questo può abilitare la codifica HEVC su vecchie GPU Intel, al costo di un maggiore utilizzo della GPU e prestazioni peggiori.", + "res_fps_desc": "Le modalità di visualizzazione pubblicizzate da Sunshine. Alcune versioni di Moonlight, come Moonlight-nx (Switch), si basano su queste liste per garantire che le risoluzioni e fps richieste siano supportate. Questa impostazione non cambia il modo in cui lo schermo viene inviato al Moonlight.", + "resolutions": "Risoluzioni Pubblicizzate", + "restart_note": "Sunshine sta riavviando per applicare le modifiche.", + "sunshine_name": "Nome Sunshine", + "sunshine_name_desc": "Il nome visualizzato da Moonlight. Se non specificato, viene utilizzato il nome host del PC", + "sw_preset": "Preset SO", + "sw_preset_desc": "Ottimizza il trade-off tra velocità di codifica (fotogrammi codificati al secondo) e efficienza di compressione (qualità per bit nel bitstream). Predefiniti a superfast.", + "sw_preset_fast": "veloce", + "sw_preset_faster": "più veloce", + "sw_preset_medium": "medio", + "sw_preset_slow": "lento", + "sw_preset_slower": "più lento", + "sw_preset_superfast": "superfast (predefinito)", "sw_preset_ultrafast": "ultrafast", "sw_preset_veryfast": "veryfast", "sw_preset_veryslow": "veryslow", "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", + "sw_tune_animation": "animazione -- buona per i cartoni animati; utilizza un maggiore sblocco e più quadri di riferimento", + "sw_tune_desc": "Opzioni di sintonizzazione, che vengono applicate dopo la preimpostazione. Predefinite a zerolatency.", + "sw_tune_fastdecode": "fastdecode -- permette una decodifica più veloce disabilitando alcuni filtri", + "sw_tune_film": "film -- uso per contenuti cinematografici di alta qualità; riduce lo sblocco", + "sw_tune_grain": "grano -- conserva la struttura del grano nel vecchio materiale di film granuloso", + "sw_tune_stillimage": "stillimage -- buono per contenuti simili alle presentazioni", + "sw_tune_zerolatency": "zerolatency -- buono per la codifica veloce e lo streaming a bassa latenza (predefinito)", + "touchpad_as_ds4": "Emula un gamepad DS4 se il gamepad client segnala un touchpad è presente", + "touchpad_as_ds4_desc": "Se disabilitata, la presenza del touchpad non sarà presa in considerazione durante la selezione del tipo del gamepad.", "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", - "virtual_sink_placeholder": "Steam Streaming Speakers", + "upnp_desc": "Configura automaticamente l'inoltro delle porte per lo streaming su Internet", + "virtual_sink": "Lavello Virtuale", + "virtual_sink_desc": "Specifica manualmente un dispositivo audio virtuale da usare. Se disattivato, il dispositivo viene scelto automaticamente. Si consiglia vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica del dispositivo!", + "virtual_sink_placeholder": "Altoparlanti Streaming Di Steam", "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", - "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "vt_realtime": "Codifica VideoToolbox In Tempo Reale", + "vt_software": "Codifica Software VideoToolbox", + "vt_software_allowed": "Consentito", + "vt_software_forced": "Forzato", + "wan_encryption_mode": "Modalità Crittografia WAN", + "wan_encryption_mode_1": "Abilitato per i client supportati (predefinito)", + "wan_encryption_mode_2": "Richiesto per tutti i client", + "wan_encryption_mode_desc": "Questo determina quando la crittografia sarà utilizzata durante lo streaming su Internet. La crittografia può ridurre le prestazioni di streaming, in particolare su host e client meno potenti." }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", + "description": "Sunshine è un host di flussi di giochi auto-ospitato per Moonlight.", "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hello, Sunshine!" + "loading_latest": "Caricamento dell'ultima versione...", + "new_nightly": "È disponibile una nuova versione notturna!", + "new_stable": "Una nuova versione Stabile è disponibile!", + "startup_errors": "Attenzione! Sunshine ha rilevato questi errori durante l'avvio. Si raccomanda vivamente di risolverli prima dello streaming.", + "version_dirty": "Grazie per aver contribuito a rendere Sunshine un software migliore!", + "version_latest": "Stai eseguendo l'ultima versione di Sunshine", + "welcome": "Ciao, Sunshine!" }, "navbar": { - "applications": "Applications", - "configuration": "Configuration", + "applications": "Applicazioni", + "configuration": "Configurazione", "home": "Home", - "password": "Change Password", + "password": "Modifica Password", "pin": "Pin", - "troubleshoot": "Troubleshooting" + "troubleshoot": "Risoluzione Dei Problemi" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "Conferma Password", + "current_creds": "Credenziali Attuali", + "new_creds": "Nuove credenziali", + "new_username_desc": "Se non specificato, il nome utente non cambierà", + "password_change": "Cambio Password", + "success_msg": "La password è stata modificata con successo! Questa pagina verrà ricaricata presto, il tuo browser ti chiederà le nuove credenziali." }, "pin": { + "pair_failure": "Accoppiamento non riuscito: verificare se il PIN è digitato correttamente", + "pair_success": "Successo! Controlla la luce della luna per continuare", "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "send": "Invia", + "warning_msg": "Assicurati di avere accesso al client con cui stai accoppiando. Questo software può dare il controllo totale al tuo computer, quindi fai attenzione!" }, "resource_card": { - "github_discussions": "GitHub Discussions", - "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "github_discussions": "Discussioni di GitHub", + "legal": "Info legali", + "legal_desc": "Continuando a utilizzare questo software si accettano i termini e le condizioni riportati nei seguenti documenti.", + "license": "Licenza", + "lizardbyte_website": "Sito web di LizardByte", + "resources": "Risorse", + "resources_desc": "Risorse per Sunshine!", + "third_party_notice": "Avvisi di terze parti" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", - "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "force_close": "Chiusura forzata", + "force_close_desc": "Se Moonlight si lamenta di un'app attualmente in esecuzione, la chiusura forzata dell'app dovrebbe risolvere il problema.", + "force_close_error": "Errore durante la chiusura dell'applicazione", + "force_close_success": "Applicazione chiusa con successo!", + "logs": "Log", + "logs_desc": "Vedi i log caricati da Sunshine", + "logs_find": "Trova...", + "restart_sunshine": "Riavvia Sunshine", + "restart_sunshine_desc": "Se Sunshine non funziona correttamente, puoi provare a riavviarlo. Questo terminerà qualsiasi sessione in esecuzione.", + "restart_sunshine_success": "Sunshine sta riavviando", + "troubleshooting": "Risoluzione Dei Problemi", + "unpair_all": "Disaccoppia Tutto", + "unpair_all_desc": "Rimuovi tutti i tuoi dispositivi accoppiati", + "unpair_all_error": "Errore durante la disconnessione", + "unpair_all_success": "Disaccoppiamento Riuscito!" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", + "confirm_password": "Conferma password", + "create_creds": "Prima di iniziare, è necessario creare un nuovo nome utente e una nuova password per accedere all'interfaccia web.", + "create_creds_alert": "Le credenziali in basso sono necesarie per accadere alla Web UI di Sunshine. Mantienile al sicuro, poichè non potrai più visualizzarle!", + "greeting": "Benvenuto in Sunshine!", "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "welcome_success": "Questa pagina verrà ricaricata, il tuo browser ti richiederà le nuove credenziali" } } diff --git a/src_assets/common/assets/web/public/assets/locale/ja.json b/src_assets/common/assets/web/public/assets/locale/ja.json new file mode 100644 index 00000000000..8777b770c27 --- /dev/null +++ b/src_assets/common/assets/web/public/assets/locale/ja.json @@ -0,0 +1,380 @@ +{ + "_common": { + "apply": "適用", + "auto": "自動", + "autodetect": "自動検出 (推奨)", + "cancel": "キャンセル", + "disabled": "無効", + "disabled_def": "無効 (デフォルト)", + "do_cmd": "Do Command", + "elevated": "上昇", + "enabled": "有効", + "enabled_def": "有効 (既定)", + "error": "エラー!", + "note": "メモ:", + "password": "パスワード", + "run_as": "管理者として実行", + "save": "保存", + "see_more": "もっと見る", + "success": "成功!", + "undo_cmd": "元に戻す", + "username": "ユーザー名", + "warning": "警告!" + }, + "apps": { + "actions": "アクション", + "add_cmds": "コマンドを追加", + "add_new": "新規追加", + "app_name": "アプリケーション名", + "app_name_desc": "アプリケーション名(Moonlight に示すように)", + "applications_desc": "アプリケーションはクライアントの再起動時にのみ更新されます", + "applications_title": "アプリケーション", + "auto_detach": "アプリケーションがすぐに終了すると、ストリーミングを続行します", + "auto_detach_desc": "これにより、別のプログラムまたはインスタンスを起動した後にすぐに閉じられるランチャー型アプリを自動的に検出しようとします。 ランチャータイプのアプリが検出されると、切り離したアプリとして扱われます。", + "cmd": "(Command)", + "cmd_desc": "メインアプリケーションを起動します。空白の場合はアプリケーションは起動しません。", + "cmd_note": "コマンド実行ファイルへのパスにスペースが含まれている場合は、引用符で囲む必要があります。", + "cmd_prep_desc": "このアプリケーションの前後に実行するコマンドのリストです。prep-commandsのいずれかに失敗した場合、アプリケーションの起動は中止されます。", + "cmd_prep_name": "コマンドの準備", + "covers_found": "カバーが見つかりました", + "delete": "削除", + "detached_cmds": "切り離されたコマンド", + "detached_cmds_add": "別のコマンドを追加", + "detached_cmds_desc": "バックグラウンドで実行するコマンドのリスト。", + "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_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_width": "クライアントから要求された幅 (int)", + "env_displayplacer_example": "例 - 解像度自動化の表示プレースホルダ:", + "env_qres_example": "例 - 自動解像度のQR:", + "env_qres_path": "qres path", + "env_var_name": "変数名", + "env_vars_about": "環境変数について", + "env_vars_desc": "すべてのコマンドはデフォルトでこれらの環境変数を取得します:", + "env_xrandr_example": "例 - 解像度自動化のための Xrandr:", + "exit_timeout": "タイムアウト終了", + "exit_timeout_desc": "終了要求時にすべてのアプリプロセスが正常に終了するまで待機する秒数。 設定されていない場合、デフォルトは5秒まで待機します。ゼロまたは負の値に設定されている場合、アプリは直ちに終了します。", + "find_cover": "カバーを見つける", + "global_prep_desc": "このアプリケーションの Global Prep コマンドの実行を有効または無効にします。", + "global_prep_name": "グローバル準備コマンド", + "image": "画像", + "image_desc": "クライアントに送信されるアプリケーションアイコン/画像/画像パス。画像はPNGファイルである必要があります。設定されていない場合、Sunshineはデフォルトのボックス画像を送信します。", + "loading": "読み込み中...", + "name": "名前", + "output_desc": "コマンドの出力が保存されているファイルが指定されていない場合、出力は無視されます。", + "output_name": "出力", + "run_as_desc": "これは、管理者権限を必要とするアプリケーションが正常に動作するために必要な場合があります。", + "wait_all": "すべてのアプリプロセスが終了するまでストリーミングを続ける", + "wait_all_desc": "これは、アプリによって開始されたすべてのプロセスが終了するまで、ストリーミングを続けます。 チェックを外すと、他のアプリプロセスがまだ実行中であっても、最初のアプリプロセスが終了するとストリーミングは停止します。", + "working_dir": "作業ディレクトリ", + "working_dir_desc": "プロセスに渡される作業ディレクトリ。たとえば、アプリケーションによっては、作業ディレクトリを使用して設定ファイルを検索します。 設定されていない場合、Sunshineはデフォルトでコマンドの親ディレクトリになります" + }, + "config": { + "adapter_name": "アダプター名", + "adapter_name_desc_linux_1": "キャプチャに使用する GPU を手動で指定します。", + "adapter_name_desc_linux_2": "VAAPIが可能なすべてのデバイスを検索する", + "adapter_name_desc_linux_3": "``renderD129`` を上記のデバイスに置き換えて、デバイスの名前と機能を一覧表示します。 Sunshineでサポートされるには、最小限にする必要があります。", + "adapter_name_desc_win": "キャプチャに使用する GPU を手動で指定します。未設定の場合は、GPU が自動的に選択されます。 自動GPU選択を使用するには、このフィールドを空白のままにすることを強くお勧めします! 注:このGPUはディスプレイを接続して電源を入れている必要があります。 次のコマンドを使用して、適切な値を見つけることができます。", + "adapter_name_placeholder_win": "Radeon RX 580シリーズ", + "add": "追加", + "address_family": "アドレスファミリー", + "address_family_both": "IPv4+IPv6", + "address_family_desc": "Sunshineが使用するアドレスファミリーを設定する", + "address_family_ipv4": "IPv4 のみ", + "always_send_scancodes": "常にスキャンコードを送信する", + "always_send_scancodes_desc": "スキャンコードを送信すると、ゲームやアプリとの互換性が向上しますが、米国英語のキーボードレイアウトを使用していない特定のクライアントからのキーボード入力が誤っている可能性があります。 特定のアプリケーションでキーボード入力がまったく動作しない場合に有効にします。 クライアントのキーがホストに間違った入力を生成している場合は無効にします。", + "amd_coder": "AMFコーダー(H264)", + "amd_enforce_hrd": "AMF仮説リファレンスデコーダ(HRD) Enforcement", + "amd_preanalysis": "AMFプレ分析", + "amd_quality": "AMF品質", + "amd_quality_balanced": "balance-- balance(デフォルト)", + "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_vbr_peak": "vbr_peak -- ピーク制約可変ビットレート", + "amd_usage": "AMF使用率", + "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を再起動し、変更を適用します。これは実行中のセッションを終了します。", + "audio_sink": "音声シンク", + "audio_sink_desc_linux": "オーディオループバックに使用されるオーディオシンクの名前。この変数を指定しない場合、pulseaudio はデフォルトのモニターデバイスを選択します。 いずれかのコマンドを使用して、オーディオシンクの名前を見つけることができます。", + "audio_sink_desc_macos": "Audio Loopback に使用されるオーディオシンクの名前。Sunshineはシステムの制限により、macOSのマイクにのみアクセスできます。 Soundflower または BlackHole を使用してシステムのオーディオをストリーミングする。", + "audio_sink_desc_win": "キャプチャする特定のオーディオデバイスを手動で指定します。未設定の場合、デバイスは自動的に選択されます。 自動デバイス選択を使用するには、このフィールドを空白のままにすることを強くお勧めします! 同じ名前の複数のオーディオデバイスをお持ちの場合は、次のコマンドを使用してデバイス ID を取得できます。", + "audio_sink_placeholder_macos": "BlackHole 2ch", + "audio_sink_placeholder_win": "スピーカー (高品位オーディオデバイス)", + "av1_mode": "AV1 サポート", + "av1_mode_0": "サンシャインはエンコーダ機能に基づいてAV1のサポートを宣伝します(推奨)", + "av1_mode_1": "サンシャインはAV1のサポートを宣伝しません", + "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ボタンはエミュレートされません。", + "capture": "特定のキャプチャ方法を強制する", + "capture_desc": "自動モードでSunshineは動作する最初のものを使用します. NvFBCはパッチを当てる必要があります nvidiaドライバ.", + "cert": "証明書", + "cert_desc": "Web UIとMoonlightクライアントのペアリングに使用される証明書。互換性を確保するためには、RSA-2048 公開鍵が必要です。", + "channels": "接続済みクライアントの最大数", + "channels_desc_1": "Sunshineは、単一のストリーミングセッションを複数のクライアントと同時に共有することができます。", + "channels_desc_2": "一部のハードウェアエンコーダには、複数のストリームでパフォーマンスを低下させる制限がある場合があります。", + "coder_cabac": "cabac -- コンテキスト適応二進数演算符号化 - 高品質", + "coder_cavlc": "cavlc -- コンテキスト適応型可変長符号化 - 高速デコード", + "configuration": "設定", + "controller": "Enable Gamepad Input", + "controller_desc": "ゲストがゲームパッド/コントローラーでホストシステムを制御できるようにします", + "credentials_file": "資格情報ファイル", + "credentials_file_desc": "Sunshineの状態ファイルとは別に、ユーザー名/パスワードを保存します。", + "ds4_back_as_touchpad_click": "戻る/選択をタッチパッドにマップする", + "ds4_back_as_touchpad_click_desc": "DS4エミュレーションを強制するときは、戻る/選択をタッチパッドにマップする", + "encoder": "特定のエンコーダーを強制する", + "encoder_desc": "特定のエンコーダを強制します。そうでなければ、Sunshineは最良の選択肢を選択します。 注:Windowsでハードウェアエンコーダを指定する場合は、ディスプレイが接続されているGPUと一致する必要があります。", + "encoder_software": "ソフトウェア", + "external_ip": "外部 IP", + "external_ip_desc": "外部IPアドレスが指定されていない場合、Sunshineは自動的に外部IPを検出します。", + "fec_percentage": "FECの割合", + "fec_percentage_desc": "各ビデオフレーム内のデータ パケットあたりのパケットを修正するエラー率。 より高い値は、ネットワークパケットの損失を増やすことができますが、帯域幅の使用量を増加させることができます。", + "ffmpeg_auto": "auto -- ffmpegで決める (デフォルト)", + "file_apps": "アプリファイル", + "file_apps_desc": "Sunshineの現在のアプリが保存されているファイル。", + "file_state": "状態ファイル", + "file_state_desc": "サンシャインの現在の状態が保存されているファイル", + "fps": "広告のFPS", + "gamepad": "エミュレートしたゲームパッドのタイプ", + "gamepad_auto": "自動選択オプション", + "gamepad_desc": "ホスト上でエミュレートするゲームパッドの種類を選択します", + "gamepad_ds4": "DS4 (PS4)", + "gamepad_manual": "DS4マニュアルオプション", + "gamepad_x360": "X360 (Xbox 360)", + "global_prep_cmd": "コマンドの準備", + "global_prep_cmd_desc": "アプリケーションの実行前または実行後に実行されるコマンドのリストを構成します。 指定された preparation コマンドのいずれかに失敗すると、アプリケーションの起動プロセスは中断されます。", + "hevc_mode": "HEVC サポート", + "hevc_mode_0": "サンシャインはエンコーダ機能に基づいてHEVCのサポートを宣伝します(推奨)", + "hevc_mode_1": "サンシャインはHEVCのサポートを宣伝しません", + "hevc_mode_2": "サンシャインはHEVCメインプロファイルのサポートを宣伝します", + "hevc_mode_3": "サンシャインはHEVC MainおよびMain10(HDR)プロファイルのサポートを宣伝します", + "hevc_mode_desc": "HEVC MainまたはHEVC Main10ビデオストリームのリクエストをクライアントに許可します。 HEVCはエンコードにCPU負荷がかかるため、ソフトウェアエンコーディングを使用する際のパフォーマンスが低下する可能性があります。", + "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 サラウンドサウンドとホストオーディオのミュートがサポートされます。", + "key_repeat_delay": "Key Repeat Delay", + "key_repeat_delay_desc": "キーを繰り返す速度を制御します。キーを繰り返すまでの時間をミリ秒単位で設定します。", + "key_repeat_frequency": "キーの繰り返し周波数", + "key_repeat_frequency_desc": "キーが毎秒繰り返される頻度。この設定可能なオプションは10進数をサポートします。", + "key_rightalt_to_key_win": "右AltキーをWindowsキーにマップする", + "key_rightalt_to_key_win_desc": "Moonlight から Windows キーを直接送信できない可能性があります。 これらの場合、SunshineにRight AltキーがWindowsキーであると考えさせると便利かもしれません。", + "keyboard": "キーボード入力を有効にする", + "keyboard_desc": "ゲストがキーボードでホストシステムを制御できるようにします", + "lan_encryption_mode": "LAN 暗号化モード", + "lan_encryption_mode_1": "サポートされているクライアントで有効", + "lan_encryption_mode_2": "すべてのクライアントに必要です", + "lan_encryption_mode_desc": "これは、ローカルネットワーク経由でストリーミングする際に暗号化がいつ使用されるかを決定します。暗号化は、特に強力なホストやクライアントでは、ストリーミングのパフォーマンスを低下させることができます。", + "locale": "ロケール", + "locale_desc": "Sunshineのユーザーインターフェースに使用されるロケール。", + "log_level": "ログレベル", + "log_level_0": "Verbose", + "log_level_1": "Debug", + "log_level_2": "情報", + "log_level_3": "警告", + "log_level_4": "エラー", + "log_level_5": "Fatal", + "log_level_6": "なし", + "log_level_desc": "標準出力に印刷された最小ログレベル", + "log_path": "ログファイルのパス", + "log_path_desc": "Sunshineの現在のログが保存されているファイル。", + "min_threads": "最小CPUスレッド数", + "min_threads_desc": "値を大きくするとエンコーディングの効率はわずかに低下しますが、通常はエンコーディングにCPUコアをより多く使用する価値があります。 理想的な値は、ハードウェア上の希望のストリーミング設定で確実にエンコードできる最小値です。", + "misc": "その他のオプション", + "motion_as_ds4": "クライアントのゲームパッドがモーションセンサーが存在することを報告する場合、DS4ゲームパッドをエミュレートします", + "motion_as_ds4_desc": "無効にすると、モーションセンサーはゲームパッドの種類選択中に考慮されません。", + "mouse": "マウス入力を有効にする", + "mouse_desc": "ゲストがマウスでホストシステムを制御できるようにします", + "native_pen_touch": "Native Pen/Touch サポート", + "native_pen_touch_desc": "有効にすると、SunshineはMoonlightクライアントからネイティブのペン/タッチイベントを通過します。これはネイティブのペン/タッチサポートがない古いアプリケーションでは無効にするのに便利です。", + "nvenc_h264_cavlc": "H.264よりCAVLCを優先する", + "nvenc_h264_cavlc_desc": "単純なエントロピーコーディング形式。CAVLCは同じ品質のために約10%のビットレートを必要とします。本当に古いデコードデバイスにのみ関係します。", + "nvenc_latency_over_power": "省電力よりもエンコーディングのレイテンシを低減したい場合", + "nvenc_latency_over_power_desc": "Sunshine は、エンコーディングのレイテンシを低減するためにストリーミング中に最大GPU クロック速度を要求します。 これを無効にするとエンコード待ち時間が大幅に増加する可能性があるため、推奨されません。", + "nvenc_opengl_vulkan_on_dxgi": "DXGI上に現在のOpenGL/Vulkan", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshineは、DXGIの上に存在しない限り、フルフレームレートでフルスクリーンOpenGLとVulkanプログラムをキャプチャすることはできません。 これはシステム全体の設定であり、サンシャインプログラムの出口に戻ります。", + "nvenc_preset": "パフォーマンスプリセット", + "nvenc_preset_1": "(高速、デフォルト)", + "nvenc_preset_7": "(最も遅い)", + "nvenc_preset_desc": "数値が高いほど、符号化遅延の増加を犠牲にして圧縮(一定のビットレートでの品質)が向上します。 ネットワークまたはデコーダによって制限されている場合にのみ変更することをお勧めします, そうでなければ、ビットレートを増やすことによって、同様の効果を達成することができます.", + "nvenc_realtime_hags": "ハードウェアアクセラレーションGPUスケジューリングでリアルタイム優先度を使用する", + "nvenc_realtime_hags_desc": "現在、NVIDIAドライバは、HAGSが有効になっている場合、エンコーダでフリーズすることがあり、リアルタイムの優先度が使用され、VRAMの使用率が最大に近い場合があります。 このオプションを無効にすると、GPUが大量にロードされた際のキャプチャパフォーマンスが低下するため、フリーズの優先度が高くなります。", + "nvenc_spatial_aq": "Spatial AQ", + "nvenc_spatial_aq_desc": "より高いQP値をビデオのフラットリージョンに割り当てます。低ビットレートでストリーミングする際に有効にすることをお勧めします。", + "nvenc_spatial_aq_disabled": "無効 (高速、デフォルト)", + "nvenc_spatial_aq_enabled": "有効 (低速)", + "nvenc_twopass": "Two-passモード", + "nvenc_twopass_desc": "予備的なエンコードパスを追加します。これは、より多くのモーションベクトルを検出することができます。より良いフレーム全体でビットレートを分配し、より厳密にビットレート制限に従います。 これは時折ビットレートオーバーシュートやその後のパケット損失につながる可能性があるため、無効にすることは推奨されません。", + "nvenc_twopass_disabled": "無効 (高速、推奨されません)", + "nvenc_twopass_full_res": "フル解像度(低速)", + "nvenc_twopass_quarter_res": "クォーター解像度(速く、デフォルト)", + "nvenc_vbv_increase": "シングルフレーム VBV/HRD パーセンテージ増加", + "nvenc_vbv_increase_desc": "デフォルトでは、単一フレームVBV/HRDを使用しています。つまり、エンコードされたビデオフレームサイズは要求されたビットレートを要求されたフレームレートで割った値を超えないことが予想されます。 この制限を緩和することは有益であり、低レイテンシの可変ビットレートとして機能することができます。 ネットワークにビットレートのスパイクを処理するバッファヘッドルームがない場合、パケットロスを引き起こす可能性があります。 許容可能な最大値は400で、エンコードされたビデオフレームの上限サイズ制限の5倍に相当します。", + "origin_web_ui_allowed": "許可されたオリジンウェブUI", + "origin_web_ui_allowed_desc": "Web UIへのアクセスが拒否されていないリモートエンドポイントアドレスのオリジンです", + "origin_web_ui_allowed_lan": "LAN 内のユーザだけが Web UI にアクセスできます", + "origin_web_ui_allowed_pc": "ローカルホストのみがWebUIにアクセスできます", + "origin_web_ui_allowed_wan": "誰でもWeb UIにアクセスできます", + "output_name_desc_linux": "Sunshineの起動時には、検出されたモニタのリストが表示されます。出力のコロンの前に値を使用する必要があります。例えば:", + "output_name_desc_win": "キャプチャに使用するディスプレイを手動で指定します。未設定の場合、プライマリディスプレイをキャプチャします。 注意: 上記の GPU を指定した場合、この表示は GPU に接続する必要があります。次のコマンドを使用して適切な値を見つけることができます。", + "output_name_linux": "モニター番号", + "output_name_win": "出力名", + "ping_timeout": "Pingのタイムアウト", + "ping_timeout_desc": "月明かりからのデータがストリームをシャットダウンするまでのミリ秒単位で待機する期間", + "pkey": "プライベートキー", + "pkey_desc": "ウェブ UI とMoonlight クライアントのペアリングに使用される秘密鍵。互換性を確保するためには、RSA-2048 秘密鍵を使用する必要があります。", + "port": "ポート", + "port_alert_1": "1024以下のポートを使用することはできません!", + "port_alert_2": "65535以上のポートは利用できません!", + "port_desc": "Sunshineが使用するポートのファミリーを設定する", + "port_http_port_note": "Moonlight に接続するには、このポートを使用してください。", + "port_note": "メモ", + "port_port": "ポート", + "port_protocol": "Protocol", + "port_tcp": "TCP", + "port_udp": "UDP", + "port_warning": "Web UIをインターネットに公開することはセキュリティ上のリスクです! ご自身の責任で進めてください!", + "port_web_ui": "Web UI", + "qp": "量子化パラメータ", + "qp_desc": "デバイスによっては、Constant Bit Rateをサポートしていない可能性があります。これらのデバイスでは、QPが代わりに使用されます。値が高いほど圧縮が多くなりますが、品質が低下します。", + "qsv_coder": "QuickSync Coder (H264)", + "qsv_preset": "QuickSync Preset", + "qsv_preset_fast": "より速く (低品質)", + "qsv_preset_faster": "最速(低品質)", + "qsv_preset_medium": "ミディアム(デフォルト)", + "qsv_preset_slow": "遅い (良質)", + "qsv_preset_slower": "遅い (より良い品質)", + "qsv_preset_slowest": "最も遅い (最高品質)", + "qsv_preset_veryfast": "最速(低品質)", + "qsv_slow_hevc": "低速HEVCエンコーディングを許可する", + "qsv_slow_hevc_desc": "これにより、GPU 使用率の向上とパフォーマンスの低下を犠牲にして、古い Intel GPU での HEVC エンコーディングを有効にできます。", + "res_fps_desc": "Sunshineによって宣伝された表示モード。 Moonlight-nx(Switch)のようないくつかのバージョンのMoonlightは、要求された解像度とfpsがサポートされていることを確認するために、これらのリストに依存しています。 この設定では、画面ストリームがMoonlightに送信される方法は変更されません。", + "resolutions": "広告解像度の設定", + "restart_note": "サンシャインは変更を適用するために再起動しています。", + "sunshine_name": "サンシャイン名", + "sunshine_name_desc": "Moonlight によって表示される名前。指定されていない場合は、PC のホスト名が使用されます", + "sw_preset": "SWプリセット", + "sw_preset_desc": "エンコード速度(エンコードフレーム/秒)と圧縮効率(ビットストリームのビット毎の品質)のトレードオフを最適化します。デフォルトは超高速です。", + "sw_preset_fast": "速い", + "sw_preset_faster": "より速く", + "sw_preset_medium": "medium", + "sw_preset_slow": "遅い", + "sw_preset_slower": "遅いです", + "sw_preset_superfast": "スーパーファスト(デフォルト)", + "sw_preset_ultrafast": "超高速", + "sw_preset_veryfast": "veryfast", + "sw_preset_veryslow": "veryslow", + "sw_tune": "SWチューン", + "sw_tune_animation": "アニメーションは漫画に適していますより高いデブロッキングや参照フレームを使っています", + "sw_tune_desc": "チューニングオプション。プリセットの後に適用されます。デフォルトはゼロになります。", + "sw_tune_fastdecode": "fastdecode -- 特定のフィルタを無効にすることでより高速なデコードが可能です", + "sw_tune_film": "フィルム-- 高品質の映画コンテンツに使用します。", + "sw_tune_grain": "穀物は、古くて粒状のフィルム素材に保存されています", + "sw_tune_stillimage": "スタイルはスライドショーのようなコンテンツに適しています", + "sw_tune_zerolatency": "zerolatency -- 高速なエンコーディングと低遅延ストリーミングに適しています (デフォルト)", + "touchpad_as_ds4": "クライアントゲームパッドがタッチパッドが存在することを報告する場合、DS4ゲームパッドをエミュレートします", + "touchpad_as_ds4_desc": "無効にすると、ゲームパッドの種類選択中にタッチパッドの存在が考慮されません。", + "upnp": "UPnP", + "upnp_desc": "インターネット経由でストリーミングするポート転送を自動的に設定します", + "virtual_sink": "Virtual Sink", + "virtual_sink_desc": "使用する仮想オーディオデバイスを手動で指定します。未設定の場合は、デバイスが自動的に選択されます。 自動デバイス選択を使用するには、このフィールドを空白のままにすることを強くお勧めします!", + "virtual_sink_placeholder": "Steamストリーミングスピーカー", + "vt_coder": "VideoToolbox Coder", + "vt_realtime": "VideoToolbox リアルタイムエンコーディング", + "vt_software": "VideoToolbox ソフトウェアエンコーディング", + "vt_software_allowed": "許可", + "vt_software_forced": "強制的に", + "wan_encryption_mode": "WAN暗号化モード", + "wan_encryption_mode_1": "サポートされているクライアントで有効になっています(デフォルト)", + "wan_encryption_mode_2": "すべてのクライアントに必要です", + "wan_encryption_mode_desc": "これは、インターネット経由でストリーミングする際に暗号化がいつ使用されるかを決定します。特に強力なホストやクライアントでは、暗号化によりストリーミングパフォーマンスが低下します。" + }, + "index": { + "description": "サンシャインはムーンライトのための自己ホストゲームストリームホストです。", + "download": "ダウンロード", + "loading_latest": "最新のリリースを読み込んでいます...", + "new_nightly": "新しい ナイトリー バージョンが利用可能です!", + "new_stable": "新しい安定版が利用可能です!", + "startup_errors": "注意Sunshineは起動時にこれらのエラーを検出しました。ストリーミングの前にこれらのエラーを修正することを強くお勧めします。", + "version_dirty": "Sunshineをより良いソフトウェアにしてくれてありがとうございます!", + "version_latest": "サンシャインの最新バージョンを実行しています", + "welcome": "こんにちは、サンシャイン!" + }, + "navbar": { + "applications": "アプリケーション", + "configuration": "設定", + "home": "ホーム", + "password": "パスワードの変更", + "pin": "ピン留めする", + "troubleshoot": "トラブルシューティング" + }, + "password": { + "confirm_password": "パスワードの確認", + "current_creds": "現在の資格情報", + "new_creds": "新しい資格情報", + "new_username_desc": "指定しない場合、ユーザー名は変更されません", + "password_change": "パスワードの変更", + "success_msg": "パスワードが正常に変更されました!このページはまもなくリロードされます。ブラウザーは新しい資格情報を要求します。" + }, + "pin": { + "pair_failure": "ペアリングに失敗しました:PINが正しく入力されたかどうかを確認します", + "pair_success": "成功!ムーンライトを確認して続行してください", + "pin_pairing": "PIN Pairing", + "send": "送信", + "warning_msg": "ペアリングしているクライアントへのアクセス権を持っていることを確認してください。このソフトウェアはコンピュータに完全な制御を与えることができます。注意してください!" + }, + "resource_card": { + "github_discussions": "GitHub Discussions", + "legal": "Legal", + "legal_desc": "このソフトウェアの使用を継続することにより、以下のドキュメントの利用規約に同意したことになります。", + "license": "ライセンス", + "lizardbyte_website": "LizardByte ウェブサイト", + "resources": "リソース", + "resources_desc": "Sunshineのための資源!", + "third_party_notice": "第三者通知" + }, + "troubleshooting": { + "force_close": "強制閉じる", + "force_close_desc": "Moonlight が現在実行中のアプリについて不満がある場合、強制終了すると問題が修正されます。", + "force_close_error": "アプリケーションを終了中にエラー", + "force_close_success": "申請は正常に終了しました!", + "logs": "ログ", + "logs_desc": "Sunshineによってアップロードされたログを参照してください", + "logs_find": "検索...", + "restart_sunshine": "サンシャインを再起動", + "restart_sunshine_desc": "Sunshineが正常に動作していない場合は、再起動を試みることができます。実行中のセッションはすべて終了します。", + "restart_sunshine_success": "サンシャインが再起動しています", + "troubleshooting": "トラブルシューティング", + "unpair_all": "すべてのペアリングを解除", + "unpair_all_desc": "ペアリング済みのデバイスをすべて削除する", + "unpair_all_error": "ペアリング解除中のエラー", + "unpair_all_success": "ペアを解除しました!" + }, + "welcome": { + "confirm_password": "パスワードの確認", + "create_creds": "始める前に、Web UI にアクセスするための新しいユーザー名とパスワードを作成する必要があります。", + "create_creds_alert": "以下の資格情報は、SunshineのWeb UIにアクセスするために必要です。あなたが二度と見ることはありませんので、安全に保管してください!", + "greeting": "Sunshineへようこそ!", + "login": "ログイン", + "welcome_success": "このページはまもなく再読み込みされます。ブラウザーは新しい資格情報を要求します。" + } +} 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 8d1be14d2af..12c382f3d62 100644 --- a/src_assets/common/assets/web/public/assets/locale/ru.json +++ b/src_assets/common/assets/web/public/assets/locale/ru.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", - "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "apply": "Применить", + "auto": "Автоматически", + "autodetect": "Автоопределение (рекомендуется)", + "cancel": "Отмена", + "disabled": "Отключено", + "disabled_def": "Отключено (по умолчанию)", + "do_cmd": "Выполнить команду", + "elevated": "Повышенный", + "enabled": "Включено", + "enabled_def": "Включено (по умолчанию)", + "error": "Ошибка!", + "note": "Примечание:", + "password": "Пароль", + "run_as": "Запустить как Администратор", + "save": "Сохранить", + "see_more": "Подробнее", + "success": "Успех!", + "undo_cmd": "Отменить команду", + "username": "Имя пользователя", + "warning": "Предупреждение!" }, "apps": { - "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", - "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", - "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", - "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", - "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", - "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", - "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "actions": "Действия", + "add_cmds": "Добавить команды", + "add_new": "Добавить новый", + "app_name": "Название приложения", + "app_name_desc": "Имя приложения, как показано на Лунном свете", + "applications_desc": "Приложения обновляются только при перезапуске клиента", + "applications_title": "Заявления", + "auto_detach": "Продолжить трансляцию, если приложение завершит работу быстро", + "auto_detach_desc": "Это попытается автоматически обнаружить приложения лаунчера, которые быстро закрываются после запуска другой программы или экземпляра самостоятельно. Когда приложение запускается тип, оно рассматривается как отдельное приложение.", + "cmd": "Команда", + "cmd_desc": "Основное приложение для запуска. Если пустое, то не будет запущено приложение.", + "cmd_note": "Если путь к исполняемому файлу содержит пробелы, вы должны заключить его в кавычки.", + "cmd_prep_desc": "Список команд, которые должны быть выполнены до/после этого приложения. Если одна из команд не удается, запуск приложения прерван.", + "cmd_prep_name": "Подготовка команд", + "covers_found": "Найдено обложек", + "delete": "Удалить", + "detached_cmds": "Отдельные команды", + "detached_cmds_add": "Добавить отдельную команду", + "detached_cmds_desc": "Список команд для работы в фоновом режиме.", + "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_gcmap": "Запрашиваемая маска геймпада, в bitset/bitfield формате (int)", + "env_client_hdr": "HDR включен клиентом (true/false)", + "env_client_height": "Высота, запрошенная клиентом (int)", + "env_client_host_audio": "Клиент запросил звук узла (true/false)", + "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_xrandr_example": "Пример - Xrandr для автоматизации решения:", + "exit_timeout": "Таймаут выхода", + "exit_timeout_desc": "Количество секунд, в течение которых все процессы приложения смогут легко выйти из приложения. Если не установлено, то приложение будет немедленно прекращено до 5 секунд. Если установлено значение нуля или отрицательное значение, приложение будет немедленно прекращено.", + "find_cover": "Найти обложку", + "global_prep_desc": "Включить/отключить исполнение глобальных команд подготовки для этого приложения.", + "global_prep_name": "Глобальные команды", + "image": "Изображение", + "image_desc": "Значок приложения/путь изображения/изображения, который будет отправлен клиенту. Изображение должно быть PNG файлом. Если не установлено, Sunshine будет отправлять изображение по умолчанию.", + "loading": "Загрузка...", + "name": "Наименование", + "output_desc": "Файл, в котором сохраняется вывод команды, если он не указан, вывод игнорируется", + "output_name": "Вывод", + "run_as_desc": "Это может потребоваться для некоторых приложений, которым требуются права администратора для правильного запуска.", + "wait_all": "Продолжить вещание, пока не завершится все процессы приложения", + "wait_all_desc": "Это будет продолжаться, пока все процессы не будут запущены приложением. Если флажок не установлен, стриминг будет остановлен, когда начальный процесс завершится, даже если запущены другие процессы.", + "working_dir": "Рабочая папка", + "working_dir_desc": "Рабочий каталог, передаваемый процессу. Например, некоторые приложения используют рабочий каталог для поиска конфигурационных файлов. Если не установлено, Sunshine будет по умолчанию родительский каталог команды" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", - "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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.", + "adapter_name": "Имя адаптера", + "adapter_name_desc_linux_1": "Вручную укажите GPU для захвата.", + "adapter_name_desc_linux_2": "найти все устройства, способные к VAAPI", + "adapter_name_desc_linux_3": "Замените ``renderD129`` устройством сверху, чтобы перечислить имя и возможности устройства. Чтобы быть поддержанным Sunshine, он должен иметь как минимум свое:", + "adapter_name_desc_win": "Укажите GPU для захвата. Если флажок установлен, GPU выбирается автоматически. Мы настоятельно рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор GPU! Примечание: этот GPU должен иметь дисплей подключён и включен. Соответствующие значения могут быть найдены с помощью следующей команды:", + "adapter_name_placeholder_win": "Radeon RX 580 серия", + "add": "Добавить", + "address_family": "Семейство адресов", + "address_family_both": "IPv4 + IPv6", + "address_family_desc": "Установить семейство адресов, используемое Sunshine", + "address_family_ipv4": "Только IPv4", + "always_send_scancodes": "Всегда отправлять коды", + "always_send_scancodes_desc": "Отправка scancodes улучшает совместимость с играми и приложениями, но может привести к неправильному вводу клавиатуры от некоторых клиентов, которые не используют американскую клавиатуру. Включите, если ввод клавиатуры вообще не работает в некоторых приложениях. Отключено, если ключи на клиенте генерируют неправильный входной параметр на хосте.", "amd_coder": "AMF Coder (H264)", - "amd_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", + "amd_preanalysis": "Предварительный анализ AMF", + "amd_quality": "Качество AMF", + "amd_quality_balanced": "сбалансированный -- сбалансированный (по умолчанию)", + "amd_quality_quality": "качество -- предпочитаемое качество", + "amd_quality_speed": "скорость - скорость отдачи", + "amd_rc": "Контроль скорости AMF", + "amd_rc_cbr": "cbr -- постоянный битрейт", + "amd_rc_cqp": "cqp -- постоянный режим qp", + "amd_rc_vbr_latency": "vbr_latency -- Задержка ограничивает битрейт (по умолчанию)", + "amd_rc_vbr_peak": "vbr_peak -- пиковый ограниченный битрейт", + "amd_usage": "Использование AMF", + "amd_usage_lowlatency": "низкая задержка - низкая задержка (быстро)", + "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - низкая задержка, высокое качество (быстро)", + "amd_usage_transcoding": "перекодирование -- перекодирование (медленно)", + "amd_usage_ultralowlatency": "ультразвуковая задержка - ультра низкая задержка (быстрый)", + "amd_usage_webcam": "веб-камера -- веб-камера (медленно)", + "amd_vbaq": "Адаптивное квантование на основе отклонений AMF (VBAQ)", + "apply_note": "Нажмите 'Применить', чтобы перезапустить Sunshine и применить изменения. Все запущенные сессии будут завершены.", + "audio_sink": "Снимок звука", + "audio_sink_desc_linux": "Название звуковой сигнала, используемой для аудиоциклов. Если эта переменная не указана, пульс будет выбирать стандартное устройство монитора. Вы можете найти название звуковой раковины, используя либо команду:", + "audio_sink_desc_macos": "Название звуковой раковины, используемой для аудиоциклов. Sunshine может получить доступ только к микрофонам в macOS из-за ограничений системы. Для трансляции системного аудио с помощью Soundflower или BlackHole.", + "audio_sink_desc_win": "Укажите вручную определённое аудиоустройство для записи. Если устройство выключено, оно выбирается автоматически. Рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор устройств! Если у вас несколько аудио устройств с одинаковыми именами, вы можете получить ID устройства, используя следующую команду:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", - "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", - "configuration": "Configuration", + "audio_sink_placeholder_win": "Динамики (High Definition Audio Device)", + "av1_mode": "Поддержка AV1", + "av1_mode_0": "Sunshine будет рекламировать поддержку AV1 на основе возможностей кодировщика (рекомендуется)", + "av1_mode_1": "Sunshine не будет рекламировать поддержку AV1", + "av1_mode_2": "Sunshine рекламирует поддержку AV1 Main 8-bit профиля", + "av1_mode_3": "Sunshine будет рекламировать поддержку профилей AV1 Main 8-bit и 10-bit (HDR)", + "av1_mode_desc": "Позволяет клиенту запрашивать AV1 Main 8-bit или 10-битные видео потоки. AV1 является более интенсивным процессором для кодирования, поэтому включение этой опции может снизить производительность при использовании программного обеспечения.", + "back_button_timeout": "Таймаут эмуляции кнопки Домой", + "back_button_timeout_desc": "Если кнопка Назад/Выбор удерживается вниз для заданного количества миллисекунд, то кнопка Home/Guide будет эмулирована. Если установлено значение < 0 (по умолчанию), удерживая кнопку Назад/Выделение не будет эмулировать кнопку Домашний/Гид.", + "capture": "Принудительный метод захвата", + "capture_desc": "В автоматическом режиме Sunshine будет использовать первый работающий драйвер NvFBC.", + "cert": "Сертификат", + "cert_desc": "Сертификат, используемый для пары клиентов веб-интерфейса и Moonlight, для лучшей совместимости должен иметь публичный ключ RSA-2048.", + "channels": "Максимальное число подключенных клиентов", + "channels_desc_1": "Sunshine позволяет одновременное совместное использование одного сеанса потокового вещания.", + "channels_desc_2": "Некоторые аппаратные кодировщики могут иметь ограничения, уменьшающие производительность с несколькими потоками.", + "coder_cabac": "cabac -- контекстная адаптивная арифметическая кодировка - более высокое качество", + "coder_cavlc": "cavlc -- контекстное адаптивное кодирование переменной длины - ускорение декодирования", + "configuration": "Конфигурация", "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", - "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "controller_desc": "Позволяет гостям контролировать хост-систему с помощью геймпада / контроллера", + "credentials_file": "Файл учётных данных", + "credentials_file_desc": "Храните имя пользователя/пароль отдельно от файла состояния Sunshine.", + "ds4_back_as_touchpad_click": "Назад/Выберете для нажатия сенсорной панели", + "ds4_back_as_touchpad_click_desc": "При принудительной эмуляции DS4, нажмите на карточку Назад/Выделение для сенсорной панели", + "encoder": "Принудительный кодировщик", + "encoder_desc": "Принудительно использовать специальный кодировщик, в противном случае Sunshine будет выбирать наилучший доступный вариант. Примечание: Если вы укажете аппаратный кодировщик в Windows, он должен соответствовать GPU, где установлен дисплей.", + "encoder_software": "Программный", + "external_ip": "Внешний IP", + "external_ip_desc": "Если внешний IP адрес не указан, Sunshine будет автоматически определять внешний IP", + "fec_percentage": "Процент FEC", + "fec_percentage_desc": "Процент погрешности исправления пакетов по каждому пакету данных в каждом видеокадре. Более высокие значения могут корректно повлиять на потерю сетевых пакетов, но за счет увеличения пропускной способности.", + "ffmpeg_auto": "auto -- пусть ffmpeg решить (по умолчанию)", + "file_apps": "Файл приложений", + "file_apps_desc": "Файл, в котором хранятся текущие приложения Sunshine.", + "file_state": "Файл штата", + "file_state_desc": "Файл, в котором хранится текущее состояние Sunshine", + "fps": "Рекламные FPS", + "gamepad": "Эмулированный тип геймпада", + "gamepad_auto": "Автоматические настройки выбора", + "gamepad_desc": "Выберите тип геймпада для эмулирования на хосте", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "Ручные настройки DS4", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", + "global_prep_cmd": "Подготовка команд", + "global_prep_cmd_desc": "Настроить список команд, которые будут выполнены до или после запуска любого приложения. Если какая-либо из указанных команд подготовки не удается, процесс запуска приложения будет прерван.", + "hevc_mode": "Поддержка HEVC", + "hevc_mode_0": "Sunshine будет рекламировать поддержку HEVC на основе возможностей кодировщика (рекомендуется)", + "hevc_mode_1": "Sunshine не будет рекламировать поддержку HEVC", + "hevc_mode_2": "Sunshine будет рекламировать поддержку HEVC Main", + "hevc_mode_3": "Sunshine будет рекламировать поддержку профилей HEVC Main и Main10 (HDR)", + "hevc_mode_desc": "Позволяет клиенту запрашивать HEVC Main или HEVC Main10 видео потоков. HEVC является более процессорным в кодировке, поэтому включение этой опции может снизить производительность при использовании программного обеспечения.", + "high_resolution_scrolling": "Поддержка прокрутки высокого разрешения", + "high_resolution_scrolling_desc": "Когда включено, Sunshine будет прокручивать события с высоким разрешением от клиентов лунного света. Это может быть полезно для отключения для старых приложений, которые слишком быстро прокручивать при прокрутке событий высокого разрешения.", + "install_steam_audio_drivers": "Установить Steam Audio Drivers", + "install_steam_audio_drivers_desc": "Если Steam установлен, он автоматически установит драйвер Steam Streaming Speakers для поддержки 5.1/7.1 объемного звука и отключения хоста.", + "key_repeat_delay": "Задержка повтора ключа", + "key_repeat_delay_desc": "Контролируйте как быстрые клавиши будут повторяться. Первоначальная задержка в миллисекундах перед повтором ключей.", + "key_repeat_frequency": "Частота повторения ключа", + "key_repeat_frequency_desc": "Как часто ключи повторяют каждую секунду. Эта настраиваемая опция поддерживает десятичные дроби.", + "key_rightalt_to_key_win": "Карта клавиши Alt справа для клавиши Windows", + "key_rightalt_to_key_win_desc": "Возможно, вы не можете отправить ключ Windows непосредственно с лунного света. В этих случаях было бы полезно заставить Солнечный свет думать, что ключ правой Alt является клавишей Windows", + "keyboard": "Включить ввод клавиатуры", + "keyboard_desc": "Позволяет гостям управлять системой хоста с помощью клавиатуры", + "lan_encryption_mode": "Режим шифрования LAN", + "lan_encryption_mode_1": "Включено для поддерживаемых клиентов", + "lan_encryption_mode_2": "Требуется для всех клиентов", + "lan_encryption_mode_desc": "Определяет, когда шифрование будет использоваться при потоке по локальной сети. Шифрование может снизить производительность потокового вещания, особенно на менее мощных узлах и клиентах.", + "locale": "Язык", + "locale_desc": "Локаль, используемая для пользовательского интерфейса Sunshine.", + "log_level": "Уровень журнала", "log_level_0": "Verbose", "log_level_1": "Debug", - "log_level_2": "Info", - "log_level_3": "Warning", - "log_level_4": "Error", + "log_level_2": "Инфо", + "log_level_3": "Предупреждение", + "log_level_4": "Ошибка", "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", + "log_level_6": "Нет", + "log_level_desc": "Минимальный уровень журнала, напечатанный по стандарту", + "log_path": "Путь к лог-файлу", + "log_path_desc": "Файл, в котором хранятся текущие журналы Sunshine.", + "min_threads": "Минимальное количество потоков ЦП", + "min_threads_desc": "Увеличение значения немного снижает эффективность кодирования, но tradeoff обычно стоит увеличить использование большего количества ядер процессора для кодирования. Идеальное значение это наименьшее значение, которое может надежно закодировать при желаемых потоковых настройках на вашем оборудовании.", + "misc": "Прочие параметры", + "motion_as_ds4": "Эмулируйте геймпад DS4, если клиент сообщает датчики движения", + "motion_as_ds4_desc": "Если отключено, датчики движения не будут учитываться при выборе типа геймпада.", + "mouse": "Включить ввод мыши", + "mouse_desc": "Позволяет гостям контролировать хост-систему мышкой", + "native_pen_touch": "Родная Pencil/Touch поддержка", + "native_pen_touch_desc": "Если включено, Sunshine будет проходить через родные события pen/touch от клиентов Moonlight. Это может быть полезно для более старых приложений без поддержки pen/touch .", + "nvenc_h264_cavlc": "Предпочитайте CAVLC поверх CABAC в H.264", + "nvenc_h264_cavlc_desc": "Форма кодирования энтропии. CAVLC требует на 10% больше битрейта для того же качества. Только для очень старых декодирующих устройств.", + "nvenc_latency_over_power": "Предпочитайте более низкую задержку кодирования по сравнению с экономией энергии", + "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Отключение этого значения не рекомендуется, так как это может привести к значительному увеличению задержки кодирования.", + "nvenc_opengl_vulkan_on_dxgi": "Настоящий OpenGL/Vulkan на вершине DXGI", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine не может захватывать полноэкранные программы OpenGL и Vulkan с полной скоростью кадра, если они не присутствуют поверх DXGI. Это общесистемная настройка, которая возвращается при выходе из программы.", + "nvenc_preset": "Пресет производительности", + "nvenc_preset_1": "(быстрый, по умолчанию)", + "nvenc_preset_7": "(медленно)", + "nvenc_preset_desc": "Более высокие значения улучшают сжатие (качество на заданном битрейте) за счет увеличения задержки кодирования. Рекомендуется изменять только когда ограничено сетью или декодером, в противном случае подобный эффект может быть достигнут путем увеличения битрейта.", + "nvenc_realtime_hags": "Использовать приоритет реального времени в аппаратном ускоренном планировании gpu", + "nvenc_realtime_hags_desc": "В настоящее время драйвера NVIDIA могут заморозиться в кодировщике при включенном HAGS, используется приоритет реального времени и использование VRAM близко к максимуму. Отключение этой опции снижает приоритет на высокий, блокирование по цене пониженной производительности захвата при высокой нагрузке GPU.", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", - "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", - "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", - "port_port": "Port", + "nvenc_spatial_aq_desc": "Назначить более высокие значения QP для плоских регионов видео. Рекомендуется включить при потоке на более низких битрейтах.", + "nvenc_spatial_aq_disabled": "Отключено (быстрее, по умолчанию)", + "nvenc_spatial_aq_enabled": "Включено (медленнее)", + "nvenc_twopass": "Режим двухпрохождения", + "nvenc_twopass_desc": "Добавляет предварительную кодировку. Это позволяет обнаружить больше векторов движений, лучше распределять битрейт по фрейму и строго придерживаться лимитов битрейта. Отключение не рекомендуется, так как это может привести к перегрузке битрейта и последующей потере пакетов.", + "nvenc_twopass_disabled": "Отключено (быстрый, не рекомендуется)", + "nvenc_twopass_full_res": "Полное разрешение (медленнее)", + "nvenc_twopass_quarter_res": "Квартальное разрешение (по умолчанию)", + "nvenc_vbv_increase": "Однокадровое увеличение VBV/HRD", + "nvenc_vbv_increase_desc": "По умолчанию солнечный свет использует однокадровый VBV/HRD, что означает, что любой кодируемый размер видеокадра не должен превышать запрашиваемый битрейт, поделенный на заданную скорость кадра. Расслабляя это ограничение может быть полезным и выступать в качестве битрейта с низкой задержкой, но может также привести к потере пакетов, если в сети нет заголовка буфера для обработки битрейтов. Максимально допустимое значение - 400, что соответствует 5-кратному увеличенному пределу видеокадра в кодировке.", + "origin_web_ui_allowed": "Оригинальный Web UI разрешён", + "origin_web_ui_allowed_desc": "Источник адреса удаленной конечной точки, который не запрещает доступ к Web UI", + "origin_web_ui_allowed_lan": "Только в LAN могут получить доступ к Web UI", + "origin_web_ui_allowed_pc": "Только локальный хост может получить доступ к Web UI", + "origin_web_ui_allowed_wan": "Любой может получить доступ к веб-интерфейсу", + "output_name_desc_linux": "Во время запуска Sunshine вы должны увидеть список обнаруженных мониторов. Вы должны использовать значение перед двоеточием в выходе. Например:", + "output_name_desc_win": "Вручную укажите дисплей для захвата. Если не установлено, то будет произведен захват основного экрана. Примечание: Если вы указали GPU выше, этот экран должен быть подключен к этому GPU. Соответствующие значения могут быть найдены с помощью следующей команды:", + "output_name_linux": "Номер монитора", + "output_name_win": "Имя вывода", + "ping_timeout": "Таймаут пинга", + "ping_timeout_desc": "Как долго ждать в миллисекундах данных с лунного света перед выключением потока", + "pkey": "Приватный ключ", + "pkey_desc": "Приватный ключ, используемый для пары клиентов Moonlight. Для лучшей совместимости это должен быть приватный ключ RSA-2048.", + "port": "Порт", + "port_alert_1": "Солнечный свет не может использовать порты ниже 1024!", + "port_alert_2": "Порты выше 65535 недоступны!", + "port_desc": "Установить семейство портов, используемых Sunshine", + "port_http_port_note": "Используйте этот порт для соединения с лунным светом.", + "port_note": "Примечание", + "port_port": "Порт", "port_protocol": "Protocol", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", + "port_warning": "Размещение веб-интерфейса в Интернете является риском для безопасности! Продолжайте на свой страх и риск!", "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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.", + "qp": "Параметр количественного измерения", + "qp_desc": "Некоторые устройства могут не поддерживать постоянную ставку бит. Для этих устройств используется QP. Более высокое значение означает больше сжатия, но меньшее качество.", "qsv_coder": "QuickSync Coder (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", - "qsv_preset_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", - "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", - "sw_preset_ultrafast": "ultrafast", + "qsv_preset_fast": "быстрее (меньшее качество)", + "qsv_preset_faster": "самый быстрый (низкое качество)", + "qsv_preset_medium": "среднее (по умолчанию)", + "qsv_preset_slow": "медленно (хорошее качество)", + "qsv_preset_slower": "медленнее (лучшее качество)", + "qsv_preset_slowest": "самый медленный (лучшее качество)", + "qsv_preset_veryfast": "самый быстрый (низкое качество)", + "qsv_slow_hevc": "Разрешить Slow HEVC кодирование", + "qsv_slow_hevc_desc": "Это позволяет включить HEVC кодирование на старых процессорах Intel за счет более высокого использования GPU и более низкой производительности.", + "res_fps_desc": "Режимы демонстрации, рекламируемые Sunshine. Некоторые версии Moonlight, такие как Moonlight-nx (Switch), полагаются на эти списки, чтобы обеспечить поддержку запрашиваемых резолюций и fps. Этот параметр не изменяет способа передачи экрана на Луну.", + "resolutions": "Рекламные резолюции", + "restart_note": "Sunshine перезапускается, чтобы применить изменения.", + "sunshine_name": "Название Солнца", + "sunshine_name_desc": "Имя хоста, отображаемое при Moonlight. Если не указано, используется имя хоста", + "sw_preset": "SW пресеты", + "sw_preset_desc": "Оптимизировать компромисс между скоростью кодирования (кодированные кадры в секунду) и эффективностью сжатия (качество за бит в bitstream). По умолчанию супербыстро.", + "sw_preset_fast": "быстро", + "sw_preset_faster": "быстрее", + "sw_preset_medium": "средняя", + "sw_preset_slow": "медленно", + "sw_preset_slower": "медленнее", + "sw_preset_superfast": "супербыстрый (по умолчанию)", + "sw_preset_ultrafast": "ультразвук", "sw_preset_veryfast": "veryfast", "sw_preset_veryslow": "veryslow", "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", + "sw_tune_animation": "анимация -- подходит для мультфильмов, использует более высокую блокировку и больше эталонных кадров", + "sw_tune_desc": "Настройка параметров, применяемых после пресета. По умолчанию нулевая настройка.", + "sw_tune_fastdecode": "fastdecode -- позволяет ускорить декодирование, отключив некоторые фильтры", + "sw_tune_film": "фильм -- используется для высококачественного содержания фильма; снижает блокировку", + "sw_tune_grain": "зерно - сохраняет структуру зерна в старых, зернистых пленках", + "sw_tune_stillimage": "stillimage -- подходит для содержимого как слайд-шоу", + "sw_tune_zerolatency": "zerolatency -- подходит для быстрой кодировки и потокового низкозадержки (по умолчанию)", + "touchpad_as_ds4": "Эмулируйте геймпад DS4, если клиент сообщает, что сенсорная панель присутствует", + "touchpad_as_ds4_desc": "Если отключено, присутствие сенсорной панели не будет учитываться при выборе типа геймпада.", "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", - "virtual_sink_placeholder": "Steam Streaming Speakers", + "upnp_desc": "Автоматически настраивать переадресацию портов для трансляции через Интернет", + "virtual_sink": "Виртуальный снимок", + "virtual_sink_desc": "Вручную укажите виртуальное аудио устройство. Если установлено, устройство будет выбрано автоматически. Рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор устройств!", + "virtual_sink_placeholder": "Динамики Steam", "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", - "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "vt_realtime": "VideoToolbox в реальном времени кодирования", + "vt_software": "Программное кодирование VideoToolbox", + "vt_software_allowed": "Разрешено", + "vt_software_forced": "Принудительно", + "wan_encryption_mode": "Режим шифрования WAN", + "wan_encryption_mode_1": "Включено для поддерживаемых клиентов (по умолчанию)", + "wan_encryption_mode_2": "Требуется для всех клиентов", + "wan_encryption_mode_desc": "Определяет, когда шифрование будет использоваться при потоке через Интернет. Шифрование может снизить производительность потокового вещания, особенно на менее мощных хостах и клиентах." }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", - "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hello, Sunshine!" + "description": "Sunshine - это хост для самостоятельной игры на Лунном свете.", + "download": "Скачать", + "loading_latest": "Загрузка последней версии...", + "new_nightly": "Доступна новая версия Ночной!", + "new_stable": "Доступна новая версия Стабильная!", + "startup_errors": "Внимание! Sunshine обнаружил эти ошибки во время запуска. Мы НАСТОЯТЕЛЬНО РЕКОМЕНДУЕМ исправить их перед началом трансляции.", + "version_dirty": "Спасибо за помощь в создании программного обеспечения Sunshine!", + "version_latest": "Вы используете последнюю версию Sunshine", + "welcome": "Здравствуйте, Солнце!" }, "navbar": { - "applications": "Applications", - "configuration": "Configuration", - "home": "Home", - "password": "Change Password", - "pin": "Pin", - "troubleshoot": "Troubleshooting" + "applications": "Заявления", + "configuration": "Конфигурация", + "home": "Домашний", + "password": "Изменить пароль", + "pin": "Закрепить", + "troubleshoot": "Устранение проблем" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "Подтверждение пароля", + "current_creds": "Текущие учетные данные", + "new_creds": "Новые учетные данные", + "new_username_desc": "Если не указано, имя пользователя не изменится", + "password_change": "Смена пароля", + "success_msg": "Пароль успешно изменен! Эта страница скоро перезагрузится, ваш браузер запросит новые учетные данные." }, "pin": { + "pair_failure": "Соединение не удалось: проверьте, правильно ли введен PIN-код", + "pair_success": "Успех! Пожалуйста, отметьте Лунный свет для продолжения", "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "send": "Отправить", + "warning_msg": "Убедитесь, что у вас есть доступ к клиенту, с которым вы сотрудничаете. Это программное обеспечение может дать полный контроль вашему компьютеру, так что будьте осторожны!" }, "resource_card": { "github_discussions": "GitHub Discussions", - "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "legal": "Юридическая информация", + "legal_desc": "Продолжая использовать программное обеспечение, вы соглашаетесь с условиями в следующих документах.", + "license": "Лицензия", + "lizardbyte_website": "Сайт LizardByte", + "resources": "Ресурсы", + "resources_desc": "Ресурсы для Солнца!", + "third_party_notice": "Уведомление о третьих лицах" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", - "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "force_close": "Принудительное закрытие", + "force_close_desc": "Если Moonlight жалуется на запущенное приложение, принудительное закрытие приложения устранит проблему.", + "force_close_error": "Ошибка при закрытии приложения", + "force_close_success": "Заявка успешно закрыта!", + "logs": "Логи", + "logs_desc": "Смотреть журналы, загруженные Sunshine", + "logs_find": "Найти...", + "restart_sunshine": "Перезапустить солнечный свет", + "restart_sunshine_desc": "Если Sunshine работает некорректно, вы можете попробовать перезапустить его. Это прекратит работу всех запущенных сессий.", + "restart_sunshine_success": "Солнечный свет перезапускается", + "troubleshooting": "Устранение проблем", + "unpair_all": "Отменить все", + "unpair_all_desc": "Удалите все ваши сопряженные устройства", + "unpair_all_error": "Ошибка при отмене подключения", + "unpair_all_success": "Успешное восстановление!" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", - "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "confirm_password": "Подтвердите пароль", + "create_creds": "Перед началом работы нам нужно сделать новый логин и пароль для доступа к Web UI.", + "create_creds_alert": "Учетные данные, указанные ниже, необходимы для доступа к сетевому интерфейсу Sunshine. Храните их в безопасности, так как вы никогда их не увидите снова!", + "greeting": "Добро пожаловать в Sunshine!", + "login": "Логин", + "welcome_success": "Эта страница скоро перезагрузится, ваш браузер запросит новые учетные данные" } } 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 8d1be14d2af..347a6ac5f2c 100644 --- a/src_assets/common/assets/web/public/assets/locale/sv.json +++ b/src_assets/common/assets/web/public/assets/locale/sv.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", - "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "apply": "Tillämpa", + "auto": "Automatisk", + "autodetect": "Autodetektera (rekommenderas)", + "cancel": "Avbryt", + "disabled": "Inaktiverad", + "disabled_def": "Inaktiverad (standard)", + "do_cmd": "Gör kommando", + "elevated": "Förhöjd", + "enabled": "Aktiverad", + "enabled_def": "Aktiverad (standard)", + "error": "Fel!", + "note": "Notera:", + "password": "Lösenord", + "run_as": "Kör som administratör", + "save": "Spara", + "see_more": "Se mer", + "success": "Klart!", + "undo_cmd": "Ångra kommando", + "username": "Användarnamn", + "warning": "Varning!" }, "apps": { - "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", - "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", + "actions": "Åtgärder", + "add_cmds": "Lägg till kommandon", + "add_new": "Lägg till ny", + "app_name": "Applikationens namn", + "app_name_desc": "Applikationsnamn, som visas på Moonlight", + "applications_desc": "Applikationer uppdateras endast när klienten startas om", + "applications_title": "Applikationer", + "auto_detach": "Fortsätt strömma om programmet avslutas snabbt", + "auto_detach_desc": "Detta kommer att försöka att automatiskt upptäcka launcher-typ appar som stänger snabbt efter att ha startat ett annat program eller instans av sig själva. När en app med launcher-typ upptäcks behandlas den som en fristående app.", + "cmd": "Kommando", + "cmd_desc": "Huvudansökan att starta. Om den är tom, kommer ingen ansökan att startas.", + "cmd_note": "Om sökvägen till kommandot exekverbart innehåller mellanslag, måste du bifoga det i citattecken.", + "cmd_prep_desc": "En lista över kommandon som ska köras före/efter detta program. Om något av prep-kommandona misslyckas, starta programmet avbryts.", + "cmd_prep_name": "Kommando förberedelser", + "covers_found": "Hittade omslag", + "delete": "Radera", + "detached_cmds": "Fristående kommandon", + "detached_cmds_add": "Lägg till fristående kommando", + "detached_cmds_desc": "En lista över kommandon som ska köras i bakgrunden.", + "detached_cmds_note": "Om sökvägen till kommandot exekverbart innehåller mellanslag, måste du bifoga det i citattecken.", + "edit": "Redigera", "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", - "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", - "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", - "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", - "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "env_app_name": "Appens namn", + "env_client_audio_config": "Ljudkonfigurationen begärd av klienten (2.0/5.1/7.1)", + "env_client_enable_sops": "Klienten har begärt alternativet att optimera spelet för optimal streaming (true/false)", + "env_client_fps": "FPS begärd av klienten (int)", + "env_client_gcmap": "Den begärda gamepad masken, i bitset/bitfield format (int)", + "env_client_hdr": "HDR är aktiverat av klienten (true/false)", + "env_client_height": "Höjd som begärts av kunden (int)", + "env_client_host_audio": "Kunden har begärt värdljud (true/false)", + "env_client_width": "Bredden begärd av klienten (int)", + "env_displayplacer_example": "Exempel - displayplacer för upplösning Automation:", + "env_qres_example": "Exempel - QRes för upplösning Automation:", + "env_qres_path": "qres sökväg", + "env_var_name": "Var namn", + "env_vars_about": "Om miljövariabler", + "env_vars_desc": "Alla kommandon får dessa miljövariabler som standard:", + "env_xrandr_example": "Exempel - Xrandr för upplösning Automation:", + "exit_timeout": "Avsluta Timeout", + "exit_timeout_desc": "Antal sekunder att vänta på att alla app-processer ska avslutas graciöst när det krävs för att avsluta. Om du inte har angett detta är standardvärdet att vänta upp till 5 sekunder. Om satt till noll eller ett negativt värde kommer appen att avslutas omedelbart.", + "find_cover": "Hitta omslag", + "global_prep_desc": "Aktivera/Inaktivera exekvering av globala prep kommandon för denna applikation.", + "global_prep_name": "Globala prep kommandon", + "image": "Bild", + "image_desc": "Applikations ikon/bild/sökväg som kommer att skickas till klienten. Bilden måste vara en PNG-fil. Om den inte är inställd, kommer Sunshine att skicka standardrutans bild.", + "loading": "Laddar...", + "name": "Namn", + "output_desc": "Filen där kommandots utdata lagras, om den inte är angiven, så ignoreras utdata", + "output_name": "Utdata", + "run_as_desc": "Detta kan vara nödvändigt för vissa program som kräver administratörsbehörighet för att köras korrekt.", + "wait_all": "Fortsätt strömma tills alla appprocesser avslutas", + "wait_all_desc": "Detta fortsätter strömningen tills alla processer som startats av appen har avslutats. När den avmarkeras kommer strömningen att sluta när den initiala appprocessen avslutas, även om andra appprocesser fortfarande är igång.", + "working_dir": "Arbetar katalog", + "working_dir_desc": "Den arbetskatalog som ska skickas till processen. Till exempel använder vissa program arbetskatalogen för att söka efter konfigurationsfiler. Om inte anges, kommer Sunshine standard till den överordnade katalogen i kommandot" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", + "adapter_name": "Adapter namn", + "adapter_name_desc_linux_1": "Ange manuellt en GPU som ska användas för att fånga.", + "adapter_name_desc_linux_2": "att hitta alla enheter som kan VAAPI", + "adapter_name_desc_linux_3": "Ersätt ``renderD129`` med enheten ovanifrån för att lista enhetens namn och egenskaper. För att få stöd av Sunshine, måste det ha på minimum:", + "adapter_name_desc_win": "Ange manuellt en GPU som ska användas för att fånga. Om du vill avbryta, väljs GPU automatiskt. Vi rekommenderar starkt att du lämnar det här fältet tomt för att använda automatiskt GPU-val! Obs: Denna GPU måste ha en display ansluten och påslagen. Du hittar lämpliga värden med hjälp av följande kommando:", + "adapter_name_placeholder_win": "Radeon RX 580-serien", + "add": "Lägg till", + "address_family": "Adress Familj", "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "address_family_desc": "Ställ in adressfamiljen som används av Sunshine", + "address_family_ipv4": "Endast IPv4", + "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_enforce_hrd": "AMF Hypotetisk referensavkodare (HRD) verkställighet", + "amd_preanalysis": "AMF Föranalys", + "amd_quality": "AMF Kvalitet", + "amd_quality_balanced": "balanced -- balanserad (standard)", + "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_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_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)", + "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:", + "audio_sink_desc_macos": "Namnet på ljuddiskbänken som används för Audio Loopback. Solsken kan bara komma åt mikrofoner på macOS på grund av systembegränsningar. För att strömma systemljud med Soundflower eller BlackHole.", + "audio_sink_desc_win": "Ange manuellt en specifik ljudenhet som ska fångas upp. Om enheten avaktiveras väljs enheten automatiskt. Vi rekommenderar starkt att lämna detta fält tomt för att använda automatiskt val av enhet! Om du har flera ljudenheter med identiska namn, kan du få enhets-ID med följande kommando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", + "audio_sink_placeholder_win": "Högtalare (High Definition Audio Device)", "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", - "configuration": "Configuration", + "av1_mode_0": "Sunshine kommer att annonsera stöd för AV1 baserat på kodarfunktioner (rekommenderas)", + "av1_mode_1": "Solsken kommer inte att annonsera stöd för AV1", + "av1_mode_2": "Sunshine kommer att annonsera stöd för AV1 Main 8-bitars profil", + "av1_mode_3": "Sunshine kommer att annonsera stöd för AV1 Main 8-bitars och 10-bitars (HDR) profiler", + "av1_mode_desc": "Tillåter klienten att begära AV1 Main 8-bitars eller 10-bitars videoströmmar. AV1 är mer CPU-intensiv att koda, så att detta kan minska prestandan vid användning av programkodning.", + "back_button_timeout": "Hem/Guide Knapp Emulation Timeout", + "back_button_timeout_desc": "Om knappen Bakåt/Select hålls ned för det angivna antalet millisekunder, emuleras en Hem/Guide knapptryckning. Om satt till ett värde < 0 (standard) kommer inte knappen Hem/Guide att efterliknas knappen.", + "capture": "Tvinga en specifik fångstmetod", + "capture_desc": "På automatiskt läge Sunshine kommer att använda den första som fungerar. NvFBC kräver lappade nvidia-drivrutiner.", + "cert": "Certifikat", + "cert_desc": "Certifikatet används för webb UI och Moonlight klient parning. För bästa kompatibilitet bör detta ha en RSA-2048 publik nyckel.", + "channels": "Maximalt antal anslutna klienter", + "channels_desc_1": "Sunshine kan tillåta en enda streaming-session att delas med flera klienter samtidigt.", + "channels_desc_2": "Vissa hårdvarukodare kan ha begränsningar som minskar prestandan med flera strömmar.", + "coder_cabac": "cabac – kontext adaptiv binär aritmetisk kodning - högre kvalitet", + "coder_cavlc": "cavlc – sammanhangsberoende kodning med variabellängd - snabbare avkodning", + "configuration": "Konfiguration", "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", - "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "controller_desc": "Tillåter gästerna att styra värdsystemet med en gamepad / controller", + "credentials_file": "Filen för inloggningsuppgifter", + "credentials_file_desc": "Lagra användarnamn/lösenord separat från Sunshines statusfil.", + "ds4_back_as_touchpad_click": "Karta bakåt/välj att Touchpad Klicka", + "ds4_back_as_touchpad_click_desc": "När DS4-emulering tvingas, kartlägg Tillbaka/välj att Touchpad Klicka", + "encoder": "Tvinga en specifik kodare", + "encoder_desc": "Tvinga en specifik kodare, annars kommer Sunshine att välja det bästa tillgängliga alternativet. Obs: Om du anger en hårdvarukodare i Windows, måste den matcha GPU där skärmen är ansluten.", + "encoder_software": "Programvara", + "external_ip": "Extern IP", + "external_ip_desc": "Om ingen extern IP-adress anges, kommer Sunshine automatiskt upptäcka extern IP", + "fec_percentage": "FEC Procent", + "fec_percentage_desc": "Procent av felkorrigering av paket per datapaket i varje videoram. Högre värden kan korrigera för mer förlust av nätverkspaket, men på bekostnad av ökad bandbreddsanvändning.", + "ffmpeg_auto": "auto – låt ffmpeg bestämma (standard)", + "file_apps": "Appar Fil", + "file_apps_desc": "Filen där aktuella appar från Sunshine lagras.", + "file_state": "Status fil", + "file_state_desc": "Filen där nuvarande tillstånd av solsken lagras", + "fps": "Annonserad FPS", + "gamepad": "Emulerad speltyp", + "gamepad_auto": "Automatiska val", + "gamepad_desc": "Välj vilken typ av gamepad som ska emuleras på värden", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "Manuella DS4-alternativ", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", + "global_prep_cmd": "Kommando förberedelser", + "global_prep_cmd_desc": "Konfigurera en lista över kommandon som ska köras före eller efter att du kört något program. Om något av de angivna förberedelsekommandona misslyckas, kommer programstartprocessen att avbrytas.", + "hevc_mode": "Stöd för HEVC", + "hevc_mode_0": "Sunshine kommer att annonsera stöd för HEVC baserat på kodarfunktioner (rekommenderas)", + "hevc_mode_1": "Solsken kommer inte att annonsera stöd för HEVC", + "hevc_mode_2": "Sunshine kommer att annonsera stöd för HEVC Main profil", + "hevc_mode_3": "Sunshine kommer att annonsera stöd för HEVC Main och Main10 (HDR) profiler", + "hevc_mode_desc": "Tillåter kunden att begära HEVC Main eller HEVC Main10 videoströmmar. HEVC är mer CPU-intensiv att koda, så att detta kan minska prestandan vid användning av programkodning.", + "high_resolution_scrolling": "Stöd för högupplöst rullning", + "high_resolution_scrolling_desc": "När den är aktiverad kommer Sunshine att passera genom högupplösta scroll-händelser från Moonlight klienter. Detta kan vara användbart för att inaktivera för äldre program som bläddrar för snabbt med högupplösta scroll-händelser.", + "install_steam_audio_drivers": "Installera Steam Audio-drivrutiner", + "install_steam_audio_drivers_desc": "Om Steam är installerat kommer detta automatiskt installera drivrutinen Steam Streaming Speakers för att stödja 5.1/7.1 surroundljud och ljuddämpning av värdljud.", + "key_repeat_delay": "Nyckel upprepas fördröjning", + "key_repeat_delay_desc": "Kontrollera hur snabba tangenter kommer att upprepa sig. Den initiala fördröjningen i millisekunder innan du upprepar nycklar.", + "key_repeat_frequency": "Nyckel Upprepa Frekvens", + "key_repeat_frequency_desc": "Hur ofta nycklar upprepa varje sekund. Detta konfigurerbara alternativ stöder decimaler.", + "key_rightalt_to_key_win": "Karta Höger Alt nyckel till Windows-tangenten", + "key_rightalt_to_key_win_desc": "Det kan vara möjligt att du inte kan skicka Windows-tangenten från Moonlight direkt. I dessa fall kan det vara användbart att göra Sunshine tror att rätt Alt nyckel är Windows-tangenten", + "keyboard": "Aktivera tangentbordsinmatning", + "keyboard_desc": "Tillåter gäster att styra värdsystemet med tangentbordet", + "lan_encryption_mode": "LAN-krypteringsläge", + "lan_encryption_mode_1": "Aktiverad för stödda klienter", + "lan_encryption_mode_2": "Krävs för alla kunder", + "lan_encryption_mode_desc": "Detta avgör när kryptering kommer att användas vid strömning över ditt lokala nätverk. Kryptering kan minska strömningsprestanda, särskilt på mindre kraftfulla värdar och klienter.", + "locale": "Lokalt", + "locale_desc": "Lokalen som används för Sunshines användargränssnitt.", + "log_level": "Loggnivå", "log_level_0": "Verbose", "log_level_1": "Debug", - "log_level_2": "Info", - "log_level_3": "Warning", - "log_level_4": "Error", + "log_level_2": "Information", + "log_level_3": "Varning", + "log_level_4": "Fel", "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", + "log_level_6": "Ingen", + "log_level_desc": "Minsta loggnivå utskriven till standard ut", + "log_path": "Sökväg till loggfil", + "log_path_desc": "Filen där de aktuella loggarna av Sunshine lagras.", + "min_threads": "Minsta antal CPU-trådar", + "min_threads_desc": "Öka värdet något minskar kodningseffektivitet, men avvägningen är oftast värt det för att få användning av fler CPU-kärnor för kodning. Det ideala värdet är det lägsta värdet som tillförlitligt kan koda på dina önskade strömningsinställningar på din hårdvara.", + "misc": "Diverse alternativ", + "motion_as_ds4": "Emulera en DS4 gamepad om klienten gamepad rapporterar rörelsesensorer finns", + "motion_as_ds4_desc": "Om inaktiverad kommer rörelsesensorer inte att beaktas under val av speltyp.", + "mouse": "Aktivera musinmatning", + "mouse_desc": "Tillåter gäster att styra värdsystemet med musen", + "native_pen_touch": "Stöd för infödda pen/tryck", + "native_pen_touch_desc": "När aktiverad, kommer Sunshine att passera genom infödda penn/touch händelser från Moonlight klienter. Detta kan vara användbart för att inaktivera för äldre applikationer utan inbyggt penn/touch stöd.", + "nvenc_h264_cavlc": "Föredrar CAVLC över CABAC i H.264", + "nvenc_h264_cavlc_desc": "Enklare form av entropi-kodning. CAVLC behöver cirka 10% mer bithastighet för samma kvalitet. Endast relevant för riktigt gamla avkodningsenheter.", + "nvenc_latency_over_power": "Föredrar lägre kodningsfördröjning över energibesparing", + "nvenc_latency_over_power_desc": "Sunshine begär maximal GPU klockfrekvens medan strömning för att minska kodning latens. Inaktivera det rekommenderas inte eftersom detta kan leda till avsevärt ökad kodning latens.", + "nvenc_opengl_vulkan_on_dxgi": "Presentera OpenGL/Vulkan ovanpå DXGI", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine kan inte fånga fullskärm OpenGL och Vulkan program med full bildhastighet såvida de inte presenterar ovanpå DXGI. Detta är hela systemet inställning som återförs på solsken program utgången.", + "nvenc_preset": "Prestanda förinställning", + "nvenc_preset_1": "(snabb, standard)", + "nvenc_preset_7": "(långsammare)", + "nvenc_preset_desc": "Högre tal förbättrar kompression (kvalitet vid given bitrate) på bekostnad av ökad kodning latens. Rekommenderas att ändras endast när begränsad av nätverk eller avkodare, annars liknande effekt kan åstadkommas genom att öka bithastigheten.", + "nvenc_realtime_hags": "Använd realtid prioritet i hårdvaruaccelererad gpu-schemaläggning", + "nvenc_realtime_hags_desc": "För närvarande NVIDIA-drivrutiner kan frysa i kodare när HAGS är aktiverad, realtid prioritet används och VRAM-användning är nära maximal. Inaktivering av det här alternativet sänker prioriteringen till höga, sidostäder frysningen på bekostnad av reducerad fångstprestanda när GPU är kraftigt belastad.", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", + "nvenc_spatial_aq_desc": "Tilldela högre QP-värden till platta regioner i videon. Rekommenderas att aktivera vid strömning med lägre bithastigheter.", + "nvenc_spatial_aq_disabled": "Inaktiverad (snabbare, standard)", + "nvenc_spatial_aq_enabled": "Aktiverad (långsammare)", + "nvenc_twopass": "Tvåpass-läge", + "nvenc_twopass_desc": "Lägger till preliminär kodning pass. Detta gör det möjligt att upptäcka fler rörelsevektorer, bättre distribuera bithastighet över ramen och mer strikt följa bitrate gränser. Inaktivera det rekommenderas inte eftersom detta kan leda till enstaka bithastighet overshoot och efterföljande paketförlust.", + "nvenc_twopass_disabled": "Inaktiverad (snabbast rekommenderas inte)", + "nvenc_twopass_full_res": "Full upplösning (långsammare)", + "nvenc_twopass_quarter_res": "Kvartalsupplösning (snabbare, standard)", + "nvenc_vbv_increase": "Ensidig VBV/HRD-procentökning", + "nvenc_vbv_increase_desc": "Som standard solsken använder en enda ram VBV/HRD, vilket innebär att alla kodade video ramstorlek inte förväntas överstiga begärda bithastighet dividerat med begärda bildhastighet. Avslappning av denna begränsning kan vara fördelaktigt och fungera som låg latens variabel bitrate, men kan också leda till paketförlust om nätverket inte har buffertheadroom för att hantera bitrate spikar. Maximalt accepterat värde är 400, vilket motsvarar 5x ökad kodad video ram övre storleksgräns.", + "origin_web_ui_allowed": "Ursprung webbgränssnitt tillåtet", + "origin_web_ui_allowed_desc": "Ursprunget till fjärradressen som inte nekas åtkomst till Web UI", + "origin_web_ui_allowed_lan": "Endast de i LAN kan komma åt Web UI", + "origin_web_ui_allowed_pc": "Endast localhost kan komma åt webbgränssnitt", + "origin_web_ui_allowed_wan": "Vem som helst kan komma åt webbgränssnitt", + "output_name_desc_linux": "Under solsken start, bör du se listan över upptäckta skärmar. Du måste använda värdet innan kolon i utgången. t.ex.:", + "output_name_desc_win": "Ange manuellt en display som ska användas för att fånga. Om den avaktiveras fångas den primära displayen. Obs: Om du angav en GPU ovan måste denna display vara ansluten till den GPU. De lämpliga värdena kan hittas med följande kommando:", + "output_name_linux": "Övervaka nummer", + "output_name_win": "Utdatanamn", "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", + "ping_timeout_desc": "Hur lång tid att vänta i millisekunder för data från månsken innan du stänger av strömmen", + "pkey": "Privat nyckel", + "pkey_desc": "Den privata nyckeln som används för webb UI och Moonlight klient parning. För bästa kompatibilitet bör detta vara en RSA-2048 privat nyckel.", "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", + "port_alert_1": "Solsken kan inte använda portar under 1024!", + "port_alert_2": "Hamnar över 65535 är inte tillgängliga!", + "port_desc": "Ställ in familjen av hamnar som används av Sunshine", + "port_http_port_note": "Använd denna port för att ansluta med Moonlight.", + "port_note": "Anteckning", "port_port": "Port", "port_protocol": "Protocol", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", + "port_warning": "Exponera Web UI till internet är en säkerhetsrisk! Fortsätt på egen risk!", "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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)", + "qp": "Kvantifieringsparameter", + "qp_desc": "Vissa enheter kanske inte stöder konstant Bit Rate. För dessa enheter, QP används istället. Högre värde innebär mer komprimering, men mindre kvalitet.", + "qsv_coder": "QuickSync kodare (H264)", "qsv_preset": "QuickSync Preset", - "qsv_preset_fast": "faster (lower quality)", - "qsv_preset_faster": "fastest (lowest quality)", - "qsv_preset_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", + "qsv_preset_fast": "snabbare (lägre kvalitet)", + "qsv_preset_faster": "snabbaste (lägsta kvalitet)", + "qsv_preset_medium": "medium (standard)", + "qsv_preset_slow": "långsam (god kvalitet)", + "qsv_preset_slower": "långsammare (bättre kvalitet)", + "qsv_preset_slowest": "långsammaste (bästa kvalitet)", + "qsv_preset_veryfast": "snabbaste (lägsta kvalitet)", + "qsv_slow_hevc": "Tillåt långsam HEVC-kodning", + "qsv_slow_hevc_desc": "Detta kan aktivera HEVC-kodning på äldre Intel GPU:er, på bekostnad av högre GPU-användning och sämre prestanda.", + "res_fps_desc": "Visningslägen annonseras av Sunshine. Vissa versioner av Moonlight, såsom Moonlight-nx (Switch), förlitar sig på dessa listor för att se till att de begärda resolutionerna och fps stöds. Den här inställningen ändrar inte hur skärmströmmen skickas till Moonlight.", + "resolutions": "Annonserade resolutioner", + "restart_note": "Solsken börjar om för att tillämpa förändringar.", + "sunshine_name": "Solsken Namn", + "sunshine_name_desc": "Namnet som visas av Moonlight. Om det inte anges används datorns värdnamn", + "sw_preset": "SW förinställningar", + "sw_preset_desc": "Optimera avvägningen mellan kodningshastighet (kodade bildrutor per sekund) och komprimeringseffektivitet (kvalitet per bit i bitström). Standard är superfast.", + "sw_preset_fast": "snabb", + "sw_preset_faster": "snabbare", "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", - "sw_preset_ultrafast": "ultrafast", + "sw_preset_slow": "långsam", + "sw_preset_slower": "långsammare", + "sw_preset_superfast": "superfast (standard)", + "sw_preset_ultrafast": "ultrasnabb", "sw_preset_veryfast": "veryfast", "sw_preset_veryslow": "veryslow", "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", - "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", - "virtual_sink_placeholder": "Steam Streaming Speakers", + "sw_tune_animation": "animation – bra för karikatyrer; använder högre deblockering och fler referensramar", + "sw_tune_desc": "Tuning alternativ, som tillämpas efter förinställningen. Standardvärdet är noll.", + "sw_tune_fastdecode": "fastdecode – tillåter snabbare avkodning genom att inaktivera vissa filter", + "sw_tune_film": "film – användning för högkvalitativt filminnehåll; minskar avblockering", + "sw_tune_grain": "korn - bevarar kornstrukturen i gammalt, kornigt filmmaterial", + "sw_tune_stillimage": "stillimage – bra för bildspel liknande innehåll", + "sw_tune_zerolatency": "zerolatency – bra för snabb kodning och strömning med låg fördröjning (standard)", + "touchpad_as_ds4": "Emulera en DS4 gamepad om klienten gamepad rapporterar en pekplatta är närvarande", + "touchpad_as_ds4_desc": "Om inaktiverad, kommer närvaro av pekplatta inte att beaktas under val av speltyp.", + "upnp": "UPPNP", + "upnp_desc": "Konfigurera portvidarebefordran automatiskt för streaming över Internet", + "virtual_sink": "Virtuell sink", + "virtual_sink_desc": "Ange manuellt en virtuell ljudenhet som ska användas. Om enheten inte är inställd väljs enheten automatiskt. Vi rekommenderar starkt att lämna detta fält tomt för att använda automatiskt val av enhet!", + "virtual_sink_placeholder": "Steam-strömmande högtalare", "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", - "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "vt_realtime": "VideoToolbox Kodning i realtid", + "vt_software": "VideoToolbox programvara kodning", + "vt_software_allowed": "Tillåten", + "vt_software_forced": "Tvingad", + "wan_encryption_mode": "WAN krypteringsläge", + "wan_encryption_mode_1": "Aktiverad för stödda klienter (standard)", + "wan_encryption_mode_2": "Krävs för alla kunder", + "wan_encryption_mode_desc": "Detta avgör när kryptering kommer att användas vid strömning över Internet. Kryptering kan minska strömningsprestanda, särskilt på mindre kraftfulla värdar och klienter." }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", - "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hello, Sunshine!" + "description": "Solsken är en själv-värd spel ström värd för Moonlight.", + "download": "Hämta", + "loading_latest": "Laddar senaste utgåvan...", + "new_nightly": "En ny Nightly version är tillgänglig!", + "new_stable": "En ny stabil version är tillgänglig!", + "startup_errors": "Uppmärksamhet! Solsken upptäckte dessa fel vid uppstart. Vi STARKLIG KUNSKAP fixar dem innan vi streamar.", + "version_dirty": "Tack för att du hjälper till att göra Sunshine till en bättre programvara!", + "version_latest": "Du kör den senaste versionen av Sunshine", + "welcome": "Hej, Sunshine!" }, "navbar": { - "applications": "Applications", - "configuration": "Configuration", - "home": "Home", - "password": "Change Password", - "pin": "Pin", - "troubleshoot": "Troubleshooting" + "applications": "Applikationer", + "configuration": "Konfiguration", + "home": "Hem", + "password": "Ändra lösenord", + "pin": "Fäst", + "troubleshoot": "Felsökning" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "Bekräfta lösenord", + "current_creds": "Nuvarande uppgifter", + "new_creds": "Nya inloggningsuppgifter", + "new_username_desc": "Om det inte anges kommer användarnamnet inte att ändras", + "password_change": "Ändra lösenord", + "success_msg": "Lösenordet har ändrats! Den här sidan kommer att laddas om snart, din webbläsare kommer att be dig om de nya uppgifterna." }, "pin": { + "pair_failure": "Parkoppling misslyckades: Kontrollera om PIN-koden är korrekt skriven", + "pair_success": "Klart! Kontrollera Moonlight för att fortsätta", "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "send": "Skicka", + "warning_msg": "Se till att du har tillgång till klienten du parar ihop med. Denna programvara kan ge total kontroll till din dator, så var försiktig!" }, "resource_card": { "github_discussions": "GitHub Discussions", - "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "legal": "Juridisk", + "legal_desc": "Genom att fortsätta använda denna programvara godkänner du villkoren i följande dokument.", + "license": "Licens", + "lizardbyte_website": "Webbplats LizardByte", + "resources": "Resurser", + "resources_desc": "Resurser för Sunshine!", + "third_party_notice": "Meddelande från tredje part" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", - "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "force_close": "Tvinga stängning", + "force_close_desc": "Om Moonlight klagar på att en app för närvarande är igång måste appen stängas åtgärdas.", + "force_close_error": "Fel vid stängning av program", + "force_close_success": "Ansökan Stängt Framgång!", + "logs": "Loggar", + "logs_desc": "Se stockarna som laddats upp av Sunshine", + "logs_find": "Sök...", + "restart_sunshine": "Starta om solsken", + "restart_sunshine_desc": "Om solsken inte fungerar som den ska, kan du prova att starta om den. Detta avslutar alla pågående sessioner.", + "restart_sunshine_success": "Solsken startar om", + "troubleshooting": "Felsökning", + "unpair_all": "Ta bort alla", + "unpair_all_desc": "Ta bort alla dina parkopplade enheter", + "unpair_all_error": "Fel vid avkoppling", + "unpair_all_success": "Opara ihop framgångsrikt!" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", - "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "confirm_password": "Bekräfta lösenord", + "create_creds": "Innan du kommer igång behöver du göra ett nytt användarnamn och lösenord för att komma åt webbgränssnittet.", + "create_creds_alert": "Användaruppgifterna nedan behövs för att komma åt Sunshines webbgränssnitt. Håll dem säkra, eftersom du aldrig kommer att se dem igen!", + "greeting": "Välkommen till Sunshine!", + "login": "Inloggning", + "welcome_success": "Denna sida kommer att laddas om snart, din webbläsare kommer att be dig om nya uppgifter" } } 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 8d1be14d2af..fac14e2b593 100644 --- a/src_assets/common/assets/web/public/assets/locale/zh.json +++ b/src_assets/common/assets/web/public/assets/locale/zh.json @@ -1,376 +1,380 @@ { "_common": { - "apply": "Apply", - "auto": "Automatic", - "autodetect": "Autodetect (recommended)", - "cancel": "Cancel", - "disabled": "Disabled", - "disabled_def": "Disabled (default)", - "do_cmd": "Do Command", - "elevated": "Elevated", - "enabled": "Enabled", - "enabled_def": "Enabled (default)", - "error": "Error!", - "note": "Note:", - "password": "Password", - "run_as": "Run as Admin", - "save": "Save", - "see_more": "See More", - "success": "Success!", - "undo_cmd": "Undo Command", - "username": "Username", - "warning": "Warning!" + "apply": "应用", + "auto": "自动", + "autodetect": "自动检测(推荐)", + "cancel": "取消", + "disabled": "禁用", + "disabled_def": "禁用(默认)", + "do_cmd": "执行命令", + "elevated": "权限提升", + "enabled": "启用", + "enabled_def": "启用(默认)", + "error": "错误!", + "note": "注:", + "password": "密码", + "run_as": "以管理员身份运行", + "save": "保存", + "see_more": "查看更多", + "success": "成功!", + "undo_cmd": "撤销命令", + "username": "用户名", + "warning": "警告!" }, "apps": { - "actions": "Actions", - "add_cmds": "Add Commands", - "add_new": "Add New", - "app_name": "Application Name", - "app_name_desc": "Application Name, as shown on Moonlight", - "applications_desc": "Applications are refreshed only when Client is restarted", - "applications_title": "Applications", - "auto_detach": "Continue streaming if the application exits quickly", - "auto_detach_desc": "This will attempt to automatically detect launcher-type apps that close quickly after launching another program or instance of themselves. When a launcher-type app is detected, it is treated as a detached app.", - "cmd": "Command", - "cmd_desc": "The main application to start. If blank, no application will be started.", - "cmd_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "cmd_prep_desc": "A list of commands to be run before/after this application. If any of the prep-commands fail, starting the application is aborted.", - "cmd_prep_name": "Command Preparations", - "covers_found": "Covers Found", - "delete": "Delete", - "detached_cmds": "Detached Commands", - "detached_cmds_add": "Add Detached Command", - "detached_cmds_desc": "A list of commands to be run in the background.", - "detached_cmds_note": "If the path to the command executable contains spaces, you must enclose it in quotes.", - "edit": "Edit", - "env_app_id": "App ID", - "env_app_name": "App Name", - "env_client_audio_config": "The Audio Configuration requested by the client (2.0/5.1/7.1)", - "env_client_enable_sops": "The client has requested the option to optimize the game for optimal streaming (true/false)", - "env_client_fps": "The FPS requested by the client (int)", - "env_client_gcmap": "The requested gamepad mask, in a bitset/bitfield format (int)", - "env_client_hdr": "HDR is enabled by the client (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_width": "The Width requested by the client (int)", - "env_displayplacer_example": "Example - displayplacer for Resolution Automation:", - "env_qres_example": "Example - QRes for Resolution Automation:", - "env_qres_path": "qres path", - "env_var_name": "Var Name", - "env_vars_about": "About Environment Variables", - "env_vars_desc": "All commands get these environment variables by default:", - "env_xrandr_example": "Example - Xrandr for Resolution Automation:", - "exit_timeout": "Exit Timeout", - "exit_timeout_desc": "Number of seconds to wait for all app processes to gracefully exit when requested to quit. If unset, the default is to wait up to 5 seconds. If set to zero or a negative value, the app will be immediately terminated.", - "find_cover": "Find Cover", - "global_prep_desc": "Enable/Disable the execution of Global Prep Commands for this application.", - "global_prep_name": "Global Prep Commands", - "image": "Image", - "image_desc": "Application icon/picture/image path that will be sent to client. Image must be a PNG file. If not set, Sunshine will send default box image.", - "loading": "Loading...", - "name": "Name", - "output_desc": "The file where the output of the command is stored, if it is not specified, the output is ignored", - "output_name": "Output", - "run_as_desc": "This can be necessary for some applications that require administrator permissions to run properly.", - "wait_all": "Continue streaming until all app processes exit", - "wait_all_desc": "This will continue streaming until all processes started by the app have terminated. When unchecked, streaming will stop when the initial app process exits, even if other app processes are still running.", - "working_dir": "Working Directory", - "working_dir_desc": "The working directory that should be passed to the process. For example, some applications use the working directory to search for configuration files. If not set, Sunshine will default to the parent directory of the command" + "actions": "操作", + "add_cmds": "添加命令", + "add_new": "添加新应用", + "app_name": "应用名称", + "app_name_desc": "在 Moonlight 显示的应用名称", + "applications_desc": "只有重启客户端时应用才会被刷新", + "applications_title": "应用", + "auto_detach": "如果应用程序快速关闭,继续串流", + "auto_detach_desc": "这将尝试自动检测启动器类型的应用程序,这些应用程序会在启动另一个程序或自身实例后迅速关闭。当检测到启动器类型的应用程序时,它将被视为独立的应用程序。", + "cmd": "命令", + "cmd_desc": "要启动的主程序。如果为空,则不会启动任何应用程序。", + "cmd_note": "如果命令中可执行文件的路径包含空格,则必须用引号括起来。", + "cmd_prep_desc": "此应用运行前/后要运行的命令列表。如果任何前置命令失败,应用的启动过程将被中止。", + "cmd_prep_name": "命令准备工作", + "covers_found": "找到封面", + "delete": "删除", + "detached_cmds": "独立命令", + "detached_cmds_add": "添加独立命令", + "detached_cmds_desc": "要在后台运行的命令列表。", + "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_gcmap": "客户端请求的游戏手柄掩码,采用 bitset/bitfield 格式 (int)", + "env_client_hdr": "客户端已启用 HDR (true/false)", + "env_client_height": "客户端请求的高度 (int)", + "env_client_host_audio": "客户端请求在主机播放声音 (true/false)", + "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_xrandr_example": "示例 - 使用 Xrandr 自动更改分辨率:", + "exit_timeout": "退出超时", + "exit_timeout_desc": "请求退出时,等待所有应用进程正常关闭的秒数。 如果未设置,默认等待5秒钟。如果设置为零或负值,应用程序将立即终止。", + "find_cover": "查找封面", + "global_prep_desc": "启用/禁用此应用程序的全局预处理命令。", + "global_prep_name": "全局预处理命令", + "image": "图片", + "image_desc": "发送到客户端的应用程序图标/图片/图像的路径。图片必须是 PNG 文件。如果未设置,Sunshine 将发送默认图片。", + "loading": "加载中...", + "name": "名称", + "output_desc": "存储命令输出的文件,如果未指定,输出将被忽略", + "output_name": "输出", + "run_as_desc": "这可能是某些需要管理员权限才能正常运行的应用程序所必需的。", + "wait_all": "继续串流直到所有应用进程终止", + "wait_all_desc": "这将继续串流直到应用程序启动的所有进程终止。 当未选中时,串流将在初始应用进程终止时停止,即使其他应用进程仍在运行。", + "working_dir": "工作目录", + "working_dir_desc": "应传递给进程的工作目录。例如,某些应用程序使用工作目录搜索配置文件。如果不设置,Sunshine 将默认使用命令的父目录" }, "config": { - "adapter_name": "Adapter Name", - "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", - "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", - "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", - "add": "Add", - "address_family": "Address Family", + "adapter_name": "显示适配器名称", + "adapter_name_desc_linux_1": "手动指定用于捕获的 GPU 。", + "adapter_name_desc_linux_2": "找到所有能够使用 VAAPI 的设备", + "adapter_name_desc_linux_3": "用上面的设备替换``renderD129``,列出设备的名称和功能。要获得 Sunshine 的支持,设备至少需要具备以下功能:", + "adapter_name_desc_win": "手动指定用于捕获的 GPU 。如果未设置,GPU 将被自动选择。 我们强烈建议将此字段留空以使用自动的 GPU 选择!注意:此GPU 必须连接并开启显示器。 可以使用以下命令找到适当的值:", + "adapter_name_placeholder_win": "Radeon RX 580系列", + "add": "添加", + "address_family": "IP 地址族", "address_family_both": "IPv4+IPv6", - "address_family_desc": "Set the address family used by Sunshine", - "address_family_ipv4": "IPv4 only", - "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_preanalysis": "AMF Preanalysis", - "amd_quality": "AMF Quality", - "amd_quality_balanced": "balanced -- balanced (default)", - "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_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_lowlatency": "lowlatency - low latency (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)", - "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:", - "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "address_family_desc": "设置 Sunshine 使用的 IP 地址族", + "address_family_ipv4": "仅IPv4", + "always_send_scancodes": "总是发送键盘扫描码", + "always_send_scancodes_desc": "发送键盘扫描码可增强与游戏和应用程序的兼容性,但可能会导致某些不使用美式英语键盘布局的客户端键盘输入不正确。如果键盘输入在某些应用程序中完全不工作,请启用。如果客户端上的按键在主机上产生错误输入,则禁用。", + "amd_coder": "AMF 编码器 (H264)", + "amd_enforce_hrd": "AMF 推测参考解码器 (HRD)", + "amd_preanalysis": "AMF 预分析", + "amd_quality": "AMF 质量", + "amd_quality_balanced": "balanced -- 平衡(默认)", + "amd_quality_quality": "quality -- 偏好质量", + "amd_quality_speed": "speed -- 偏好速度", + "amd_rc": "AMF 速率控制", + "amd_rc_cbr": "cbr -- 恒定比特率(默认)", + "amd_rc_cqp": "cqp -- 恒定 QP 模式", + "amd_rc_vbr_latency": "vbr_latency -- 受延迟限制的可变比特率", + "amd_rc_vbr_peak": "vbr_peak -- 受峰值限制的可变比特率", + "amd_usage": "AMF 使用", + "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)", + "apply_note": "点击“应用”重启 Sunshine 并应用更改。这将终止任何正在运行的会话。", + "audio_sink": "音频输出设备", + "audio_sink_desc_linux": "手动指定需要抓取的音频输出设备。如果您没有指定此变量,PulseAudio 将选择默认监测设备。 您可以使用以下任何命令找到音频输出设备的名称:", + "audio_sink_desc_macos": "手动指定需要抓取的音频输出设备。由于系统限制,Sunshine 在 macOS 上只能访问麦克风。 使用 Soundflow 或 BlackHole 来串流系统音频。", + "audio_sink_desc_win": "手动指定需要抓取的音频输出设备。如果未设置,则会自动选择设备。 我们强烈建议将此字段留空,以便使用自动选择设备功能! 如果您有多个具有相同名称的音频设备,您可以使用以下命令获取设备ID:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", - "av1_mode": "AV1 Support", - "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", - "av1_mode_1": "Sunshine will not advertise support for AV1", - "av1_mode_2": "Sunshine will advertise support for AV1 Main 8-bit profile", - "av1_mode_3": "Sunshine will advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles", - "av1_mode_desc": "Allows the client to request AV1 Main 8-bit or 10-bit video streams. AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "back_button_timeout": "Home/Guide Button Emulation Timeout", - "back_button_timeout_desc": "If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. If set to a value < 0 (default), holding the Back/Select button will not emulate the Home/Guide button.", - "capture": "Force a Specific Capture Method", - "capture_desc": "On automatic mode Sunshine will use the first one that works. NvFBC requires patched nvidia drivers.", - "cert": "Certificate", - "cert_desc": "The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key.", - "channels": "Maximum Connected Clients", - "channels_desc_1": "Sunshine can allow a single streaming session to be shared with multiple clients simultaneously.", - "channels_desc_2": "Some hardware encoders may have limitations that reduce performance with multiple streams.", - "coder_cabac": "cabac -- context adaptive binary arithmetic coding - higher quality", - "coder_cavlc": "cavlc -- context adaptive variable-length coding - faster decode", - "configuration": "Configuration", - "controller": "Enable Gamepad Input", - "controller_desc": "Allows guests to control the host system with a gamepad / controller", - "credentials_file": "Credentials File", - "credentials_file_desc": "Store Username/Password separately from Sunshine's state file.", - "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", - "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", - "encoder": "Force a Specific Encoder", - "encoder_desc": "Force a specific encoder, otherwise Sunshine will select the best available option. Note: If you specify a hardware encoder on Windows, it must match the GPU where the display is connected.", - "encoder_software": "Software", - "external_ip": "External IP", - "external_ip_desc": "If no external IP address is given, Sunshine will automatically detect external IP", - "fec_percentage": "FEC Percentage", - "fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.", - "ffmpeg_auto": "auto -- let ffmpeg decide (default)", - "file_apps": "Apps File", - "file_apps_desc": "The file where current apps of Sunshine are stored.", - "file_state": "State File", - "file_state_desc": "The file where current state of Sunshine is stored", - "fps": "Advertised FPS", - "gamepad": "Emulated Gamepad Type", - "gamepad_auto": "Automatic selection options", - "gamepad_desc": "Choose which type of gamepad to emulate on the host", + "audio_sink_placeholder_win": "扬声器 (High Definition Audio Device)", + "av1_mode": "AV1 支持", + "av1_mode_0": "Sunshine 将基于编码器能力通告对 AV1 的支持(推荐)", + "av1_mode_1": "Sunshine 将不会通告对 AV1 的支持", + "av1_mode_2": "Sunshine 将通告 AV1 Main 8-bit 配置支持", + "av1_mode_3": "Sunshine 将通告 AV1 Main 8-bit 和 10-bit (HDR) 配置支持", + "av1_mode_desc": "允许客户端请求 AV1 Main 8-bit 或 10-bit 视频流。AV1 的编码对 CPU 的要求较高,因此在使用软件编码时,启用此功能可能会降低性能。", + "back_button_timeout": "主页/导航按钮模拟超时", + "back_button_timeout_desc": "如果按住“返回/选择”按钮达指定的毫秒数,将模拟按下“主页/导航”按钮。如果设置值小于 0(默认值),则按住“返回/选择”按钮不会模拟按下“主页/导航”按钮。", + "capture": "强制特定捕获方法", + "capture_desc": "在自动模式下阳光将使用第一个工作模式。NvFBC 需要修补的nvidia驱动器。", + "cert": "证书", + "cert_desc": "用于 Web UI 和 Moonlilght 客户端配对的证书。为了最佳兼容性,这应该是一个 RSA-2048 公钥。", + "channels": "最多同时连接客户端数", + "channels_desc_1": "Sunshine 允许多个客户端同时共享一个串流会话。", + "channels_desc_2": "某些硬件编码器可能存在限制,在编码多条流时会降低性能。", + "coder_cabac": "cabac -- 上下文自适应二进制算术编码- 较高质量", + "coder_cavlc": "cavlc -- 上下文适应变量编码 - 更快解码", + "configuration": "配置", + "controller": "启用游戏手柄输入", + "controller_desc": "允许客户端使用游戏手柄控制主机系统", + "credentials_file": "凭据文件", + "credentials_file_desc": "将用户名/密码与 Sunshine 的状态文件分开保存。", + "ds4_back_as_touchpad_click": "映射回/选择触摸板点击", + "ds4_back_as_touchpad_click_desc": "强制使用 DS4 仿真时,地图返回/选择触摸板点击", + "encoder": "强制指定一个特定编码器", + "encoder_desc": "强制指定一个特定编码器,否则 Sunshine 将选择最佳可用选项。 注意:如果您在 Windows 上指定了硬件编码器,它必须匹配连接显示器的 GPU。", + "encoder_software": "软件编码", + "external_ip": "外部 IP", + "external_ip_desc": "如果没有指定外部 IP 地址,Sunshine 将自动检测外部 IP", + "fec_percentage": "FEC 百分比", + "fec_percentage_desc": "每个视频帧中的错误纠正数据包百分比。较高的值可纠正更多的网络数据包丢失,但代价是增加带宽使用量。", + "ffmpeg_auto": "auto -- 由 ffmpeg 决定(默认)", + "file_apps": "应用程序文件", + "file_apps_desc": "Sunshine 保存应用程序配置的文件。", + "file_state": "状态文件", + "file_state_desc": "Sunshine 保存当前状态的文件", + "fps": "通告 FPS", + "gamepad": "模拟游戏手柄类型", + "gamepad_auto": "自动选择选项", + "gamepad_desc": "选择要在主机上模拟的游戏手柄类型", "gamepad_ds4": "DS4 (PS4)", - "gamepad_manual": "Manual DS4 options", + "gamepad_manual": "DS4 手柄手动配置选项", "gamepad_x360": "X360 (Xbox 360)", - "global_prep_cmd": "Command Preparations", - "global_prep_cmd_desc": "Configure a list of commands to be executed before or after running any application. If any of the specified preparation commands fail, the application launch process will be aborted.", - "hevc_mode": "HEVC Support", - "hevc_mode_0": "Sunshine will advertise support for HEVC based on encoder capabilities (recommended)", - "hevc_mode_1": "Sunshine will not advertise support for HEVC", - "hevc_mode_2": "Sunshine will advertise support for HEVC Main profile", - "hevc_mode_3": "Sunshine will advertise support for HEVC Main and Main10 (HDR) profiles", - "hevc_mode_desc": "Allows the client to request HEVC Main or HEVC Main10 video streams. HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.", - "high_resolution_scrolling": "High Resolution Scrolling Support", - "high_resolution_scrolling_desc": "When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients. This can be useful to disable for older applications that scroll too fast with high resolution scroll events.", - "install_steam_audio_drivers": "Install Steam Audio Drivers", - "install_steam_audio_drivers_desc": "If Steam is installed, this will automatically install the Steam Streaming Speakers driver to support 5.1/7.1 surround sound and muting host audio.", - "key_repeat_delay": "Key Repeat Delay", - "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", - "key_repeat_frequency": "Key Repeat Frequency", - "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", - "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", - "keyboard": "Enable Keyboard Input", - "keyboard_desc": "Allows guests to control the host system with the keyboard", - "lan_encryption_mode": "LAN Encryption Mode", - "lan_encryption_mode_1": "Enabled for supported clients", - "lan_encryption_mode_2": "Required for all clients", - "lan_encryption_mode_desc": "This determines when encryption will be used when streaming over your local network. Encryption can reduce streaming performance, particularly on less powerful hosts and clients.", - "locale": "Locale", - "locale_desc": "The locale used for Sunshine's user interface.", - "log_level": "Log Level", - "log_level_0": "Verbose", - "log_level_1": "Debug", - "log_level_2": "Info", - "log_level_3": "Warning", - "log_level_4": "Error", - "log_level_5": "Fatal", - "log_level_6": "None", - "log_level_desc": "The minimum log level printed to standard out", - "log_path": "Logfile Path", - "log_path_desc": "The file where the current logs of Sunshine are stored.", - "min_threads": "Minimum CPU Thread Count", - "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", - "misc": "Miscellaneous options", - "motion_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports motion sensors are present", - "motion_as_ds4_desc": "If disabled, motion sensors will not be taken into account during gamepad type selection.", - "mouse": "Enable Mouse Input", - "mouse_desc": "Allows guests to control the host system with the mouse", - "native_pen_touch": "Native Pen/Touch Support", - "native_pen_touch_desc": "When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. This can be useful to disable for older applications without native pen/touch support.", - "nvenc_h264_cavlc": "Prefer CAVLC over CABAC in H.264", - "nvenc_h264_cavlc_desc": "Simpler form of entropy coding. CAVLC needs around 10% more bitrate for same quality. Only relevant for really old decoding devices.", - "nvenc_latency_over_power": "Prefer lower encoding latency over power savings", - "nvenc_latency_over_power_desc": "Sunshine requests maximum GPU clock speed while streaming to reduce encoding latency. Disabling it is not recommended since this can lead to significantly increased encoding latency.", - "nvenc_opengl_vulkan_on_dxgi": "Present OpenGL/Vulkan on top of DXGI", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. This is system-wide setting that is reverted on sunshine program exit.", - "nvenc_preset": "Performance preset", - "nvenc_preset_1": "(fastest, default)", - "nvenc_preset_7": "(slowest)", - "nvenc_preset_desc": "Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate.", - "nvenc_realtime_hags": "Use realtime priority in hardware accelerated gpu scheduling", - "nvenc_realtime_hags_desc": "Currently NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded.", + "global_prep_cmd": "命令准备工作", + "global_prep_cmd_desc": "任何应用运行前/后要运行的命令列表。如果任何前置命令失败,应用的启动过程将被中止。", + "hevc_mode": "HEVC 支持", + "hevc_mode_0": "Sunshine 将根据编码器能力通告对 HEVC 的支持(推荐)", + "hevc_mode_1": "Sunshine 将不会通告对 HEVC 的支持", + "hevc_mode_2": "Sunshine 将通告 HEVC Main 配置支持", + "hevc_mode_3": "Sunshine 将通告 HEVC Main 和 Main10 (HDR) 配置支持", + "hevc_mode_desc": "允许客户端请求 HEVC Main 或 HEVC Main10 视频流。HEVC 的编码对 CPU 的要求较高,因此在使用软件编码时,启用此功能可能会降低性能。", + "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 环绕声和主机音频静音。", + "key_repeat_delay": "按键重复延迟", + "key_repeat_delay_desc": "控制按键重复的速度。重复按键前的初始延迟(毫秒)。", + "key_repeat_frequency": "按键重复频率", + "key_repeat_frequency_desc": "按键每秒重复的次数。此配置选项支持小数。", + "key_rightalt_to_key_win": "将右 Alt 键映射到 Windows 键", + "key_rightalt_to_key_win_desc": "您可能无法直接从 Moonlight 发送 Windows 键。在这种情况下,让 Sunshine 认为右 Alt 键是 Windows 键可能会很有用。", + "keyboard": "启用键盘输入", + "keyboard_desc": "允许客户端使用键盘控制主机系统", + "lan_encryption_mode": "局域网加密模式", + "lan_encryption_mode_1": "为支持的客户端启用", + "lan_encryption_mode_2": "强制所有客户端使用", + "lan_encryption_mode_desc": "这决定了在您的本地网络串流时是否加密。加密会降低串流性能,尤其是在性能较弱的主机和客户端上。", + "locale": "本地化", + "locale_desc": "用于 Sunshine 用户界面的本地化设置。", + "log_level": "日志级别", + "log_level_0": "详细 (Verbose)", + "log_level_1": "调试 (Debug)", + "log_level_2": "信息 (Info)", + "log_level_3": "警告 (Warning)", + "log_level_4": "错误 (Error)", + "log_level_5": "致命 (Fatal)", + "log_level_6": "无 (None)", + "log_level_desc": "打印到标准输出的最小日志级别", + "log_path": "日志文件路径", + "log_path_desc": "Sunshine 当前日志存储的文件。", + "min_threads": "最低 CPU 线程数", + "min_threads_desc": "提高该值会略微降低编码效率,但为了获得更多的 CPU 内核用于编码,通常是值得的。理想值是在您的硬件配置上以所需的串流设置进行可靠编码的最低值。", + "misc": "杂项选项", + "motion_as_ds4": "如果客户端报告游戏手柄存在陀螺仪,则模拟一个 DS4 游戏手柄", + "motion_as_ds4_desc": "如果禁用,则在选择游戏手柄类型时不会考虑陀螺仪的存在。", + "mouse": "启用鼠标输入", + "mouse_desc": "允许客户端使用鼠标控制主机系统", + "native_pen_touch": "原生笔/触摸支持", + "native_pen_touch_desc": "启用后,Sunshine 将透传来自 Moonlight 客户端的原生笔/触控事件。对于不支持原生笔/触控的旧版应用程序来说,禁用此功能非常有用。", + "nvenc_h264_cavlc": "在 H.264 中,偏向 CAVLC 而不是 CABAC", + "nvenc_h264_cavlc_desc": "一种更简单的熵编码形式。相同质量的情况下,CAVLC 需要大约多出 10% 的比特率。只与真正老旧的解码设备相关。", + "nvenc_latency_over_power": "倾向于较低的编码延迟而不是省电", + "nvenc_latency_over_power_desc": "Sunshine 在串流时请求最高的 GPU 核心频率,以降低编码延迟。 不建议禁用它,因为这会大大增加编码延迟。", + "nvenc_opengl_vulkan_on_dxgi": "在 DXGI 基础上呈现 OpenGL/Vulkan", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine 无法以满帧捕获全屏 OpenGL 和 Vulkan 程序,除非它们出现在 DXGI 上。这是系统范围的设置,会在 Sunshine 程序退出时恢复。", + "nvenc_preset": "性能预设", + "nvenc_preset_1": "(最快,默认)", + "nvenc_preset_7": "(最慢)", + "nvenc_preset_desc": "数字越大,压缩效果(给定比特率下的质量)越好,但代价是编码延迟增加。建议仅在受网络或解码器限制时更改,否则可通过提高比特率达到类似效果。", + "nvenc_realtime_hags": "在硬件加速 GPU 计划 (HAGS) 中使用实时优先级", + "nvenc_realtime_hags_desc": "目前,当启用 HAGS、使用实时优先级且 VRAM 利用率接近最大值时,NVIDIA 驱动程序可能会冻结编码器。禁用该选项可将优先级降至高,从而避免冻结,但代价是在 GPU 负载较高时捕捉性能会降低。", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates.", - "nvenc_spatial_aq_disabled": "Disabled (faster, default)", - "nvenc_spatial_aq_enabled": "Enabled (slower)", - "nvenc_twopass": "Two-pass mode", - "nvenc_twopass_desc": "Adds preliminary encoding pass. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss.", - "nvenc_twopass_disabled": "Disabled (fastest, not recommended)", - "nvenc_twopass_full_res": "Full resolution (slower)", - "nvenc_twopass_quarter_res": "Quarter resolution (faster, default)", - "nvenc_vbv_increase": "Single-frame VBV/HRD percentage increase", - "nvenc_vbv_increase_desc": "By default sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit.", - "origin_web_ui_allowed": "Origin Web UI Allowed", - "origin_web_ui_allowed_desc": "The origin of the remote endpoint address that is not denied access to Web UI", - "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", - "origin_web_ui_allowed_pc": "Only localhost may access Web UI", - "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", - "ping_timeout": "Ping Timeout", - "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", - "pkey": "Private Key", - "pkey_desc": "The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key.", - "port": "Port", - "port_alert_1": "Sunshine cannot use ports below 1024!", - "port_alert_2": "Ports above 65535 are not available!", - "port_desc": "Set the family of ports used by Sunshine", - "port_http_port_note": "Use this port to connect with Moonlight.", - "port_note": "Note", - "port_port": "Port", - "port_protocol": "Protocol", + "nvenc_spatial_aq_desc": "将较高的 QP 值分配给视频的平坦区域。建议在以较低的比特率进行串流时启用。", + "nvenc_spatial_aq_disabled": "禁用(更快,默认)", + "nvenc_spatial_aq_enabled": "启用(较慢)", + "nvenc_twopass": "二次编码模式", + "nvenc_twopass_desc": "添加二次编码。这样可以检测到更多的运动矢量,更好地分配整个帧的比特率,并更严格地遵守比特率限制。不建议禁用它,因为这会导致偶尔的比特率超限和随后的丢包。", + "nvenc_twopass_disabled": "禁用(最快,不推荐)", + "nvenc_twopass_full_res": "全分辨率(较慢)", + "nvenc_twopass_quarter_res": "1/4分辨率(更快,默认)", + "nvenc_vbv_increase": "单帧 VBV/HRD 百分比增加", + "nvenc_vbv_increase_desc": "默认情况下,Sunshine 使用单帧 VBV/HRD,这意味着任何编码的视频帧大小都不会超过所请求的码率除以所请求的帧速率。放宽这一限制可能会带来好处,起到低延迟可变码率的作用,但如果网络没有缓冲空间来处理码率峰值,也可能导致数据包丢失。可接受的最大值为 400,相当于编码视频帧的大小上限增加到 5 倍。", + "origin_web_ui_allowed": "允许的 Web UI 访问来源", + "origin_web_ui_allowed_desc": "未被拒绝访问 Web UI 的远端地址来源", + "origin_web_ui_allowed_lan": "仅局域网中的设备可以访问 Web UI", + "origin_web_ui_allowed_pc": "仅本地可以访问 Web UI", + "origin_web_ui_allowed_wan": "任何人都可以访问 Web UI", + "output_name_desc_linux": "在阳光启动过程中,您应该看到检测到的显示器列表。您需要在输出中的冒号之前使用该值,例如:", + "output_name_desc_win": "手动指定用于捕捉的显示器。如果未设置,则捕捉主显示屏。注意:如果在上面指定了 GPU,则该显示器必须连接到该 GPU。可以使用以下命令找到相应的值:", + "output_name_linux": "显示器编号", + "output_name_win": "输出名称", + "ping_timeout": "Ping 超时", + "ping_timeout_desc": "关闭串流前等待 Moonlight 数据的时间(以毫秒计)", + "pkey": "私钥", + "pkey_desc": "用于 Web UI 和 Moonlilght 客户端配对的私钥。为了最佳兼容性,这应该是一个 RSA-2048 私钥。", + "port": "端口", + "port_alert_1": "Sunshine 不能使用低于1024的端口!", + "port_alert_2": "超过65535的端口不可用!", + "port_desc": "设置 Sunshine 使用的端口族", + "port_http_port_note": "使用此端口连接 Moonlight 。", + "port_note": "说明", + "port_port": "端口", + "port_protocol": "协议", "port_tcp": "TCP", "port_udp": "UDP", - "port_warning": "Exposing the Web UI to the internet is a security risk! Proceed at your own risk!", + "port_warning": "暴露 Web UI 到公网存在安全风险!请自行承担风险!", "port_web_ui": "Web UI", - "qp": "Quantization Parameter", - "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_medium": "medium (default)", - "qsv_preset_slow": "slow (good quality)", - "qsv_preset_slower": "slower (better quality)", - "qsv_preset_slowest": "slowest (best quality)", - "qsv_preset_veryfast": "fastest (lowest quality)", - "qsv_slow_hevc": "Allow Slow HEVC Encoding", - "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", - "res_fps_desc": "The display modes advertised by Sunshine. Some versions of Moonlight, such as Moonlight-nx (Switch), rely on these lists to ensure that the requested resolutions and fps are supported. This setting does not change how the screen stream is sent to Moonlight.", - "resolutions": "Advertised Resolutions", - "restart_note": "Sunshine is restarting to apply changes.", - "sunshine_name": "Sunshine Name", - "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", - "sw_preset": "SW Presets", - "sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.", - "sw_preset_fast": "fast", - "sw_preset_faster": "faster", - "sw_preset_medium": "medium", - "sw_preset_slow": "slow", - "sw_preset_slower": "slower", - "sw_preset_superfast": "superfast (default)", - "sw_preset_ultrafast": "ultrafast", - "sw_preset_veryfast": "veryfast", - "sw_preset_veryslow": "veryslow", - "sw_tune": "SW Tune", - "sw_tune_animation": "animation -- good for cartoons; uses higher deblocking and more reference frames", - "sw_tune_desc": "Tuning options, which are applied after the preset. Defaults to zerolatency.", - "sw_tune_fastdecode": "fastdecode -- allows faster decoding by disabling certain filters", - "sw_tune_film": "film -- use for high quality movie content; lowers deblocking", - "sw_tune_grain": "grain -- preserves the grain structure in old, grainy film material", - "sw_tune_stillimage": "stillimage -- good for slideshow-like content", - "sw_tune_zerolatency": "zerolatency -- good for fast encoding and low-latency streaming (default)", - "touchpad_as_ds4": "Emulate a DS4 gamepad if the client gamepad reports a touchpad is present", - "touchpad_as_ds4_desc": "If disabled, touchpad presence will not be taken into account during gamepad type selection.", + "qp": "量化参数 (QP)", + "qp_desc": "某些设备可能不支持恒定码率。对于这些设备,则使用 QP 代替。数值越大,压缩率越高,但质量越差。", + "qsv_coder": "QSV 编码器 (H264)", + "qsv_preset": "QSV 编码器预设", + "qsv_preset_fast": "fast - 较快(较低质量)", + "qsv_preset_faster": "faster - 更快(更低质量)", + "qsv_preset_medium": "medium - 中等(默认)", + "qsv_preset_slow": "slow - 较慢(较高质量)", + "qsv_preset_slower": "slower - 更慢(更高质量)", + "qsv_preset_slowest": "slowest - 最慢(最高质量)", + "qsv_preset_veryfast": "veryfast - 最快 (最低质量)", + "qsv_slow_hevc": "允许较慢的 HEVC 编码", + "qsv_slow_hevc_desc": "这可以在较旧的 Intel GPU 上启用 HEVC 编码,但代价是 GPU 占用率更高,性能更差。", + "res_fps_desc": "由 Sunshine 通告的显示模式。 某些版本的 Moonlight,如 Moonlight-nx (Switch),依靠这些清单来确保支持所请求的分辨率和 fps。 此设置不会改变屏幕串流送至 Moonlight 的方式。", + "resolutions": "通告分辨率", + "restart_note": "正在重启阳光以应用更改。", + "sunshine_name": "Sunshine 主机名称", + "sunshine_name_desc": "在 Moonlight 中显示的名称。如果未指定,则使用 PC 的主机名", + "sw_preset": "软件编码预设", + "sw_preset_desc": "在编码速度和压缩效率之间权衡。默认为 superfast - 超快。", + "sw_preset_fast": "fast - 快", + "sw_preset_faster": "faster - 更快", + "sw_preset_medium": "medium - 中等", + "sw_preset_slow": "slow - 慢", + "sw_preset_slower": "slower - 更慢", + "sw_preset_superfast": "superfast - 超快(默认)", + "sw_preset_ultrafast": "ultrafast - 极快", + "sw_preset_veryfast": "veryfast - 非常快", + "sw_preset_veryslow": "veryslow - 非常慢", + "sw_tune": "软件编码调校", + "sw_tune_animation": "animation -- 适合动画片;使用更高的去块和更多的参考帧", + "sw_tune_desc": "调校选项,在预设后应用。默认值为 zerolatency。", + "sw_tune_fastdecode": "fastdecode -- 通过禁用某些过滤器来加快解码速度", + "sw_tune_film": "film -- 用于高质量的电影内容;降低去块", + "sw_tune_grain": "grain -- 保留旧的颗粒胶片材料的颗粒结构", + "sw_tune_stillimage": "stillimage -- 适用于类似幻灯片的内容", + "sw_tune_zerolatency": "zerolatency -- 适用于快速编码和低延迟串流(默认值)", + "touchpad_as_ds4": "如果客户端报告游戏手柄存在触摸板,则模拟一个 DS4 游戏手柄", + "touchpad_as_ds4_desc": "如果禁用,则在选择游戏手柄类型时不会考虑触摸板的存在。", "upnp": "UPnP", - "upnp_desc": "Automatically configure port forwarding for streaming over the Internet", - "virtual_sink": "Virtual Sink", - "virtual_sink_desc": "Manually specify a virtual audio device to use. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection!", + "upnp_desc": "为公网串流自动配置端口转发", + "virtual_sink": "虚拟音频输出设备", + "virtual_sink_desc": "手动指定要使用的虚拟音频设备。如果未设置,则会自动选择设备。我们强烈建议将此字段留空,以便使用自动设备选择!", "virtual_sink_placeholder": "Steam Streaming Speakers", - "vt_coder": "VideoToolbox Coder", - "vt_realtime": "VideoToolbox Realtime Encoding", - "vt_software": "VideoToolbox Software Encoding", - "vt_software_allowed": "Allowed", - "vt_software_forced": "Forced", - "wan_encryption_mode": "WAN Encryption Mode", - "wan_encryption_mode_1": "Enabled for supported clients (default)", - "wan_encryption_mode_2": "Required for all clients", - "wan_encryption_mode_desc": "This determines when encryption will be used when streaming over the Internet. Encryption can reduce streaming performance, particularly on less powerful hosts and clients." + "vt_coder": "VideoToolbox 编码器", + "vt_realtime": "VideoToolbox 实时编码", + "vt_software": "VideoToolbox 软件编码", + "vt_software_allowed": "允许", + "vt_software_forced": "强制", + "wan_encryption_mode": "公网加密模式", + "wan_encryption_mode_1": "为支持的客户端启用(默认)", + "wan_encryption_mode_2": "强制所有客户端使用", + "wan_encryption_mode_desc": "这决定了在公网串流时是否加密。加密会降低串流性能,尤其是在性能较弱的主机和客户端上。" }, "index": { - "description": "Sunshine is a self-hosted game stream host for Moonlight.", - "download": "Download", - "loading_latest": "Loading latest release...", - "new_nightly": "A new Nightly Version is Available!", - "new_stable": "A new Stable Version is Available!", - "startup_errors": "Attention! Sunshine detected these errors during startup. We STRONGLY RECOMMEND fixing them before streaming.", - "version_dirty": "Thank you for helping to make Sunshine a better software!", - "version_latest": "You are running the latest version of Sunshine", - "welcome": "Hello, Sunshine!" + "description": "Sunshine 是供 Moonlight 使用的自建游戏串流服务。", + "download": "下载", + "loading_latest": "正在检测最新版本...", + "new_nightly": "新的每夜版本已发布!", + "new_stable": "新的稳定版本已发布!", + "startup_errors": "请注意!Sunshine 在启动过程中检测到这些错误。我们强烈建议您在串流之前修复这些错误。", + "version_dirty": "感谢您的帮助,让 Sunshine 变得更好!", + "version_latest": "您正在运行最新版本的 Sunshine", + "welcome": "你好,Sunshine!" }, "navbar": { - "applications": "Applications", - "configuration": "Configuration", - "home": "Home", - "password": "Change Password", - "pin": "Pin", - "troubleshoot": "Troubleshooting" + "applications": "应用程序", + "configuration": "配置", + "home": "首页", + "password": "更改密码", + "pin": "PIN 码", + "troubleshoot": "故障排除" }, "password": { - "confirm_password": "Confirm Password", - "current_creds": "Current Credentials", - "new_creds": "New Credentials", - "new_username_desc": "If not specified, the username will not change", - "password_change": "Password Change", - "success_msg": "Password has been changed successfully! This page will reload soon, your browser will ask you for the new credentials." + "confirm_password": "确认密码", + "current_creds": "当前账户信息", + "new_creds": "新的账户信息", + "new_username_desc": "如果未指定,用户名将不会更改", + "password_change": "密码更改", + "success_msg": "密码已成功更改!此页面即将重新加载,您的浏览器将要求您输入新的账户信息。" }, "pin": { - "pin_pairing": "PIN Pairing", - "send": "Send", - "warning_msg": "Make sure you have access to the client you are pairing with. This software can give total control to your computer, so be careful!" + "pair_failure": "配对失败:请检查 PIN 码是否正确输入", + "pair_success": "成功!请检查 Moonlight 以继续", + "pin_pairing": "PIN 码配对", + "send": "发送", + "warning_msg": "请确保您可以掌控您正在配对的客户端。该软件可以完全控制您的计算机,请务必小心!" }, "resource_card": { - "github_discussions": "GitHub Discussions", - "legal": "Legal", - "legal_desc": "By continuing to use this software you agree to the terms and conditions in the following documents.", - "license": "License", - "lizardbyte_website": "LizardByte Website", - "resources": "Resources", - "resources_desc": "Resources for Sunshine!", - "third_party_notice": "Third Party Notice" + "github_discussions": "Github 讨论区", + "legal": "法律声明", + "legal_desc": "继续使用本软件即表示您同意以下文档中的条款和条件。", + "license": "许可协议", + "lizardbyte_website": "LizardByte 网站", + "resources": "参考资源", + "resources_desc": "Sunshine 相关资源!", + "third_party_notice": "第三方声明" }, "troubleshooting": { - "force_close": "Force Close", - "force_close_desc": "If Moonlight complains about an app currently running, force closing the app should fix the issue.", - "force_close_error": "Error while closing Application", - "force_close_success": "Application Closed Successfully!", - "logs": "Logs", - "logs_desc": "See the logs uploaded by Sunshine", - "logs_find": "Find...", - "restart_sunshine": "Restart Sunshine", - "restart_sunshine_desc": "If Sunshine isn't working properly, you can try restarting it. This will terminate any running sessions.", - "restart_sunshine_success": "Sunshine is restarting", - "troubleshooting": "Troubleshooting", - "unpair_all": "Unpair All", - "unpair_all_desc": "Remove all your paired devices", - "unpair_all_error": "Error while unpairing", - "unpair_all_success": "Unpair Successful!" + "force_close": "强制关闭", + "force_close_desc": "如果 Moonlight 抱怨某个应用正在运行,强制关闭该应用应该可以解决问题。", + "force_close_error": "关闭应用时出错", + "force_close_success": "应用关闭成功!", + "logs": "日志", + "logs_desc": "查看 Sunshine 上传的日志", + "logs_find": "查找...", + "restart_sunshine": "重启 Sunhine", + "restart_sunshine_desc": "如果 Sunshine 无法正常工作,可以尝试重新启动。这将终止任何正在运行的会话。", + "restart_sunshine_success": "Sunhine 正在重启", + "troubleshooting": "故障排除", + "unpair_all": "全部取消配对", + "unpair_all_desc": "删除您所有配对的设备", + "unpair_all_error": "取消配对时出错", + "unpair_all_success": "取消配对成功!" }, "welcome": { - "confirm_password": "Confirm password", - "create_creds": "Before Getting Started, we need you to make a new username and password for accessing the Web UI.", - "create_creds_alert": "The credentials below are needed to access Sunshine's Web UI. Keep them safe, since you will never see them again!", - "greeting": "Welcome to Sunshine!", - "login": "Login", - "welcome_success": "This page will reload soon, your browser will ask you for the new credentials" + "confirm_password": "确认密码", + "create_creds": "在开始之前,我们需要您为访问 Web UI 设置一个新的用户名和密码。", + "create_creds_alert": "需要下面的账户信息才能访问 Sunshine 的 Web UI 。请妥善保存,因为你再也不会见到它们!", + "greeting": "欢迎使用 Sunshine!", + "login": "登录", + "welcome_success": "此页面将很快重新加载,您的浏览器将询问您新的账户信息" } } diff --git a/src_assets/common/assets/web/welcome.html b/src_assets/common/assets/web/welcome.html index 2b3fc7d9d9c..c2946c745d2 100644 --- a/src_assets/common/assets/web/welcome.html +++ b/src_assets/common/assets/web/welcome.html @@ -40,7 +40,7 @@

{{ $t('_common.error') }} {{error}}
- {{ $t('_common.success') }} {{ $t('_common.welcome_success') }} + {{ $t('_common.success') }} {{ $t('welcome.welcome_success') }}

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ba70a88ccdc..e4583f9c6a5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -107,6 +107,7 @@ list(REMOVE_ITEM SUNSHINE_SOURCES ${CMAKE_SOURCE_DIR}/src/main.cpp) add_executable(${PROJECT_NAME} ${TEST_SOURCES} ${SUNSHINE_SOURCES}) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17) target_link_libraries(${PROJECT_NAME} ${SUNSHINE_EXTERNAL_LIBRARIES} gtest @@ -115,10 +116,5 @@ target_link_libraries(${PROJECT_NAME} target_compile_definitions(${PROJECT_NAME} PUBLIC ${SUNSHINE_DEFINITIONS} ${TEST_DEFINITIONS}) target_compile_options(${PROJECT_NAME} PRIVATE $<$:${SUNSHINE_COMPILE_OPTIONS}>;$<$:${SUNSHINE_COMPILE_OPTIONS_CUDA};-std=c++17>) # cmake-lint: disable=C0301 target_link_options(${PROJECT_NAME} PRIVATE) -if(WIN32) - set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) -else() - set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17) -endif() add_test(NAME ${PROJECT_NAME} COMMAND sunshine_test) diff --git a/tests/conftest.cpp b/tests/conftest.cpp index 0f2da8eecc6..4fcafb95547 100644 --- a/tests/conftest.cpp +++ b/tests/conftest.cpp @@ -5,16 +5,16 @@ #include #include #include -#include #include #include +#include #include #include -namespace logging = boost::log; -namespace sinks = logging::sinks; +namespace boost_logging = boost::log; +namespace sinks = boost_logging::sinks; // Undefine the original TEST macro #undef TEST @@ -40,6 +40,9 @@ class BaseTest: public ::testing::Test { // we can possibly use some internal googletest functions to capture stdout and stderr, but I have not tested this // https://stackoverflow.com/a/33186201/11214013 + // Add a member variable for deinit_guard + std::unique_ptr deinit_guard; + // Add a member variable to store the sink boost::shared_ptr> test_sink; @@ -79,7 +82,7 @@ class BaseTest: public ::testing::Test { test_sink->locked_backend()->add_stream(stream); // Register the sink in the logging core (BOOST_LOG) - logging::core::get()->add_sink(test_sink); + boost_logging::core::get()->add_sink(test_sink); sbuf = std::cout.rdbuf(); // save cout buffer (std::cout) std::cout.rdbuf(cout_buffer.rdbuf()); // redirect cout to buffer (std::cout) @@ -87,6 +90,11 @@ class BaseTest: public ::testing::Test { // todo: do this only once // setup a mail object mail::man = std::make_shared(); + + deinit_guard = logging::init(0, "test.log"); + if (!deinit_guard) { + FAIL() << "Logging failed to initialize"; + } } void @@ -121,7 +129,7 @@ class BaseTest: public ::testing::Test { } // Remove the sink from the logging core (BOOST_LOG) - logging::core::get()->remove_sink(test_sink); + boost_logging::core::get()->remove_sink(test_sink); test_sink.reset(); } diff --git a/tests/unit/test_logging.cpp b/tests/unit/test_logging.cpp new file mode 100644 index 00000000000..38bed4679e8 --- /dev/null +++ b/tests/unit/test_logging.cpp @@ -0,0 +1,75 @@ +/** + * @file tests/test_logging.cpp + * @brief Test src/logging.*. + */ +#include + +#include + +#include + +class LoggerInitTest: public virtual BaseTest, public ::testing::WithParamInterface { +protected: + void + SetUp() override { + BaseTest::SetUp(); + } + + void + TearDown() override { + BaseTest::TearDown(); + } +}; +INSTANTIATE_TEST_SUITE_P( + LogLevel, + LoggerInitTest, + ::testing::Values( + 0, + 1, + 2, + 3, + 4, + 5)); +TEST_P(LoggerInitTest, InitLogging) { + int logLevel = GetParam(); + std::string logFilePath = "test_log_" + std::to_string(logLevel) + ".log"; + + // deinit the BaseTest logger + BaseTest::deinit_guard.reset(); + + auto log_deinit = logging::init(logLevel, logFilePath); + if (!log_deinit) { + FAIL() << "Failed to initialize logging"; + } +} + +TEST(LogFlushTest, CheckLogFile) { + // Write a log message + BOOST_LOG(info) << "Test message"; + + // Call log_flush + logging::log_flush(); + + // Check the contents of the log file + std::ifstream log_file("test.log"); + std::string line; + bool found = false; + while (std::getline(log_file, line)) { + if (line.find("Test message") != std::string::npos) { + found = true; + break; + } + } + + EXPECT_TRUE(found); +} + +TEST(PrintHelpTest, CheckOutput) { + std::string name = "test"; + logging::print_help(name.c_str()); + + std::string output = cout_buffer.str(); + + EXPECT_NE(output.find("Usage: " + name), std::string::npos); + EXPECT_NE(output.find("--help"), std::string::npos); +} diff --git a/tests/unit/test_video.cpp b/tests/unit/test_video.cpp index b1a664f74ef..ec96bdb2686 100644 --- a/tests/unit/test_video.cpp +++ b/tests/unit/test_video.cpp @@ -21,10 +21,6 @@ class EncoderTest: public virtual BaseTest, public PlatformInitBase, public ::te bool isEncoderValid; isEncoderValid = video::validate_encoder(*encoder, false); - // todo: av logging is not redirected to boost so it will be visible whether the test passes or fails - // move this code to logging - // https://github.com/LizardByte/Sunshine/blob/5606840c8983b714a0e442c42d887a49807715e1/src/main.cpp#L118 - if (!isEncoderValid) { // if encoder is software fail, otherwise skip if (encoder == &video::software && std::string(TESTS_SOFTWARE_ENCODER_UNAVAILABLE) == "fail") { @@ -49,7 +45,6 @@ INSTANTIATE_TEST_SUITE_P( EncoderVariants, EncoderTest, ::testing::Values( -// todo: all encoders crash on windows, probably due to platf not being initialized (which also crashes) #if !defined(__APPLE__) std::make_tuple(video::nvenc.name, &video::nvenc), #endif diff --git a/third-party/build-deps b/third-party/build-deps index 6e23b580e65..efd3a380113 160000 --- a/third-party/build-deps +++ b/third-party/build-deps @@ -1 +1 @@ -Subproject commit 6e23b580e653595df1e6f680062fa08d6eff3dfe +Subproject commit efd3a380113e8ae98ae68cc1d73fd7c4b54b03c6 diff --git a/tools/sunshinesvc.cpp b/tools/sunshinesvc.cpp index fee3a693e1d..da0849e26bb 100644 --- a/tools/sunshinesvc.cpp +++ b/tools/sunshinesvc.cpp @@ -145,8 +145,11 @@ bool RunTerminationHelper(HANDLE console_token, DWORD pid) { WCHAR module_path[MAX_PATH]; GetModuleFileNameW(NULL, module_path, _countof(module_path)); - std::wstring command { module_path }; + std::wstring command; + command += L'"'; + command += module_path; + command += L'"'; command += L" --terminate " + std::to_wstring(pid); STARTUPINFOW startup_info = {}; @@ -157,7 +160,7 @@ RunTerminationHelper(HANDLE console_token, DWORD pid) { // This will allow us to attach to Sunshine's console and send it a Ctrl-C event. PROCESS_INFORMATION process_info; if (!CreateProcessAsUserW(console_token, - NULL, + module_path, (LPWSTR) command.c_str(), NULL, NULL,