mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2025-10-06 00:02:44 +02:00
Compare commits
43 Commits
fast-modul
...
ffmpeg-mul
Author | SHA1 | Date | |
---|---|---|---|
|
3c47951ccc | ||
|
a4123200c0 | ||
|
5591ce30c9 | ||
|
af923c92eb | ||
|
cf00554d23 | ||
|
cee222f0e6 | ||
|
b2d16cb3dd | ||
|
ef2d0a9076 | ||
|
f3e00b633e | ||
|
cc7f2808ed | ||
|
6b46aca0b7 | ||
|
1037bff8ac | ||
|
b54e7a8e5e | ||
|
c4ca8d2367 | ||
|
8ff1b9d282 | ||
|
c6a87a661a | ||
|
5b361338c1 | ||
|
96afab0299 | ||
|
2665c5cc24 | ||
|
9bbf2c3df2 | ||
|
e6fc5f07d9 | ||
|
d37d47c0ab | ||
|
9755eb32b3 | ||
|
a9f9b207c2 | ||
|
5c1fc12d88 | ||
|
321bb5a17f | ||
|
4758e126b8 | ||
|
1240cd43d7 | ||
|
76fa525592 | ||
|
7e13da47af | ||
|
d2364ae1f7 | ||
|
4cc39b98d6 | ||
|
972576d2c5 | ||
|
810df8d01c | ||
|
6397bb0809 | ||
|
2d0f15ccac | ||
|
a793433da4 | ||
|
7eb5710f35 | ||
|
78fc80376b | ||
|
af8396808e | ||
|
fb3988a78a | ||
|
2a8ff1a59c | ||
|
eed703bc81 |
@@ -5,10 +5,10 @@
|
||||
|
||||
export NDK_CCACHE=$(which ccache)
|
||||
|
||||
# keystore & pass are stored locally
|
||||
export ANDROID_KEYSTORE_FILE=~/android.keystore
|
||||
export ANDROID_KEYSTORE_PASS=`cat ~/android.pass`
|
||||
export ANDROID_KEY_ALIAS=`cat ~/android.alias`
|
||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
export ANDROID_KEYSTORE_FILE="${GITHUB_WORKSPACE}/ks.jks"
|
||||
base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > "${ANDROID_KEYSTORE_FILE}"
|
||||
fi
|
||||
|
||||
cd src/android
|
||||
chmod +x ./gradlew
|
||||
@@ -17,3 +17,7 @@ chmod +x ./gradlew
|
||||
./gradlew bundleRelease
|
||||
|
||||
ccache -s -v
|
||||
|
||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
rm "${ANDROID_KEYSTORE_FILE}"
|
||||
fi
|
||||
|
@@ -2,14 +2,21 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
license_header = <<~EOF
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
EOF
|
||||
|
||||
print 'Getting branch changes...'
|
||||
puts "\n"
|
||||
branch_name = `git rev-parse --abbrev-ref HEAD`.chomp
|
||||
print branch_name
|
||||
puts "\n"
|
||||
branch_commits = `git log #{branch_name} --not master --pretty=format:"%h"`.split("\n")
|
||||
print branch_commits
|
||||
puts "\n"
|
||||
branch_commit_range = "#{branch_commits[-1]}^..#{branch_commits[0]}"
|
||||
print branch_commit_range
|
||||
puts "\n"
|
||||
branch_changed_files = `git diff-tree --no-commit-id --name-only #{branch_commit_range} -r`.split("\n")
|
||||
puts 'done'
|
||||
|
||||
|
@@ -14,30 +14,37 @@ if [ "$ARCH" = 'x86_64' ]; then
|
||||
echo "Making x86-64 generic build of eden"
|
||||
ARCH_FLAGS="-march=x86-64 -mtune=generic -O3"
|
||||
fi
|
||||
|
||||
if [ "$1" != '' ]; then
|
||||
shift
|
||||
fi
|
||||
else
|
||||
echo "Making aarch64 build of eden"
|
||||
ARCH_FLAGS="-march=armv8-a -mtune=generic -O3"
|
||||
fi
|
||||
|
||||
NPROC="$2"
|
||||
|
||||
NPROC="$1"
|
||||
if [ -z "$NPROC" ]; then
|
||||
NPROC="$(nproc)"
|
||||
else
|
||||
shift
|
||||
fi
|
||||
|
||||
|
||||
if [ "$TARGET" = "appimage" ]; then
|
||||
export EXTRA_CMAKE_FLAGS=(-DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF)
|
||||
# Bundle required QT wayland libraries
|
||||
export EXTRA_QT_PLUGINS="waylandcompositor"
|
||||
export EXTRA_PLATFORM_PLUGINS="libqwayland-egl.so;libqwayland-generic.so"
|
||||
else
|
||||
# For the linux-fresh verification target, verify compilation without PCH as well.
|
||||
export EXTRA_CMAKE_FLAGS=(-DYUZU_USE_PRECOMPILED_HEADERS=OFF)
|
||||
fi
|
||||
|
||||
if [ "$RELEASE" == "1" ]; then
|
||||
if [ "$DEVEL" != "true" ]; then
|
||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DENABLE_QT_UPDATE_CHECKER=ON)
|
||||
fi
|
||||
|
||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@)
|
||||
|
||||
mkdir -p build && cd build
|
||||
cmake .. -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
|
@@ -1,12 +1,9 @@
|
||||
#!/bin/sh
|
||||
#!/bin/sh -ex
|
||||
|
||||
# SPDX-FileCopyrightText: 2025 eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# TODO: create a lighter version based on pflyly's script
|
||||
|
||||
# This script assumes you're in the source directory
|
||||
set -ex
|
||||
|
||||
export APPIMAGE_EXTRACT_AND_RUN=1
|
||||
export BASE_ARCH="$(uname -m)"
|
||||
@@ -14,8 +11,8 @@ export ARCH="$BASE_ARCH"
|
||||
|
||||
export BUILDDIR="$2"
|
||||
|
||||
LIB4BN="https://raw.githubusercontent.com/VHSgunzo/sharun/refs/heads/main/lib4bin"
|
||||
URUNTIME="https://github.com/VHSgunzo/uruntime/releases/latest/download/uruntime-appimage-dwarfs-$ARCH"
|
||||
SHARUN="https://github.com/VHSgunzo/sharun/releases/latest/download/sharun-${BASE_ARCH}-aio"
|
||||
URUNTIME="https://github.com/VHSgunzo/uruntime/releases/latest/download/uruntime-appimage-dwarfs-${BASE_ARCH}"
|
||||
|
||||
if [ "$ARCH" = 'x86_64' ]; then
|
||||
if [ "$1" = 'v3' ]; then
|
||||
@@ -37,40 +34,38 @@ VERSION="$(echo "$EDEN_TAG")"
|
||||
mkdir -p ./AppDir
|
||||
cd ./AppDir
|
||||
|
||||
cat > eden.desktop << EOL
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Eden
|
||||
Icon=eden
|
||||
StartupWMClass=eden
|
||||
Exec=eden
|
||||
Categories=Game;Emulator;
|
||||
EOL
|
||||
cp ../dist/org.eden_emu.eden.desktop .
|
||||
cp ../dist/org.eden_emu.eden.svg .
|
||||
|
||||
cp ../dist/eden.svg ./eden.svg
|
||||
|
||||
ln -sf ./eden.svg ./.DirIcon
|
||||
ln -sf ./org.eden_emu.eden.svg ./.DirIcon
|
||||
|
||||
# TODO(crueter): Nightly
|
||||
# if [ "$DEVEL" = 'true' ]; then
|
||||
# sed -i 's|Name=Eden|Name=Eden Nightly|' ./eden.desktop
|
||||
# UPINFO="$(echo "$UPINFO" | sed 's|latest|nightly|')"
|
||||
# fi
|
||||
if [ "$DEVEL" = 'true' ]; then
|
||||
sed -i 's|Name=Eden|Name=Eden Nightly|' ./org.eden_emu.eden.desktop
|
||||
UPINFO="$(echo "$UPINFO" | sed 's|latest|nightly|')"
|
||||
fi
|
||||
|
||||
UPINFO='gh-releases-zsync|eden-emulator|Releases|latest|*.AppImage.zsync'
|
||||
|
||||
LIBDIR="/usr/lib"
|
||||
# some distros are weird and use a subdir
|
||||
|
||||
if [ ! -f "/usr/lib/libGL.so" ]
|
||||
# Workaround for Gentoo
|
||||
if [ ! -d "$LIBDIR/qt6" ]
|
||||
then
|
||||
LIBDIR="/usr/lib64"
|
||||
fi
|
||||
|
||||
# Workaround for Debian
|
||||
if [ ! -d "$LIBDIR/qt6" ]
|
||||
then
|
||||
LIBDIR="/usr/lib/${BASE_ARCH}-linux-gnu"
|
||||
fi
|
||||
|
||||
# Bundle all libs
|
||||
wget --retry-connrefused --tries=30 "$LIB4BN" -O ./lib4bin
|
||||
chmod +x ./lib4bin
|
||||
xvfb-run -a -- ./lib4bin -p -v -e -s -k \
|
||||
|
||||
wget --retry-connrefused --tries=30 "$SHARUN" -O ./sharun-aio
|
||||
chmod +x ./sharun-aio
|
||||
xvfb-run -a ./sharun-aio l -p -v -e -s -k \
|
||||
../$BUILDDIR/bin/eden* \
|
||||
$LIBDIR/lib*GL*.so* \
|
||||
$LIBDIR/libSDL2*.so* \
|
||||
@@ -95,14 +90,18 @@ xvfb-run -a -- ./lib4bin -p -v -e -s -k \
|
||||
$LIBDIR/spa-0.2/*/* \
|
||||
$LIBDIR/alsa-lib/*
|
||||
|
||||
rm -f ./sharun-aio
|
||||
|
||||
# Prepare sharun
|
||||
if [ "$ARCH" = 'aarch64' ]; then
|
||||
# allow the host vulkan to be used for aarch64 given the sed situation
|
||||
# allow the host vulkan to be used for aarch64 given the sad situation
|
||||
echo 'SHARUN_ALLOW_SYS_VKICD=1' > ./.env
|
||||
fi
|
||||
|
||||
wget https://github.com/VHSgunzo/sharun/releases/download/v0.6.3/sharun-x86_64 -O sharun
|
||||
chmod a+x sharun
|
||||
# Workaround for Gentoo
|
||||
if [ -d "shared/libproxy" ]; then
|
||||
cp shared/libproxy/* lib/
|
||||
fi
|
||||
|
||||
ln -f ./sharun ./AppRun
|
||||
./sharun -g
|
||||
@@ -129,8 +128,3 @@ echo "Generating AppImage..."
|
||||
echo "Generating zsync file..."
|
||||
zsyncmake *.AppImage -u *.AppImage
|
||||
echo "All Done!"
|
||||
|
||||
# Cleanup
|
||||
|
||||
rm -rf AppDir
|
||||
rm uruntime
|
||||
|
18
.github/workflows/build.yml
vendored
18
.github/workflows/build.yml
vendored
@@ -12,16 +12,19 @@ on:
|
||||
jobs:
|
||||
source:
|
||||
if: ${{ !github.head_ref }}
|
||||
runs-on: linux
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Pack
|
||||
run: ./.ci/source.sh
|
||||
|
||||
- name: Upload
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: source.zip
|
||||
path: artifacts/
|
||||
|
||||
@@ -77,6 +80,7 @@ jobs:
|
||||
- name: Upload Windows artifacts
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: ${{ matrix.target }}.zip
|
||||
path: artifacts/*
|
||||
|
||||
@@ -96,14 +100,15 @@ jobs:
|
||||
fetch-tags: true
|
||||
|
||||
- name: Build
|
||||
run: TARGET=appimage ./.ci/linux/build.sh v3 8
|
||||
run: TARGET=appimage DEVEL=true ./.ci/linux/build.sh v3 8
|
||||
|
||||
- name: Package AppImage
|
||||
run: ./.ci/linux/package.sh v3 &> /dev/null
|
||||
run: DEVEL=true ./.ci/linux/package.sh v3 &> /dev/null
|
||||
|
||||
- name: Upload Linux artifacts
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 3
|
||||
name: linux.zip
|
||||
path: ./*.AppImage
|
||||
|
||||
@@ -132,7 +137,11 @@ jobs:
|
||||
echo $GIT_TAG_NAME
|
||||
|
||||
- name: Build
|
||||
run: ANDROID_HOME=/opt/android-sdk ./.ci/android/build.sh
|
||||
run: ANDROID_HOME=/home/runner/sdk ./.ci/android/build.sh
|
||||
env:
|
||||
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
||||
|
||||
- name: Package Android artifacts
|
||||
run: ./.ci/android/package.sh
|
||||
@@ -140,5 +149,6 @@ jobs:
|
||||
- name: Upload Android artifacts
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: android.zip
|
||||
path: artifacts/*
|
||||
|
6
.github/workflows/license-header.yml
vendored
6
.github/workflows/license-header.yml
vendored
@@ -1,18 +1,18 @@
|
||||
name: eden-license
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
license-header:
|
||||
runs-on: linux
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Fetch master branch
|
||||
- name: Fetch
|
||||
run: git fetch origin master:master
|
||||
|
||||
- name: Make script executable
|
||||
|
12
.github/workflows/trigger_release.yml
vendored
12
.github/workflows/trigger_release.yml
vendored
@@ -9,7 +9,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
source:
|
||||
runs-on: linux
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -19,6 +19,7 @@ jobs:
|
||||
- name: Upload
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: source.zip
|
||||
path: artifacts/
|
||||
|
||||
@@ -74,6 +75,7 @@ jobs:
|
||||
- name: Upload Windows artifacts
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: ${{ matrix.target }}.zip
|
||||
path: artifacts/*
|
||||
|
||||
@@ -101,6 +103,7 @@ jobs:
|
||||
- name: Upload Linux artifacts
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: linux.zip
|
||||
path: ./*.AppImage*
|
||||
|
||||
@@ -129,7 +132,11 @@ jobs:
|
||||
echo $GIT_TAG_NAME
|
||||
|
||||
- name: Build
|
||||
run: ANDROID_HOME=/opt/android-sdk ./.ci/android/build.sh
|
||||
run: ANDROID_HOME=/home/runner/sdk ./.ci/android/build.sh
|
||||
env:
|
||||
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
||||
|
||||
- name: Package Android artifacts
|
||||
run: ./.ci/android/package.sh
|
||||
@@ -137,6 +144,7 @@ jobs:
|
||||
- name: Upload Android artifacts
|
||||
uses: forgejo/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 2
|
||||
name: android.zip
|
||||
path: artifacts/*
|
||||
|
||||
|
8
.gitignore
vendored
8
.gitignore
vendored
@@ -1,6 +1,9 @@
|
||||
# SPDX-FileCopyrightText: 2013 Citra Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Build directory
|
||||
[Bb]uild*/
|
||||
doc-build/
|
||||
@@ -36,3 +39,8 @@ CMakeSettings.json
|
||||
# Windows global filetypes
|
||||
Thumbs.db
|
||||
|
||||
# Artifacts
|
||||
eden-windows-msvc
|
||||
artifacts
|
||||
*.AppImage*
|
||||
*.patch
|
||||
|
26
.gitmodules
vendored
26
.gitmodules
vendored
@@ -3,43 +3,43 @@
|
||||
|
||||
[submodule "cubeb"]
|
||||
path = externals/cubeb
|
||||
url = https://git.eden-emu.dev/eden-emu/cubeb.git
|
||||
url = https://github.com/mozilla/cubeb.git
|
||||
[submodule "libusb"]
|
||||
path = externals/libusb/libusb
|
||||
url = https://git.eden-emu.dev/eden-emu/libusb.git
|
||||
url = https://github.com/libusb/libusb.git
|
||||
[submodule "Vulkan-Headers"]
|
||||
path = externals/Vulkan-Headers
|
||||
url = https://git.eden-emu.dev/eden-emu/Vulkan-Headers.git
|
||||
url = https://github.com/KhronosGroup/Vulkan-Headers.git
|
||||
[submodule "xbyak"]
|
||||
path = externals/xbyak
|
||||
url = https://git.eden-emu.dev/eden-emu/xbyak.git
|
||||
url = https://github.com/herumi/xbyak.git
|
||||
[submodule "opus"]
|
||||
path = externals/opus
|
||||
url = https://git.eden-emu.dev/eden-emu/opus.git
|
||||
url = https://github.com/xiph/opus.git
|
||||
[submodule "SDL"]
|
||||
path = externals/SDL
|
||||
url = https://git.eden-emu.dev/eden-emu/SDL.git
|
||||
url = https://github.com/libsdl-org/SDL.git
|
||||
[submodule "cpp-httplib"]
|
||||
path = externals/cpp-httplib
|
||||
url = https://git.eden-emu.dev/eden-emu/cpp-httplib.git
|
||||
url = https://github.com/yhirose/cpp-httplib.git
|
||||
[submodule "ffmpeg"]
|
||||
path = externals/ffmpeg/ffmpeg
|
||||
url = https://git.eden-emu.dev/eden-emu/FFmpeg.git
|
||||
url = https://github.com/FFmpeg/FFmpeg.git
|
||||
[submodule "vcpkg"]
|
||||
path = externals/vcpkg
|
||||
url = https://git.eden-emu.dev/eden-emu/vcpkg.git
|
||||
url = https://github.com/microsoft/vcpkg.git
|
||||
[submodule "cpp-jwt"]
|
||||
path = externals/cpp-jwt
|
||||
url = https://git.eden-emu.dev/eden-emu/cpp-jwt.git
|
||||
url = https://github.com/arun11299/cpp-jwt.git
|
||||
[submodule "VulkanMemoryAllocator"]
|
||||
path = externals/VulkanMemoryAllocator
|
||||
url = https://git.eden-emu.dev/eden-emu/VulkanMemoryAllocator.git
|
||||
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
|
||||
[submodule "Vulkan-Utility-Libraries"]
|
||||
path = externals/Vulkan-Utility-Libraries
|
||||
url = https://git.eden-emu.dev/eden-emu/Vulkan-Utility-Libraries.git
|
||||
url = https://github.com/KhronosGroup/Vulkan-Utility-Libraries.git
|
||||
[submodule "externals/boost-headers"]
|
||||
path = externals/boost-headers
|
||||
url = https://git.eden-emu.dev/eden-emu/headers.git
|
||||
url = https://github.com/boostorg/headers.git
|
||||
[submodule "externals/dynarmic/externals/catch"]
|
||||
path = externals/dynarmic/externals/catch
|
||||
url = https://github.com/catchorg/Catch2.git
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
cmake_minimum_required(VERSION 3.22)
|
||||
@@ -309,7 +309,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||
|
||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
||||
find_package(enet 1.3 MODULE)
|
||||
find_package(fmt 10 REQUIRED)
|
||||
find_package(fmt 8 REQUIRED)
|
||||
find_package(LLVM 17.0.2 MODULE COMPONENTS Demangle)
|
||||
find_package(lz4 REQUIRED)
|
||||
find_package(nlohmann_json 3.8 REQUIRED)
|
||||
@@ -378,7 +378,7 @@ if (ENABLE_SDL2)
|
||||
if (YUZU_USE_BUNDLED_SDL2)
|
||||
# Detect toolchain and platform
|
||||
if ((MSVC_VERSION GREATER_EQUAL 1920) AND ARCHITECTURE_x86_64)
|
||||
set(SDL2_VER "SDL2-2.32.6")
|
||||
set(SDL2_VER "SDL2-2.32.8")
|
||||
else()
|
||||
message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own.")
|
||||
endif()
|
||||
@@ -655,15 +655,14 @@ endif()
|
||||
# https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
||||
# https://www.freedesktop.org/software/appstream/docs/
|
||||
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
||||
install(FILES "dist/eden.desktop"
|
||||
install(FILES "dist/org.eden_emu.eden.desktop"
|
||||
DESTINATION "share/applications")
|
||||
install(FILES "dist/eden.svg"
|
||||
DESTINATION "share/icons/hicolor/scalable/apps"
|
||||
RENAME "eden.svg")
|
||||
install(FILES "dist/org.eden_emu.eden.svg"
|
||||
DESTINATION "share/icons/hicolor/scalable/apps")
|
||||
|
||||
# TODO: these files need to be updated.
|
||||
install(FILES "dist/eden.xml"
|
||||
install(FILES "dist/org.eden_emu.eden.xml"
|
||||
DESTINATION "share/mime/packages")
|
||||
install(FILES "dist/eden.metainfo.xml"
|
||||
install(FILES "dist/org.eden_emu.eden.metainfo.xml"
|
||||
DESTINATION "share/metainfo")
|
||||
endif()
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# This function downloads a binary library package from our external repo.
|
||||
|
@@ -20,37 +20,19 @@ if (NOT GIT_BRANCH)
|
||||
endif()
|
||||
get_timestamp(BUILD_DATE)
|
||||
|
||||
# Generate cpp with Git revision from template
|
||||
# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
|
||||
set(REPO_NAME "")
|
||||
set(BUILD_VERSION "0")
|
||||
set(BUILD_ID ${DISPLAY_VERSION})
|
||||
if (BUILD_REPOSITORY)
|
||||
# regex capture the string nightly or canary into CMAKE_MATCH_1
|
||||
string(REGEX MATCH "yuzu-emu/yuzu-?(.*)" OUTVAR ${BUILD_REPOSITORY})
|
||||
if ("${CMAKE_MATCH_COUNT}" GREATER 0)
|
||||
# capitalize the first letter of each word in the repo name.
|
||||
string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1})
|
||||
foreach(WORD ${REPO_NAME_LIST})
|
||||
string(SUBSTRING ${WORD} 0 1 FIRST_LETTER)
|
||||
string(SUBSTRING ${WORD} 1 -1 REMAINDER)
|
||||
string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
|
||||
set(REPO_NAME "${REPO_NAME}${FIRST_LETTER}${REMAINDER}")
|
||||
endforeach()
|
||||
if (BUILD_TAG)
|
||||
string(REGEX MATCH "${CMAKE_MATCH_1}-([0-9]+)" OUTVAR ${BUILD_TAG})
|
||||
if (${CMAKE_MATCH_COUNT} GREATER 0)
|
||||
set(BUILD_VERSION ${CMAKE_MATCH_1})
|
||||
endif()
|
||||
if (BUILD_VERSION)
|
||||
# This leaves a trailing space on the last word, but we actually want that
|
||||
# because of how it's styled in the title bar.
|
||||
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
||||
else()
|
||||
set(BUILD_FULLNAME "")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
git_get_exact_tag(GIT_TAG --tags)
|
||||
if (GIT_TAG MATCHES "NOTFOUND")
|
||||
set(BUILD_VERSION "${GIT_DESC}")
|
||||
set(IS_DEV_BUILD true)
|
||||
else()
|
||||
set(BUILD_VERSION ${GIT_TAG})
|
||||
set(IS_DEV_BUILD false)
|
||||
endif()
|
||||
|
||||
# Generate cpp with Git revision from template
|
||||
# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
|
||||
set(REPO_NAME "eden")
|
||||
set(BUILD_ID ${GIT_BRANCH})
|
||||
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
||||
|
||||
configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY)
|
||||
|
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -7,7 +10,7 @@ Type=Application
|
||||
Name=eden
|
||||
GenericName=Switch Emulator
|
||||
Comment=Nintendo Switch video game console emulator
|
||||
Icon=eden
|
||||
Icon=org.eden_emu.eden
|
||||
TryExec=eden
|
||||
Exec=eden %f
|
||||
Categories=Game;Emulator;Qt;
|
0
dist/eden.svg → dist/org.eden_emu.eden.svg
vendored
0
dist/eden.svg → dist/org.eden_emu.eden.svg
vendored
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -163,13 +163,24 @@ alignas(64) static constinit std::array<HostLoc, ABI_AllCallerSaveSize() - 1> AB
|
||||
};
|
||||
|
||||
void ABI_PushCallerSaveRegistersAndAdjustStackExcept(BlockOfCode& code, const HostLoc exception) {
|
||||
#ifdef _MSC_VER
|
||||
std::vector<HostLoc> regs;
|
||||
std::remove_copy(ABI_ALL_CALLER_SAVE.begin(), ABI_ALL_CALLER_SAVE.end(), std::back_inserter(regs), exception);
|
||||
ABI_PushRegistersAndAdjustStack(code, 0, regs);
|
||||
#else
|
||||
ASSUME(size_t(exception) < 32);
|
||||
ABI_PushRegistersAndAdjustStack(code, 0, ABI_CALLER_SAVED_EXCEPT_TABLE[size_t(exception)]);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ABI_PopCallerSaveRegistersAndAdjustStackExcept(BlockOfCode& code, const HostLoc exception) {
|
||||
#ifdef _MSC_VER
|
||||
std::vector<HostLoc> regs;
|
||||
std::remove_copy(ABI_ALL_CALLER_SAVE.begin(), ABI_ALL_CALLER_SAVE.end(), std::back_inserter(regs), exception);
|
||||
ABI_PopRegistersAndAdjustStack(code, 0, regs);
|
||||
#else
|
||||
ASSUME(size_t(exception) < 32);
|
||||
ABI_PopRegistersAndAdjustStack(code, 0, ABI_CALLER_SAVED_EXCEPT_TABLE[size_t(exception)]);
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace Dynarmic::Backend::X64
|
||||
|
4
externals/ffmpeg/CMakeLists.txt
vendored
4
externals/ffmpeg/CMakeLists.txt
vendored
@@ -225,7 +225,7 @@ if (NOT WIN32 AND NOT ANDROID)
|
||||
elseif(ANDROID)
|
||||
# Use yuzu FFmpeg binaries
|
||||
if (ARCHITECTURE_arm64)
|
||||
set(FFmpeg_EXT_NAME "ffmpeg-android-v5.1.LTS-aarch64")
|
||||
set(FFmpeg_EXT_NAME "ffmpeg-android-7.1.1-aarch64")
|
||||
elseif (ARCHITECTURE_x86_64)
|
||||
set(FFmpeg_EXT_NAME "ffmpeg-android-v5.1.LTS-x86_64")
|
||||
else()
|
||||
@@ -255,7 +255,7 @@ elseif(ANDROID)
|
||||
set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE)
|
||||
elseif(WIN32)
|
||||
# Use yuzu FFmpeg binaries
|
||||
set(FFmpeg_EXT_NAME "ffmpeg-6.0.2")
|
||||
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
|
||||
set(FFmpeg_PATH "${CMAKE_BINARY_DIR}/externals/${FFmpeg_EXT_NAME}")
|
||||
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "")
|
||||
set(FFmpeg_FOUND YES)
|
||||
|
19
externals/libadrenotools/lib/linkernsbypass/CMakeLists.txt
vendored
Normal file
19
externals/libadrenotools/lib/linkernsbypass/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
if(NOT ${CMAKE_ANDROID_ARCH_ABI} STREQUAL arm64-v8a)
|
||||
message(FATAL_ERROR "Unsupported target architecture: ${CMAKE_ANDROID_ARCH_ABI}. Please make an issue on the repo!")
|
||||
endif()
|
||||
|
||||
project(linkernsbypass LANGUAGES CXX)
|
||||
|
||||
set(SOURCES android_linker_ns.cpp
|
||||
android_linker_ns.h
|
||||
elf_soname_patcher.cpp
|
||||
elf_soname_patcher.h)
|
||||
|
||||
add_library(linkernsbypass STATIC ${SOURCES})
|
||||
|
||||
|
||||
target_compile_options(linkernsbypass PRIVATE -Wall -Wextra)
|
||||
target_link_libraries(linkernsbypass android dl)
|
||||
target_include_directories(linkernsbypass PUBLIC .)
|
24
externals/libadrenotools/lib/linkernsbypass/LICENSE
vendored
Normal file
24
externals/libadrenotools/lib/linkernsbypass/LICENSE
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2021, Billy Laws
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
9
externals/libadrenotools/lib/linkernsbypass/README.md
vendored
Normal file
9
externals/libadrenotools/lib/linkernsbypass/README.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
### Android Linker Namespace Bypass Library
|
||||
Provides access to the hidden linker namespace functionality in Android 9+ and exposes an interface for hooking libraries similar to a runtime equivalent of `LD_PRELOAD`.
|
||||
See the `android_linker_ns.h` header for an API reference.
|
||||
|
||||
#### Support
|
||||
Android 9+
|
||||
Arm64
|
||||
|
||||
Android 8 and arm32 could be supported with some trivial changes, feel free to open an issue if you have a use for this library on either of them.
|
192
externals/libadrenotools/lib/linkernsbypass/android_linker_ns.cpp
vendored
Normal file
192
externals/libadrenotools/lib/linkernsbypass/android_linker_ns.cpp
vendored
Normal file
@@ -0,0 +1,192 @@
|
||||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
// Copyright © 2021 Billy Laws
|
||||
|
||||
#include <array>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <errno.h>
|
||||
#include <dlfcn.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <android/dlext.h>
|
||||
#include <android/log.h>
|
||||
#include <android/api-level.h>
|
||||
#include <sys/mman.h>
|
||||
#include "elf_soname_patcher.h"
|
||||
#include "android_linker_ns.h"
|
||||
|
||||
using loader_android_create_namespace_t = android_namespace_t *(*)(const char *, const char *, const char *, uint64_t, const char *, android_namespace_t *, const void *);
|
||||
static loader_android_create_namespace_t loader_android_create_namespace;
|
||||
|
||||
static bool lib_loaded;
|
||||
|
||||
|
||||
/* Public API */
|
||||
bool linkernsbypass_load_status() {
|
||||
return lib_loaded;
|
||||
}
|
||||
|
||||
struct android_namespace_t *android_create_namespace(const char *name,
|
||||
const char *ld_library_path,
|
||||
const char *default_library_path,
|
||||
uint64_t type,
|
||||
const char *permitted_when_isolated_path,
|
||||
android_namespace_t *parent_namespace) {
|
||||
auto caller{__builtin_return_address(0)};
|
||||
return loader_android_create_namespace(name, ld_library_path, default_library_path, type,
|
||||
permitted_when_isolated_path, parent_namespace, caller);
|
||||
}
|
||||
|
||||
struct android_namespace_t *android_create_namespace_escape(const char *name,
|
||||
const char *ld_library_path,
|
||||
const char *default_library_path,
|
||||
uint64_t type,
|
||||
const char *permitted_when_isolated_path,
|
||||
android_namespace_t *parent_namespace) {
|
||||
auto caller{reinterpret_cast<void *>(&dlopen)};
|
||||
return loader_android_create_namespace(name, ld_library_path, default_library_path, type,
|
||||
permitted_when_isolated_path, parent_namespace, caller);
|
||||
}
|
||||
|
||||
android_get_exported_namespace_t android_get_exported_namespace;
|
||||
|
||||
android_link_namespaces_all_libs_t android_link_namespaces_all_libs;
|
||||
|
||||
android_link_namespaces_t android_link_namespaces;
|
||||
|
||||
bool linkernsbypass_link_namespace_to_default_all_libs(android_namespace_t *to) {
|
||||
// Creating a shared namespace with the default parent will give a copy of the default namespace that we can actually access
|
||||
// This is needed since there is no way to access a direct handle to the default namespace as it's not exported
|
||||
static auto defaultNs{android_create_namespace_escape("default_copy", nullptr, nullptr, ANDROID_NAMESPACE_TYPE_SHARED, nullptr, nullptr)};
|
||||
return android_link_namespaces_all_libs(to, defaultNs);
|
||||
}
|
||||
|
||||
void *linkernsbypass_namespace_dlopen(const char *filename, int flags, android_namespace_t *ns) {
|
||||
android_dlextinfo extInfo{
|
||||
.flags = ANDROID_DLEXT_USE_NAMESPACE,
|
||||
.library_namespace = ns
|
||||
};
|
||||
|
||||
return android_dlopen_ext(filename, flags, &extInfo);
|
||||
}
|
||||
|
||||
#ifndef __NR_memfd_create
|
||||
#if defined(__aarch64__)
|
||||
#define __NR_memfd_create 279
|
||||
#else
|
||||
#error Unsupported target architecture!
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void *linkernsbypass_namespace_dlopen_unique(const char *libPath, const char *libTargetDir, int flags, android_namespace_t *ns) {
|
||||
static std::array<char, PATH_MAX> PathBuf{};
|
||||
|
||||
// Used as a unique ID for overwriting soname and creating target lib files
|
||||
static uint16_t TargetId{};
|
||||
|
||||
int libTargetFd{[&] () {
|
||||
if (libTargetDir) {
|
||||
snprintf(PathBuf.data(), PathBuf.size(), "%s/%d_patched.so", libTargetDir, TargetId);
|
||||
return open(PathBuf.data(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
||||
} else {
|
||||
// If memfd isn't supported errno will contain ENOSYS after calling
|
||||
errno = 0;
|
||||
int fd{static_cast<int>(syscall(__NR_memfd_create, libPath, 0))};
|
||||
if (errno == ENOSYS || fd < 0)
|
||||
return -1;
|
||||
else
|
||||
return fd;
|
||||
}
|
||||
}()};
|
||||
if (libTargetFd == -1)
|
||||
return nullptr;
|
||||
|
||||
// Partially overwrite soname with 3 digits (replacing lib...) with to make sure a cached so isn't loaded
|
||||
std::array<char, 3> sonameOverwrite{};
|
||||
snprintf(sonameOverwrite.data(), sonameOverwrite.size(), "%03u", TargetId++);
|
||||
|
||||
if (!elf_soname_patch(libPath, libTargetFd, sonameOverwrite.data()))
|
||||
return nullptr;
|
||||
|
||||
// Load our patched library into the hook namespace
|
||||
android_dlextinfo hookExtInfo{
|
||||
.flags = ANDROID_DLEXT_USE_NAMESPACE | ANDROID_DLEXT_USE_LIBRARY_FD,
|
||||
.library_fd = libTargetFd,
|
||||
.library_namespace = ns
|
||||
};
|
||||
|
||||
// Make a path that looks about right
|
||||
snprintf(PathBuf.data(), PathBuf.size(), "/proc/self/fd/%d", libTargetFd);
|
||||
|
||||
return android_dlopen_ext(PathBuf.data(), flags, &hookExtInfo);
|
||||
}
|
||||
|
||||
static void *align_ptr(void *ptr) {
|
||||
return reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(ptr) & ~(getpagesize() - 1));
|
||||
}
|
||||
|
||||
/* Private */
|
||||
__attribute__((constructor)) static void resolve_linker_symbols() {
|
||||
using loader_dlopen_t = void *(*)(const char *, int, const void *);
|
||||
|
||||
if (android_get_device_api_level() < 28)
|
||||
return;
|
||||
|
||||
// ARM64 specific function walking to locate the internal dlopen handler
|
||||
auto loader_dlopen{[]() {
|
||||
union BranchLinked {
|
||||
uint32_t raw;
|
||||
|
||||
struct {
|
||||
int32_t offset : 26; //!< 26-bit branch offset
|
||||
uint8_t sig : 6; //!< 6-bit signature
|
||||
};
|
||||
|
||||
bool Verify() {
|
||||
return sig == 0x25;
|
||||
}
|
||||
};
|
||||
static_assert(sizeof(BranchLinked) == 4, "BranchLinked is wrong size");
|
||||
|
||||
// Some devices ship with --X mapping for exexecutables so work around that
|
||||
mprotect(align_ptr(reinterpret_cast<void *>(&dlopen)), getpagesize(), PROT_WRITE | PROT_READ | PROT_EXEC);
|
||||
|
||||
// dlopen is just a wrapper for __loader_dlopen that passes the return address as the third arg hence we can just walk it to find __loader_dlopen
|
||||
auto blInstr{reinterpret_cast<BranchLinked *>(&dlopen)};
|
||||
while (!blInstr->Verify())
|
||||
blInstr++;
|
||||
|
||||
return reinterpret_cast<loader_dlopen_t>(blInstr + blInstr->offset);
|
||||
}()};
|
||||
|
||||
// Protect the loader_dlopen function to remove the BTI attribute (since this is an internal function that isn't intended to be jumped indirectly to)
|
||||
mprotect(align_ptr(reinterpret_cast<void *>(&loader_dlopen)), getpagesize(), PROT_WRITE | PROT_READ | PROT_EXEC);
|
||||
|
||||
// Passing dlopen as a caller address tricks the linker into using the internal unrestricted namespace letting us access libraries that are normally forbidden in the classloader namespace imposed on apps
|
||||
auto ldHandle{loader_dlopen("ld-android.so", RTLD_LAZY, reinterpret_cast<void *>(&dlopen))};
|
||||
if (!ldHandle)
|
||||
return;
|
||||
|
||||
android_link_namespaces_all_libs = reinterpret_cast<android_link_namespaces_all_libs_t>(dlsym(ldHandle, "__loader_android_link_namespaces_all_libs"));
|
||||
if (!android_link_namespaces_all_libs)
|
||||
return;
|
||||
|
||||
android_link_namespaces = reinterpret_cast<android_link_namespaces_t>(dlsym(ldHandle, "__loader_android_link_namespaces"));
|
||||
if (!android_link_namespaces)
|
||||
return;
|
||||
|
||||
auto libdlAndroidHandle{loader_dlopen("libdl_android.so", RTLD_LAZY, reinterpret_cast<void *>(&dlopen))};
|
||||
if (!libdlAndroidHandle)
|
||||
return;
|
||||
|
||||
loader_android_create_namespace = reinterpret_cast<loader_android_create_namespace_t>(dlsym(libdlAndroidHandle, "__loader_android_create_namespace"));
|
||||
if (!loader_android_create_namespace)
|
||||
return;
|
||||
|
||||
android_get_exported_namespace = reinterpret_cast<android_get_exported_namespace_t>(dlsym(libdlAndroidHandle, "__loader_android_get_exported_namespace"));
|
||||
if (!android_get_exported_namespace)
|
||||
return;
|
||||
|
||||
// Lib is now safe to use
|
||||
lib_loaded = true;
|
||||
}
|
81
externals/libadrenotools/lib/linkernsbypass/android_linker_ns.h
vendored
Normal file
81
externals/libadrenotools/lib/linkernsbypass/android_linker_ns.h
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
// Copyright © 2021 Billy Laws
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// https://cs.android.com/android/platform/superproject/+/0a492a4685377d41fef2b12e9af4ebfa6feef9c2:art/libnativeloader/include/nativeloader/dlext_namespaces.h;l=25;bpv=1;bpt=1
|
||||
enum {
|
||||
ANDROID_NAMESPACE_TYPE_REGULAR = 0,
|
||||
ANDROID_NAMESPACE_TYPE_ISOLATED = 1,
|
||||
ANDROID_NAMESPACE_TYPE_SHARED = 2,
|
||||
ANDROID_NAMESPACE_TYPE_EXEMPT_LIST_ENABLED = 0x08000000,
|
||||
ANDROID_NAMESPACE_TYPE_ALSO_USED_AS_ANONYMOUS = 0x10000000,
|
||||
ANDROID_NAMESPACE_TYPE_SHARED_ISOLATED = ANDROID_NAMESPACE_TYPE_SHARED | ANDROID_NAMESPACE_TYPE_ISOLATED,
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Checks if linkernsbypass loaded successfully and is safe to use
|
||||
* @note IMPORTANT: This should be called before any calls to the rest of the library are made
|
||||
* @return true if loading succeeded
|
||||
*/
|
||||
bool linkernsbypass_load_status();
|
||||
|
||||
// https://cs.android.com/android/platform/superproject/+/0a492a4685377d41fef2b12e9af4ebfa6feef9c2:art/libnativeloader/include/nativeloader/dlext_namespaces.h;l=86;bpv=1;bpt=1
|
||||
struct android_namespace_t *android_create_namespace(const char *name,
|
||||
const char *ld_library_path,
|
||||
const char *default_library_path,
|
||||
uint64_t type,
|
||||
const char *permitted_when_isolated_path,
|
||||
struct android_namespace_t *parent_namespace);
|
||||
|
||||
struct android_namespace_t *android_create_namespace_escape(const char *name,
|
||||
const char *ld_library_path,
|
||||
const char *default_library_path,
|
||||
uint64_t type,
|
||||
const char *permitted_when_isolated_path,
|
||||
struct android_namespace_t *parent_namespace);
|
||||
|
||||
// https://cs.android.com/android/platform/superproject/+/dcb01ef31026b3b8aeb72dada3370af63fe66bbd:bionic/linker/linker.cpp;l=3554
|
||||
typedef struct android_namespace_t *(*android_get_exported_namespace_t)(const char *);
|
||||
extern android_get_exported_namespace_t android_get_exported_namespace;
|
||||
|
||||
// https://cs.android.com/android/platform/superproject/+/dcb01ef31026b3b8aeb72dada3370af63fe66bbd:bionic/linker/linker.cpp;l=2499
|
||||
typedef bool (*android_link_namespaces_all_libs_t)(struct android_namespace_t *, struct android_namespace_t *);
|
||||
extern android_link_namespaces_all_libs_t android_link_namespaces_all_libs;
|
||||
|
||||
// https://cs.android.com/android/platform/superproject/+/dcb01ef31026b3b8aeb72dada3370af63fe66bbd:bionic/linker/linker.cpp;l=2473
|
||||
typedef bool (*android_link_namespaces_t)(struct android_namespace_t *, struct android_namespace_t *, const char *);
|
||||
extern android_link_namespaces_t android_link_namespaces;
|
||||
|
||||
/**
|
||||
* @brief Like android_link_namespaces_all_libs but links from the default namespace
|
||||
*/
|
||||
bool linkernsbypass_link_namespace_to_default_all_libs(struct android_namespace_t *to);
|
||||
|
||||
/**
|
||||
* @brief Loads a library into a namespace
|
||||
* @note IMPORTANT: If `filename` is compiled with the '-z global' linker flag and RTLD_GLOBAL is supplied in `flags` the library will be added to the namespace's LD_PRELOAD list
|
||||
* @param filename The name of the library to load
|
||||
* @param flags The rtld flags for `filename`
|
||||
* @param ns The namespace to dlopen into
|
||||
*/
|
||||
void *linkernsbypass_namespace_dlopen(const char *filename, int flags, struct android_namespace_t *ns);
|
||||
|
||||
/**
|
||||
* @brief Force loads a unique instance of a library into a namespace
|
||||
* @param libPath The path to the library to load with hooks applied
|
||||
* @param libTargetDir A temporary directory to hold the soname patched library at `libPath`, will attempt to use memfd if nullptr
|
||||
* @param flags The rtld flags for `libName`
|
||||
* @param ns The namespace to dlopen into
|
||||
*/
|
||||
void *linkernsbypass_namespace_dlopen_unique(const char *libPath, const char *libTargetDir, int flags, struct android_namespace_t *ns);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
67
externals/libadrenotools/lib/linkernsbypass/elf_soname_patcher.cpp
vendored
Normal file
67
externals/libadrenotools/lib/linkernsbypass/elf_soname_patcher.cpp
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
// Copyright © 2021 Billy Laws
|
||||
|
||||
#include <initializer_list>
|
||||
#include <cstdint>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <link.h>
|
||||
#include <elf.h>
|
||||
#include "elf_soname_patcher.h"
|
||||
|
||||
bool elf_soname_patch(const char *libPath, int targetFd, const char *sonamePatch) {
|
||||
struct stat libStat{};
|
||||
if (stat(libPath, &libStat))
|
||||
return false;
|
||||
|
||||
if (ftruncate(targetFd, libStat.st_size) == -1)
|
||||
return false;
|
||||
|
||||
// Map the memory so we can read our elf into it
|
||||
auto mappedLib{reinterpret_cast<uint8_t *>(mmap(nullptr, libStat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, targetFd, 0))};
|
||||
if (!mappedLib)
|
||||
return false;
|
||||
|
||||
int libFd{open(libPath, O_RDONLY)};
|
||||
if (libFd == false)
|
||||
return false;
|
||||
|
||||
// Read lib elf into target file
|
||||
if (read(libFd, mappedLib, libStat.st_size) != libStat.st_size)
|
||||
return false;
|
||||
|
||||
// No longer needed
|
||||
close(libFd);
|
||||
|
||||
auto eHdr{reinterpret_cast<ElfW(Ehdr) *>(mappedLib)};
|
||||
auto sHdrEntries{reinterpret_cast<ElfW(Shdr) *>(mappedLib + eHdr->e_shoff)};
|
||||
|
||||
// Iterate over section headers to find the .dynamic section
|
||||
for (ElfW(Half) i{}; i < eHdr->e_shnum; i++) {
|
||||
auto &sHdr{sHdrEntries[i]};
|
||||
if (sHdr.sh_type == SHT_DYNAMIC) {
|
||||
auto strTab{reinterpret_cast<char *>(mappedLib + sHdrEntries[sHdr.sh_link].sh_offset)};
|
||||
auto dynHdrEntries{reinterpret_cast<ElfW(Dyn) *>(mappedLib + sHdr.sh_offset)};
|
||||
|
||||
// Iterate over .dynamic entries to find DT_SONAME
|
||||
for (ElfW(Xword) k{}; k < (sHdr.sh_size / sHdr.sh_entsize); k++) {
|
||||
auto &dynHdrEntry{dynHdrEntries[k]};
|
||||
if (dynHdrEntry.d_tag == DT_SONAME) {
|
||||
char *soname{strTab + dynHdrEntry.d_un.d_val};
|
||||
|
||||
// Partially replace the old soname with the soname patch
|
||||
size_t charIdx{};
|
||||
for (; soname[charIdx] != 0 && sonamePatch[charIdx] != 0; charIdx++)
|
||||
soname[charIdx] = sonamePatch[charIdx];
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
21
externals/libadrenotools/lib/linkernsbypass/elf_soname_patcher.h
vendored
Normal file
21
externals/libadrenotools/lib/linkernsbypass/elf_soname_patcher.h
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
// Copyright © 2021 Billy Laws
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Overwrites a portion of the soname in an elf by loading it into shared memory and modifying .dynstr
|
||||
* @note IMPORTANT: The supplied soname patch will overwrite the first strlen(sonamePatch) chars of the soname
|
||||
* @param elfPath Full path to the elf to patch
|
||||
* @param targetFd FD to use for storing the patched library
|
||||
* @return True on success
|
||||
*/
|
||||
bool elf_soname_patch(const char *elfPath, int targetFd, const char *newSoname);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@@ -1,4 +1,7 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
@@ -35,12 +38,12 @@ android {
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_21
|
||||
targetCompatibility = JavaVersion.VERSION_21
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = "21"
|
||||
jvmTarget = "17"
|
||||
}
|
||||
|
||||
packaging {
|
||||
@@ -162,7 +165,7 @@ android {
|
||||
arguments(
|
||||
"-DENABLE_QT=0", // Don't use QT
|
||||
"-DENABLE_SDL2=0", // Don't use SDL
|
||||
"-DENABLE_WEB_SERVICE=0", // Don't use telemetry
|
||||
"-DENABLE_WEB_SERVICE=1", // Enable web service
|
||||
"-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
|
||||
"-DYUZU_USE_BUNDLED_VCPKG=ON",
|
||||
"-DYUZU_USE_BUNDLED_FFMPEG=ON",
|
||||
@@ -176,9 +179,9 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.create<Delete>("ktlintReset") {
|
||||
delete(File(buildDir.path + File.separator + "intermediates/ktLint"))
|
||||
}
|
||||
tasks.register<Delete>("ktlintReset", fun Delete.() {
|
||||
delete(File(layout.buildDirectory.toString() + File.separator + "intermediates/ktLint"))
|
||||
})
|
||||
|
||||
val showFormatHelp = {
|
||||
logger.lifecycle(
|
||||
@@ -225,11 +228,14 @@ dependencies {
|
||||
implementation("com.google.android.material:material:1.12.0")
|
||||
implementation("androidx.preference:preference-ktx:1.2.1")
|
||||
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
|
||||
implementation("com.squareup.okhttp3:okhttp:4.12.0")
|
||||
implementation("io.coil-kt:coil:2.2.2")
|
||||
implementation("androidx.core:core-splashscreen:1.0.1")
|
||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.2")
|
||||
implementation("androidx.window:window:1.3.0")
|
||||
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
|
||||
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
||||
implementation("org.commonmark:commonmark:0.22.0")
|
||||
implementation("androidx.navigation:navigation-fragment-ktx:2.8.9")
|
||||
implementation("androidx.navigation:navigation-ui-ktx:2.8.9")
|
||||
implementation("info.debatty:java-string-similarity:2.0.0")
|
||||
|
@@ -3,6 +3,9 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
-->
|
||||
<!--
|
||||
SPDX-FileCopyrightText: Eden Emulator Project
|
||||
@@ -15,6 +18,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||
<uses-feature android:name="android.software.leanback" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.vulkan.version" android:version="0x401000" android:required="true" />
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
@@ -270,8 +270,7 @@ object NativeLibrary {
|
||||
NetPlayManager.clearChat()
|
||||
}
|
||||
|
||||
|
||||
external fun netPlayInit()
|
||||
external fun initMultiplayer()
|
||||
|
||||
@Keep
|
||||
@JvmStatic
|
||||
|
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.adapters
|
||||
|
@@ -1,9 +1,10 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
package org.yuzu.yuzu_emu.dialogs
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
@@ -35,6 +36,10 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
|
||||
private lateinit var chatAdapter: ChatAdapter
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
|
||||
// TODO(alekpop, crueter): Top drawer for message notifications, perhaps use system notifs?
|
||||
// TODO(alekpop, crueter): Context menu actions for chat users
|
||||
// TODO(alekpop, crueter): Block users (depends on the above)
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = DialogChatBinding.inflate(LayoutInflater.from(context))
|
||||
@@ -47,7 +52,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
|
||||
handler.post {
|
||||
chatAdapter.notifyDataSetChanged()
|
||||
binding.chatRecyclerView.post {
|
||||
@@ -76,6 +80,7 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
|
||||
super.dismiss()
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun sendMessage(message: String) {
|
||||
val username = NetPlayManager.getUsername(context)
|
||||
NetPlayManager.netPlaySendMessage(message)
|
||||
|
@@ -0,0 +1,252 @@
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.dialogs
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import androidx.recyclerview.widget.DividerItemDecoration
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.textfield.TextInputEditText
|
||||
import info.debatty.java.stringsimilarity.Jaccard
|
||||
import info.debatty.java.stringsimilarity.JaroWinkler
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.databinding.DialogLobbyBrowserBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemLobbyRoomBinding
|
||||
import org.yuzu.yuzu_emu.network.NetPlayManager
|
||||
import java.util.Locale
|
||||
|
||||
class LobbyBrowser(context: Context) : BottomSheetDialog(context) {
|
||||
private lateinit var binding: DialogLobbyBrowserBinding
|
||||
private lateinit var adapter: LobbyRoomAdapter
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.skipCollapsed =
|
||||
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
binding = DialogLobbyBrowserBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
binding.emptyRefreshButton.setOnClickListener {
|
||||
binding.progressBar.visibility = View.VISIBLE
|
||||
refreshRoomList()
|
||||
}
|
||||
|
||||
setupRecyclerView()
|
||||
setupRefreshButton()
|
||||
refreshRoomList()
|
||||
setupSearchBar()
|
||||
}
|
||||
|
||||
private fun setupRecyclerView() {
|
||||
adapter = LobbyRoomAdapter { room -> handleRoomSelection(room) }
|
||||
|
||||
binding.roomList.apply {
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
adapter = this@LobbyBrowser.adapter
|
||||
addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupRefreshButton() {
|
||||
binding.refreshButton.setOnClickListener {
|
||||
binding.refreshButton.isEnabled = false
|
||||
binding.progressBar.visibility = View.VISIBLE
|
||||
refreshRoomList()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupSearchBar() {
|
||||
binding.chipHideFull.setOnCheckedChangeListener { _, _ -> adapter.filterAndSearch() }
|
||||
binding.chipHideEmpty.setOnCheckedChangeListener { _, _ -> adapter.filterAndSearch() }
|
||||
|
||||
binding.searchText.doOnTextChanged { text: CharSequence?, _: Int, _: Int, _: Int ->
|
||||
if (text.toString().isNotEmpty()) {
|
||||
binding.clearButton.visibility = View.VISIBLE
|
||||
} else {
|
||||
binding.clearButton.visibility = View.INVISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
binding.searchText.setOnEditorActionListener { v, action, _ ->
|
||||
if (action == EditorInfo.IME_ACTION_DONE) {
|
||||
v.clearFocus()
|
||||
|
||||
val imm = context.getSystemService<InputMethodManager>()
|
||||
imm?.hideSoftInputFromWindow(v.windowToken, 0)
|
||||
|
||||
adapter.filterAndSearch()
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
binding.btnSubmit.setOnClickListener { adapter.filterAndSearch() }
|
||||
|
||||
binding.clearButton.setOnClickListener {
|
||||
binding.searchText.setText("")
|
||||
adapter.updateRooms(NetPlayManager.getPublicRooms())
|
||||
}
|
||||
}
|
||||
|
||||
private fun refreshRoomList() {
|
||||
NetPlayManager.refreshRoomListAsync { rooms ->
|
||||
binding.emptyView.visibility = if (rooms.isEmpty()) View.VISIBLE else View.GONE
|
||||
binding.roomList.visibility = if (rooms.isEmpty()) View.GONE else View.VISIBLE
|
||||
binding.appbar.visibility = if (rooms.isEmpty()) View.GONE else View.VISIBLE
|
||||
adapter.updateRooms(rooms)
|
||||
adapter.filterAndSearch()
|
||||
binding.refreshButton.isEnabled = true
|
||||
binding.progressBar.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleRoomSelection(room: NetPlayManager.RoomInfo) {
|
||||
if (room.hasPassword) {
|
||||
showPasswordDialog(room)
|
||||
} else {
|
||||
joinRoom(room, "")
|
||||
}
|
||||
}
|
||||
|
||||
private fun showPasswordDialog(room: NetPlayManager.RoomInfo) {
|
||||
val dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_password_input, null)
|
||||
val passwordInput = dialogView.findViewById<TextInputEditText>(R.id.password_input)
|
||||
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle(context.getString(R.string.multiplayer_password_required))
|
||||
.setView(dialogView)
|
||||
.setPositiveButton(R.string.multiplayer_join_room) { _, _ ->
|
||||
joinRoom(room, passwordInput.text.toString())
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun joinRoom(room: NetPlayManager.RoomInfo, password: String) {
|
||||
val username = NetPlayManager.getUsername(context)
|
||||
|
||||
Thread {
|
||||
val result = NetPlayManager.netPlayJoinRoom(room.ip, room.port, username, password)
|
||||
|
||||
handler.post {
|
||||
if (result == 0) {
|
||||
dismiss()
|
||||
NetPlayDialog(context).show()
|
||||
}
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
inner class LobbyRoomAdapter(private val onRoomSelected: (NetPlayManager.RoomInfo) -> Unit) :
|
||||
RecyclerView.Adapter<LobbyRoomAdapter.RoomViewHolder>() {
|
||||
|
||||
private val rooms = mutableListOf<NetPlayManager.RoomInfo>()
|
||||
|
||||
inner class RoomViewHolder(private val binding: ItemLobbyRoomBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
fun bind(room: NetPlayManager.RoomInfo) {
|
||||
binding.roomName.text = room.name
|
||||
binding.roomOwner.text = room.owner
|
||||
binding.playerCount.text = context.getString(
|
||||
R.string.multiplayer_player_count,
|
||||
room.members.size,
|
||||
room.maxPlayers
|
||||
)
|
||||
|
||||
binding.lockIcon.visibility = if (room.hasPassword) View.VISIBLE else View.GONE
|
||||
|
||||
if (room.preferredGameName.isNotEmpty() && room.preferredGameId != 0L) {
|
||||
binding.gameName.text = room.preferredGameName
|
||||
} else {
|
||||
binding.gameName.text = context.getString(R.string.multiplayer_no_game_info)
|
||||
}
|
||||
|
||||
itemView.setOnClickListener { onRoomSelected(room) }
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RoomViewHolder {
|
||||
val binding = ItemLobbyRoomBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
return RoomViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: RoomViewHolder, position: Int) {
|
||||
holder.bind(rooms[position])
|
||||
}
|
||||
|
||||
override fun getItemCount() = rooms.size
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
fun updateRooms(newRooms: List<NetPlayManager.RoomInfo>) {
|
||||
rooms.clear()
|
||||
rooms.addAll(newRooms)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun filterAndSearch() {
|
||||
if (binding.searchText.text.toString().isEmpty() &&
|
||||
!binding.chipHideFull.isChecked && !binding.chipHideEmpty.isChecked
|
||||
) {
|
||||
adapter.updateRooms(NetPlayManager.getPublicRooms())
|
||||
return
|
||||
}
|
||||
|
||||
val baseList = NetPlayManager.getPublicRooms()
|
||||
val filteredList = baseList.filter { room ->
|
||||
(!binding.chipHideFull.isChecked || room.members.size < room.maxPlayers) &&
|
||||
(!binding.chipHideEmpty.isChecked || room.members.isNotEmpty())
|
||||
}
|
||||
|
||||
if (binding.searchText.text.toString().isEmpty() &&
|
||||
(binding.chipHideFull.isChecked || binding.chipHideEmpty.isChecked)
|
||||
) {
|
||||
adapter.updateRooms(filteredList)
|
||||
return
|
||||
}
|
||||
|
||||
val searchTerm = binding.searchText.text.toString().lowercase(Locale.getDefault())
|
||||
val searchAlgorithm = if (searchTerm.length > 1) Jaccard(2) else JaroWinkler()
|
||||
val sortedList: List<NetPlayManager.RoomInfo> = filteredList.mapNotNull { room ->
|
||||
val roomName = room.name.lowercase(Locale.getDefault())
|
||||
|
||||
val score = searchAlgorithm.similarity(roomName, searchTerm)
|
||||
if (score > 0.03) {
|
||||
ScoreItem(score, room)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}.sortedByDescending { it ->
|
||||
it.score
|
||||
}.map { it.item }
|
||||
adapter.updateRooms(sortedList)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private inner class ScoreItem(val score: Double, val item: NetPlayManager.RoomInfo)
|
||||
}
|
@@ -1,21 +1,22 @@
|
||||
// Copyright 2024 Mandarine Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.dialogs
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.Editable
|
||||
import android.text.TextWatcher
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.Button
|
||||
import android.widget.EditText
|
||||
import android.widget.PopupMenu
|
||||
import android.widget.Toast
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
@@ -23,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.databinding.DialogMultiplayerConnectBinding
|
||||
import org.yuzu.yuzu_emu.databinding.DialogMultiplayerLobbyBinding
|
||||
@@ -30,19 +32,24 @@ import org.yuzu.yuzu_emu.databinding.DialogMultiplayerRoomBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemBanListBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemButtonNetplayBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemTextNetplayBinding
|
||||
import org.yuzu.yuzu_emu.utils.CompatUtils
|
||||
import org.yuzu.yuzu_emu.network.NetPlayManager
|
||||
import org.yuzu.yuzu_emu.utils.CompatUtils
|
||||
import org.yuzu.yuzu_emu.utils.GameHelper
|
||||
import java.net.InetAddress
|
||||
|
||||
class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
private lateinit var adapter: NetPlayAdapter
|
||||
|
||||
private val gameNameList: MutableList<Array<String>> = mutableListOf()
|
||||
private val gameIdList: MutableList<Array<Long>> = mutableListOf()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
behavior.skipCollapsed =
|
||||
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
when {
|
||||
NetPlayManager.netPlayIsJoined() -> DialogMultiplayerLobbyBinding.inflate(layoutInflater)
|
||||
@@ -62,15 +69,28 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
|
||||
refreshAdapterItems()
|
||||
|
||||
btnModeration.visibility = if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE
|
||||
btnModeration.visibility =
|
||||
if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE
|
||||
btnModeration.setOnClickListener {
|
||||
showModerationDialog()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else -> {
|
||||
DialogMultiplayerConnectBinding.inflate(layoutInflater).apply {
|
||||
setContentView(root)
|
||||
for (game in GameHelper.cachedGameList) {
|
||||
val gameName = game.title
|
||||
if (gameNameList.none { it[0] == gameName }) {
|
||||
gameNameList.add(arrayOf(gameName))
|
||||
}
|
||||
|
||||
val gameId = game.programId.toLong()
|
||||
if (gameIdList.none { it[0] == gameId }) {
|
||||
gameIdList.add(arrayOf(gameId))
|
||||
}
|
||||
}
|
||||
btnCreate.setOnClickListener {
|
||||
showNetPlayInputDialog(true)
|
||||
dismiss()
|
||||
@@ -79,6 +99,10 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
showNetPlayInputDialog(false)
|
||||
dismiss()
|
||||
}
|
||||
btnLobbyBrowser.setOnClickListener {
|
||||
LobbyBrowser(context).show()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -101,17 +125,21 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(alekpop, crueter): Disable context menu for self and if not moderator
|
||||
inner class NetPlayAdapter : RecyclerView.Adapter<NetPlayAdapter.NetPlayViewHolder>() {
|
||||
val netPlayItems = mutableListOf<NetPlayItems>()
|
||||
|
||||
abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
|
||||
abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
|
||||
View.OnClickListener {
|
||||
init {
|
||||
itemView.setOnClickListener(this)
|
||||
}
|
||||
|
||||
abstract fun bind(item: NetPlayItems)
|
||||
}
|
||||
|
||||
inner class TextViewHolder(private val binding: ItemTextNetplayBinding) : NetPlayViewHolder(binding.root) {
|
||||
inner class TextViewHolder(private val binding: ItemTextNetplayBinding) :
|
||||
NetPlayViewHolder(binding.root) {
|
||||
private lateinit var netPlayItem: NetPlayItems
|
||||
|
||||
override fun onClick(clicked: View) {}
|
||||
@@ -133,7 +161,8 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
}
|
||||
}
|
||||
|
||||
inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) : NetPlayViewHolder(binding.root) {
|
||||
inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) :
|
||||
NetPlayViewHolder(binding.root) {
|
||||
private lateinit var netPlayItems: NetPlayItems
|
||||
private val isModerator = NetPlayManager.netPlayIsModerator()
|
||||
|
||||
@@ -177,11 +206,35 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
val infos = NetPlayManager.netPlayRoomInfo()
|
||||
if (infos.isNotEmpty()) {
|
||||
val roomInfo = infos[0].split("|")
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_TEXT, roomInfo[0], NetPlayItems.TYPE_TEXT))
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_COUNT, "${infos.size - 1}/${roomInfo[1]}", NetPlayItems.TYPE_TEXT))
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_SEPARATOR, "", NetPlayItems.TYPE_SEPARATOR))
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_ROOM_TEXT,
|
||||
roomInfo[0],
|
||||
NetPlayItems.TYPE_TEXT
|
||||
)
|
||||
)
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_ROOM_COUNT,
|
||||
"${infos.size - 1}/${roomInfo[1]}",
|
||||
NetPlayItems.TYPE_TEXT
|
||||
)
|
||||
)
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_SEPARATOR,
|
||||
"",
|
||||
NetPlayItems.TYPE_SEPARATOR
|
||||
)
|
||||
)
|
||||
for (i in 1 until infos.size) {
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_MEMBER, infos[i], NetPlayItems.TYPE_BUTTON))
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_ROOM_MEMBER,
|
||||
infos[i],
|
||||
NetPlayItems.TYPE_BUTTON
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -191,12 +244,33 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NetPlayViewHolder {
|
||||
val inflater = LayoutInflater.from(parent.context)
|
||||
return when (viewType) {
|
||||
NetPlayItems.TYPE_TEXT -> TextViewHolder(ItemTextNetplayBinding.inflate(inflater, parent, false))
|
||||
NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(ItemButtonNetplayBinding.inflate(inflater, parent, false))
|
||||
NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(inflater.inflate(R.layout.item_separator_netplay, parent, false)) {
|
||||
NetPlayItems.TYPE_TEXT -> TextViewHolder(
|
||||
ItemTextNetplayBinding.inflate(
|
||||
inflater,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(
|
||||
ItemButtonNetplayBinding.inflate(
|
||||
inflater,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(
|
||||
inflater.inflate(
|
||||
R.layout.item_separator_netplay,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
) {
|
||||
override fun bind(item: NetPlayItems) {}
|
||||
override fun onClick(clicked: View) {}
|
||||
}
|
||||
|
||||
else -> throw IllegalStateException("Unsupported view type")
|
||||
}
|
||||
}
|
||||
@@ -208,10 +282,11 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
override fun getItemCount() = netPlayItems.size
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
fun refreshAdapterItems() {
|
||||
val handler = Handler(Looper.getMainLooper())
|
||||
|
||||
NetPlayManager.setOnAdapterRefreshListener() { type, msg ->
|
||||
NetPlayManager.setOnAdapterRefreshListener() { _, _ ->
|
||||
handler.post {
|
||||
adapter.netPlayItems.clear()
|
||||
adapter.loadMultiplayerMenu()
|
||||
@@ -220,14 +295,54 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
}
|
||||
}
|
||||
|
||||
abstract class TextValidatorWatcher(
|
||||
private val btnConfirm: Button,
|
||||
private val view: EditText,
|
||||
private val errorMessage: String
|
||||
) : TextWatcher {
|
||||
|
||||
companion object {
|
||||
val validStates: HashMap<EditText, Boolean> = hashMapOf()
|
||||
}
|
||||
abstract fun validate(s: String): Boolean
|
||||
|
||||
override fun beforeTextChanged(
|
||||
s: CharSequence?,
|
||||
start: Int,
|
||||
count: Int,
|
||||
after: Int
|
||||
) {
|
||||
}
|
||||
|
||||
override fun onTextChanged(
|
||||
s: CharSequence?,
|
||||
start: Int,
|
||||
before: Int,
|
||||
count: Int
|
||||
) {
|
||||
}
|
||||
|
||||
override fun afterTextChanged(s: Editable?) {
|
||||
val input = s.toString()
|
||||
val isValid = validate(input)
|
||||
view.error = if (isValid) null else errorMessage
|
||||
|
||||
validStates.put(view, isValid)
|
||||
btnConfirm.isEnabled = !validStates.containsValue(false)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(alekpop, crueter): Properly handle getting banned (both during and in future connects)
|
||||
private fun showNetPlayInputDialog(isCreateRoom: Boolean) {
|
||||
val activity = CompatUtils.findActivity(context)
|
||||
val dialog = BottomSheetDialog(activity)
|
||||
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
val validStates: HashMap<EditText, Boolean> = hashMapOf()
|
||||
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.skipCollapsed =
|
||||
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
val binding = DialogMultiplayerRoomBinding.inflate(LayoutInflater.from(activity))
|
||||
dialog.setContentView(binding.root)
|
||||
@@ -237,73 +352,177 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
else R.string.multiplayer_join_room
|
||||
)
|
||||
|
||||
binding.ipAddress.setText(
|
||||
if (isCreateRoom) NetPlayManager.getIpAddressByWifi(activity)
|
||||
else NetPlayManager.getRoomAddress(activity)
|
||||
)
|
||||
// setup listeners etc
|
||||
val roomNameWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm, // TODO(alekpop, crueter): Figure out a better way to deal with this?
|
||||
binding.roomName,
|
||||
context.getString(
|
||||
R.string.multiplayer_room_name_error
|
||||
)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.length in 3..20
|
||||
}
|
||||
}
|
||||
|
||||
val preferredWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.dropdownPreferredGameName,
|
||||
context.getString(R.string.multiplayer_required)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.isNotEmpty()
|
||||
}
|
||||
|
||||
override fun afterTextChanged(s: Editable?) {
|
||||
super.afterTextChanged(s)
|
||||
|
||||
// special case: remove dropdown arrow
|
||||
val input = s.toString()
|
||||
binding.preferredGameName.isEndIconVisible = validate(input)
|
||||
}
|
||||
}
|
||||
|
||||
val ipWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.ipAddress,
|
||||
context.getString(R.string.multiplayer_ip_error)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return try {
|
||||
InetAddress.getByName(s)
|
||||
s.length >= 7
|
||||
} catch (_: Exception) {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val usernameWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.username,
|
||||
context.getString(R.string.multiplayer_username_error)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.length >= 5
|
||||
}
|
||||
}
|
||||
|
||||
val portWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.ipPort,
|
||||
context.getString(R.string.multiplayer_port_error)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.toIntOrNull() in 1..65535
|
||||
}
|
||||
}
|
||||
|
||||
if (isCreateRoom) {
|
||||
binding.roomName.addTextChangedListener(roomNameWatcher)
|
||||
binding.dropdownPreferredGameName.addTextChangedListener(preferredWatcher)
|
||||
|
||||
binding.dropdownPreferredGameName.apply {
|
||||
setAdapter(
|
||||
ArrayAdapter(
|
||||
activity,
|
||||
R.layout.dropdown_item,
|
||||
gameNameList.map { it[0] }
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
binding.ipAddress.addTextChangedListener(ipWatcher)
|
||||
binding.ipPort.addTextChangedListener(portWatcher)
|
||||
binding.username.addTextChangedListener(usernameWatcher)
|
||||
|
||||
binding.ipPort.setText(NetPlayManager.getRoomPort(activity))
|
||||
binding.username.setText(NetPlayManager.getUsername(activity))
|
||||
|
||||
binding.roomName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.maxPlayersContainer.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, binding.maxPlayers.value.toInt())
|
||||
|
||||
binding.maxPlayers.addOnChangeListener { _, value, _ ->
|
||||
binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, value.toInt())
|
||||
// manually trigger text listeners
|
||||
if (isCreateRoom) {
|
||||
roomNameWatcher.afterTextChanged(binding.roomName.text)
|
||||
preferredWatcher.afterTextChanged(binding.dropdownPreferredGameName.text)
|
||||
}
|
||||
|
||||
ipWatcher.afterTextChanged(binding.ipAddress.text)
|
||||
portWatcher.afterTextChanged(binding.ipPort.text)
|
||||
usernameWatcher.afterTextChanged(binding.username.text)
|
||||
|
||||
binding.preferredGameName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.roomName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.maxPlayersContainer.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.maxPlayersLabel.text = context.getString(
|
||||
R.string.multiplayer_max_players_value,
|
||||
binding.maxPlayers.value.toInt()
|
||||
)
|
||||
|
||||
binding.maxPlayers.addOnChangeListener { _, value, _ ->
|
||||
binding.maxPlayersLabel.text =
|
||||
context.getString(R.string.multiplayer_max_players_value, value.toInt())
|
||||
}
|
||||
|
||||
// TODO(alekpop, crueter): Room descriptions
|
||||
// TODO(alekpop, crueter): Public room creation
|
||||
// TODO(alekpop, crueter): Preview preferred games
|
||||
binding.btnConfirm.setOnClickListener {
|
||||
binding.btnConfirm.isEnabled = false
|
||||
binding.btnConfirm.text = activity.getString(R.string.disabled_button_text)
|
||||
binding.btnConfirm.text =
|
||||
activity.getString(
|
||||
if (isCreateRoom) R.string.multiplayer_creating
|
||||
else R.string.multiplayer_joining
|
||||
)
|
||||
|
||||
// We don't need to worry about validation because it's already been done.
|
||||
val ipAddress = binding.ipAddress.text.toString()
|
||||
val username = binding.username.text.toString()
|
||||
val portStr = binding.ipPort.text.toString()
|
||||
val password = binding.password.text.toString()
|
||||
val port = portStr.toIntOrNull() ?: run {
|
||||
Toast.makeText(activity, R.string.multiplayer_port_invalid, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
return@setOnClickListener
|
||||
}
|
||||
val port = portStr.toInt()
|
||||
val roomName = binding.roomName.text.toString()
|
||||
val maxPlayers = binding.maxPlayers.value.toInt()
|
||||
|
||||
if (isCreateRoom && (roomName.length !in 3..20)) {
|
||||
Toast.makeText(activity, R.string.multiplayer_room_name_invalid, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
return@setOnClickListener
|
||||
}
|
||||
val preferredGameName = binding.dropdownPreferredGameName.text.toString()
|
||||
val preferredIdx = gameNameList.indexOfFirst { it[0] == preferredGameName }
|
||||
val preferredGameId = if (preferredIdx == -1) 0 else gameIdList[preferredIdx][0]
|
||||
|
||||
if (ipAddress.length < 7 || username.length < 5) {
|
||||
Toast.makeText(activity, R.string.multiplayer_input_invalid, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
} else {
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
val result = if (isCreateRoom) {
|
||||
NetPlayManager.netPlayCreateRoom(ipAddress, port, username, password, roomName, maxPlayers)
|
||||
} else {
|
||||
NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password)
|
||||
}
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
val result = if (isCreateRoom) {
|
||||
NetPlayManager.netPlayCreateRoom(
|
||||
ipAddress,
|
||||
port,
|
||||
username,
|
||||
preferredGameName,
|
||||
preferredGameId,
|
||||
password,
|
||||
roomName,
|
||||
maxPlayers
|
||||
)
|
||||
} else {
|
||||
NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password)
|
||||
}
|
||||
|
||||
if (result == 0) {
|
||||
NetPlayManager.setUsername(activity, username)
|
||||
NetPlayManager.setRoomPort(activity, portStr)
|
||||
if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress)
|
||||
Toast.makeText(
|
||||
YuzuApplication.appContext,
|
||||
if (isCreateRoom) R.string.multiplayer_create_room_success
|
||||
else R.string.multiplayer_join_room_success,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
dialog.dismiss()
|
||||
} else {
|
||||
Toast.makeText(activity, R.string.multiplayer_could_not_connect, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
}
|
||||
if (result == 0) {
|
||||
// TODO(alekpop, crueter): These need to be moved as settings, editable in a tab
|
||||
NetPlayManager.setUsername(activity, username)
|
||||
NetPlayManager.setRoomPort(activity, portStr)
|
||||
if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress)
|
||||
Toast.makeText(
|
||||
YuzuApplication.appContext,
|
||||
if (isCreateRoom) R.string.multiplayer_create_room_success
|
||||
else R.string.multiplayer_join_room_success,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
dialog.dismiss()
|
||||
} else {
|
||||
Toast.makeText(
|
||||
activity,
|
||||
R.string.multiplayer_could_not_connect,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -362,13 +581,15 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val binding = ItemBanListBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false)
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
)
|
||||
return ViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val isUsername = position < usernameBans.size
|
||||
val item = if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size]
|
||||
val item =
|
||||
if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size]
|
||||
|
||||
holder.binding.apply {
|
||||
banText.text = item
|
||||
|
@@ -0,0 +1,85 @@
|
||||
package org.yuzu.yuzu_emu.features.fetcher
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.yuzu.yuzu_emu.databinding.ItemDriverGroupBinding
|
||||
import org.yuzu.yuzu_emu.fragments.DriverFetcherFragment.DriverGroup
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.transition.AutoTransition
|
||||
import androidx.transition.ChangeBounds
|
||||
import androidx.transition.Fade
|
||||
import androidx.transition.TransitionManager
|
||||
import androidx.transition.TransitionSet
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import org.yuzu.yuzu_emu.model.DriverViewModel
|
||||
|
||||
class DriverGroupAdapter(
|
||||
private val activity: FragmentActivity,
|
||||
private val driverViewModel: DriverViewModel
|
||||
) : RecyclerView.Adapter<DriverGroupAdapter.DriverGroupViewHolder>() {
|
||||
private var driverGroups: List<DriverGroup> = emptyList()
|
||||
|
||||
inner class DriverGroupViewHolder(
|
||||
private val binding: ItemDriverGroupBinding
|
||||
) : RecyclerView.ViewHolder(binding.root) {
|
||||
fun bind(group: DriverGroup) {
|
||||
val onClick = {
|
||||
TransitionManager.beginDelayedTransition(
|
||||
binding.root,
|
||||
TransitionSet().addTransition(Fade()).addTransition(ChangeBounds())
|
||||
.setDuration(200)
|
||||
)
|
||||
val isVisible = binding.recyclerReleases.isVisible
|
||||
|
||||
binding.recyclerReleases.visibility = if (isVisible) View.GONE else View.VISIBLE
|
||||
binding.imageDropdownArrow.rotation = if (isVisible) 0f else 180f
|
||||
|
||||
if (!isVisible && binding.recyclerReleases.adapter == null) {
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
binding.recyclerReleases.layoutManager =
|
||||
LinearLayoutManager(binding.root.context)
|
||||
binding.recyclerReleases.adapter =
|
||||
ReleaseAdapter(group.releases, activity, driverViewModel)
|
||||
|
||||
binding.recyclerReleases.addItemDecoration(
|
||||
SpacingItemDecoration(
|
||||
(activity.resources.displayMetrics.density * 8).toInt()
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.textGroupName.text = group.name
|
||||
binding.textGroupName.setOnClickListener { onClick() }
|
||||
|
||||
binding.imageDropdownArrow.setOnClickListener { onClick() }
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DriverGroupViewHolder {
|
||||
val binding = ItemDriverGroupBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
)
|
||||
return DriverGroupViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: DriverGroupViewHolder, position: Int) {
|
||||
holder.bind(driverGroups[position])
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = driverGroups.size
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
fun updateDriverGroups(newDriverGroups: List<DriverGroup>) {
|
||||
driverGroups = newDriverGroups
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
}
|
@@ -0,0 +1,267 @@
|
||||
package org.yuzu.yuzu_emu.features.fetcher
|
||||
|
||||
import android.animation.LayoutTransition
|
||||
import android.content.res.ColorStateList
|
||||
import android.text.Html
|
||||
import android.text.Html.FROM_HTML_MODE_COMPACT
|
||||
import android.text.TextUtils
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.databinding.ItemReleaseBinding
|
||||
import org.yuzu.yuzu_emu.fragments.DriverFetcherFragment.Release
|
||||
import androidx.core.net.toUri
|
||||
import androidx.transition.ChangeBounds
|
||||
import androidx.transition.Fade
|
||||
import androidx.transition.TransitionManager
|
||||
import androidx.transition.TransitionSet
|
||||
import com.google.android.material.color.MaterialColors
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import org.commonmark.parser.Parser
|
||||
import org.commonmark.renderer.html.HtmlRenderer
|
||||
import org.yuzu.yuzu_emu.databinding.DialogProgressBinding
|
||||
import org.yuzu.yuzu_emu.model.DriverViewModel
|
||||
import org.yuzu.yuzu_emu.utils.FileUtil
|
||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
|
||||
class ReleaseAdapter(
|
||||
private val releases: List<Release>,
|
||||
private val activity: FragmentActivity,
|
||||
private val driverViewModel: DriverViewModel
|
||||
) : RecyclerView.Adapter<ReleaseAdapter.ReleaseViewHolder>() {
|
||||
|
||||
inner class ReleaseViewHolder(
|
||||
private val binding: ItemReleaseBinding
|
||||
) : RecyclerView.ViewHolder(binding.root) {
|
||||
private var isPreview: Boolean = true
|
||||
private val client = OkHttpClient()
|
||||
private val markdownParser = Parser.builder().build()
|
||||
private val htmlRenderer = HtmlRenderer.builder().build()
|
||||
|
||||
init {
|
||||
binding.root.let { root ->
|
||||
val layoutTransition = root.layoutTransition ?: LayoutTransition().apply {
|
||||
enableTransitionType(LayoutTransition.CHANGING)
|
||||
setDuration(125)
|
||||
}
|
||||
root.layoutTransition = layoutTransition
|
||||
}
|
||||
|
||||
(binding.textBody.parent as ViewGroup).isTransitionGroup = false
|
||||
binding.containerDownloads.isTransitionGroup = false
|
||||
}
|
||||
|
||||
fun bind(release: Release) {
|
||||
binding.textReleaseName.text = release.title
|
||||
binding.badgeLatest.isVisible = release.latest
|
||||
|
||||
// truncates to 150 chars so it does not take up too much space.
|
||||
var bodyPreview = release.body.take(150)
|
||||
bodyPreview = bodyPreview.replace("#", "").removeSurrounding(" ");
|
||||
|
||||
val body =
|
||||
bodyPreview.replace("\\r\\n", "\n").replace("\\n", "\n").replace("\n", "<br>")
|
||||
|
||||
binding.textBody.text = Html.fromHtml(body, FROM_HTML_MODE_COMPACT)
|
||||
|
||||
binding.textBody.setOnClickListener {
|
||||
TransitionManager.beginDelayedTransition(
|
||||
binding.root,
|
||||
TransitionSet().addTransition(Fade()).addTransition(ChangeBounds())
|
||||
.setDuration(100)
|
||||
)
|
||||
|
||||
isPreview = !isPreview
|
||||
if (isPreview) {
|
||||
val body = bodyPreview.replace("\\r\\n", "\n").replace("\\n", "\n")
|
||||
.replace("\n", "<br>")
|
||||
|
||||
binding.textBody.text = Html.fromHtml(body, FROM_HTML_MODE_COMPACT)
|
||||
binding.textBody.maxLines = 3
|
||||
binding.textBody.ellipsize = TextUtils.TruncateAt.END
|
||||
} else {
|
||||
val body = release.body.replace("\\r\\n", "\n\n").replace("\\n", "\n\n")
|
||||
|
||||
try {
|
||||
val doc = markdownParser.parse(body)
|
||||
val html = htmlRenderer.render(doc)
|
||||
binding.textBody.text = Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
binding.textBody.text = body
|
||||
}
|
||||
|
||||
binding.textBody.maxLines = Integer.MAX_VALUE
|
||||
binding.textBody.ellipsize = null
|
||||
}
|
||||
}
|
||||
|
||||
val onDownloadsClick = {
|
||||
val isVisible = binding.containerDownloads.isVisible
|
||||
TransitionManager.beginDelayedTransition(
|
||||
binding.root,
|
||||
TransitionSet().addTransition(Fade()).addTransition(ChangeBounds())
|
||||
.setDuration(100)
|
||||
)
|
||||
|
||||
binding.containerDownloads.isVisible = !isVisible
|
||||
|
||||
binding.imageDownloadsArrow.rotation = if (isVisible) 0f else 180f
|
||||
binding.buttonToggleDownloads.text =
|
||||
if (isVisible) activity.getString(R.string.show_downloads)
|
||||
else activity.getString(R.string.hide_downloads)
|
||||
}
|
||||
|
||||
binding.buttonToggleDownloads.setOnClickListener {
|
||||
onDownloadsClick()
|
||||
}
|
||||
|
||||
binding.imageDownloadsArrow.setOnClickListener {
|
||||
onDownloadsClick()
|
||||
}
|
||||
|
||||
binding.containerDownloads.removeAllViews()
|
||||
|
||||
release.artifacts.forEach { artifact ->
|
||||
val button = MaterialButton(binding.root.context).apply {
|
||||
text = artifact.name
|
||||
setTextAppearance(com.google.android.material.R.style.TextAppearance_Material3_LabelLarge)
|
||||
textAlignment = MaterialButton.TEXT_ALIGNMENT_VIEW_START
|
||||
setBackgroundColor(context.getColor(com.google.android.material.R.color.m3_button_background_color_selector))
|
||||
setIconResource(R.drawable.ic_import)
|
||||
iconTint = ColorStateList.valueOf(
|
||||
MaterialColors.getColor(
|
||||
this,
|
||||
com.google.android.material.R.attr.colorPrimary
|
||||
)
|
||||
)
|
||||
|
||||
elevation = 6f
|
||||
layoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
setOnClickListener {
|
||||
val dialogBinding =
|
||||
DialogProgressBinding.inflate(LayoutInflater.from(context))
|
||||
dialogBinding.progressBar.isIndeterminate = true
|
||||
dialogBinding.title.text = context.getString(R.string.installing_driver)
|
||||
dialogBinding.status.text = context.getString(R.string.downloading)
|
||||
|
||||
val progressDialog = MaterialAlertDialogBuilder(context)
|
||||
.setView(dialogBinding.root)
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
|
||||
progressDialog.show()
|
||||
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
try {
|
||||
val request = Request.Builder()
|
||||
.url(artifact.url)
|
||||
.header("Accept", "application/octet-stream")
|
||||
.build()
|
||||
|
||||
val cacheDir = context.externalCacheDir ?: throw IOException(
|
||||
context.getString(R.string.failed_cache_dir)
|
||||
)
|
||||
|
||||
cacheDir.mkdirs()
|
||||
|
||||
val file = File(cacheDir, artifact.name)
|
||||
|
||||
withContext(Dispatchers.IO) {
|
||||
client.newBuilder()
|
||||
.followRedirects(true)
|
||||
.followSslRedirects(true)
|
||||
.build()
|
||||
.newCall(request).execute().use { response ->
|
||||
if (!response.isSuccessful) {
|
||||
throw IOException("${response.code}")
|
||||
}
|
||||
|
||||
response.body?.byteStream()?.use { input ->
|
||||
FileOutputStream(file).use { output ->
|
||||
input.copyTo(output)
|
||||
}
|
||||
}
|
||||
?: throw IOException(context.getString(R.string.empty_response_body))
|
||||
}
|
||||
}
|
||||
|
||||
if (file.length() == 0L) {
|
||||
throw IOException(context.getString(R.string.driver_empty))
|
||||
}
|
||||
|
||||
dialogBinding.status.text = context.getString(R.string.installing)
|
||||
|
||||
val driverData = GpuDriverHelper.getMetadataFromZip(file)
|
||||
val driverPath =
|
||||
"${GpuDriverHelper.driverStoragePath}${FileUtil.getFilename(file.toUri())}"
|
||||
|
||||
if (GpuDriverHelper.copyDriverToInternalStorage(file.toUri())) {
|
||||
driverViewModel.onDriverAdded(Pair(driverPath, driverData))
|
||||
|
||||
progressDialog.dismiss()
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(
|
||||
R.string.successfully_installed,
|
||||
driverData.name
|
||||
),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
} else {
|
||||
throw IOException(
|
||||
context.getString(
|
||||
R.string.failed_install_driver,
|
||||
artifact.name
|
||||
)
|
||||
)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
progressDialog.dismiss()
|
||||
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle(context.getString(R.string.driver_failed_title))
|
||||
.setMessage(e.message)
|
||||
.setPositiveButton(R.string.ok) { dialog, _ ->
|
||||
dialog.cancel()
|
||||
}
|
||||
.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
binding.containerDownloads.addView(button)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReleaseViewHolder {
|
||||
val binding = ItemReleaseBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
)
|
||||
return ReleaseViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ReleaseViewHolder, position: Int) {
|
||||
holder.bind(releases[position])
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = releases.size
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package org.yuzu.yuzu_emu.features.fetcher
|
||||
|
||||
import android.graphics.Rect
|
||||
import android.view.View
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
||||
class SpacingItemDecoration(private val spacing: Int) : RecyclerView.ItemDecoration() {
|
||||
override fun getItemOffsets(
|
||||
outRect: Rect,
|
||||
view: View,
|
||||
parent: RecyclerView,
|
||||
state: RecyclerView.State
|
||||
) {
|
||||
outRect.bottom = spacing
|
||||
if (parent.getChildAdapterPosition(view) == 0) {
|
||||
outRect.top = spacing
|
||||
}
|
||||
}
|
||||
}
|
@@ -29,19 +29,28 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||
JOYSTICK_REL_CENTER("joystick_rel_center"),
|
||||
DPAD_SLIDE("dpad_slide"),
|
||||
HAPTIC_FEEDBACK("haptic_feedback"),
|
||||
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
|
||||
SHOW_INPUT_OVERLAY("show_input_overlay"),
|
||||
TOUCHSCREEN("touchscreen"),
|
||||
SHOW_THERMAL_OVERLAY("show_thermal_overlay"),
|
||||
|
||||
SHOW_SOC_OVERLAY("show_soc_overlay"),
|
||||
SHOW_DEVICE_MODEL("show_device_model"),
|
||||
SHOW_GPU_MODEL("show_gpu_model"),
|
||||
SHOW_SOC_MODEL("show_soc_model"),
|
||||
|
||||
SOC_OVERLAY_BACKGROUND("soc_overlay_background"),
|
||||
|
||||
FRAME_INTERPOLATION("frame_interpolation"),
|
||||
// FRAME_SKIPPING("frame_skipping"),
|
||||
|
||||
PERF_OVERLAY_BACKGROUND("perf_overlay_background"),
|
||||
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
|
||||
|
||||
SHOW_FPS("show_fps"),
|
||||
SHOW_FRAMETIME("show_frame_time"),
|
||||
SHOW_APP_RAM_USAGE("show_app_ram_usage"),
|
||||
SHOW_SYSTEM_RAM_USAGE("show_system_ram_usage"),
|
||||
SHOW_BAT_TEMPERATURE("show_bat_temperature"),
|
||||
SHOW_SHADERS_BUILDING("show_shaders_building"),
|
||||
OVERLAY_BACKGROUND("overlay_background"),
|
||||
DEBUG_FLUSH_BY_LINE("flush_lines"),
|
||||
USE_LRU_CACHE("use_lru_cache"),;
|
||||
// external fun isFrameSkippingEnabled(): Boolean
|
||||
|
@@ -33,6 +33,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
||||
LOCK_DRAWER("lock_drawer"),
|
||||
VERTICAL_ALIGNMENT("vertical_alignment"),
|
||||
PERF_OVERLAY_POSITION("perf_overlay_position"),
|
||||
SOC_OVERLAY_POSITION("soc_overlay_position"),
|
||||
MEMORY_LAYOUT("memory_layout_mode"),
|
||||
FSR_SHARPENING_SLIDER("fsr_sharpening_slider"),
|
||||
FAST_CPU_TIME("fast_cpu_time"),
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@ object Settings {
|
||||
SECTION_ROOT(R.string.advanced_settings),
|
||||
SECTION_SYSTEM(R.string.preferences_system),
|
||||
SECTION_RENDERER(R.string.preferences_graphics),
|
||||
SECTION_PERFORMANCE_STATS(R.string.show_stats_overlay),
|
||||
SECTION_PERFORMANCE_STATS(R.string.stats_overlay_options),
|
||||
SECTION_SOC_OVERLAY(R.string.soc_overlay_options),
|
||||
SECTION_AUDIO(R.string.preferences_audio),
|
||||
SECTION_INPUT(R.string.preferences_controls),
|
||||
SECTION_INPUT_PLAYER_ONE,
|
||||
@@ -33,6 +34,7 @@ object Settings {
|
||||
YuzuApplication.appContext.getString(R.string.preferences_player, player)
|
||||
|
||||
const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
|
||||
const val PREF_SHOULD_SHOW_DRIVER_WARNING = "ShouldShowDriverWarning"
|
||||
const val PREF_SHOULD_SHOW_PRE_ALPHA_WARNING = "ShouldShowPreAlphaWarning"
|
||||
const val PREF_SHOULD_SHOW_PRE_ALPHA_BANNER = "ShouldShowPreAlphaBanner"
|
||||
const val PREF_SHOULD_SHOW_EDENS_VEIL_DIALOG = "ShouldShowEdensVeilDialog"
|
||||
|
@@ -7,7 +7,12 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||
|
||||
enum class StringSetting(override val key: String) : AbstractStringSetting {
|
||||
DRIVER_PATH("driver_path"),
|
||||
DEVICE_NAME("device_name");
|
||||
DEVICE_NAME("device_name"),
|
||||
|
||||
// TODO(crueter, alekpop): Netplay/settings needs to be properly worked into settings
|
||||
WEB_TOKEN("yuzu_token"),
|
||||
WEB_USERNAME("yuzu_username"),
|
||||
;
|
||||
|
||||
override fun getString(needsGlobal: Boolean): String = NativeConfig.getString(key, needsGlobal)
|
||||
|
||||
|
@@ -274,6 +274,13 @@ abstract class SettingsItem(
|
||||
descriptionId = R.string.use_custom_rtc_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
StringInputSetting(
|
||||
StringSetting.WEB_TOKEN,
|
||||
titleId = R.string.web_token,
|
||||
descriptionId = R.string.web_token_description
|
||||
)
|
||||
)
|
||||
put(DateTimeSetting(LongSetting.CUSTOM_RTC, titleId = R.string.set_custom_rtc))
|
||||
put(
|
||||
SingleChoiceSetting(
|
||||
@@ -337,6 +344,7 @@ abstract class SettingsItem(
|
||||
valuesId = R.array.rendererResolutionValues
|
||||
)
|
||||
)
|
||||
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SHOW_PERFORMANCE_OVERLAY,
|
||||
@@ -346,9 +354,9 @@ abstract class SettingsItem(
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.OVERLAY_BACKGROUND,
|
||||
R.string.overlay_background,
|
||||
descriptionId = R.string.overlay_background_description
|
||||
BooleanSetting.PERF_OVERLAY_BACKGROUND,
|
||||
R.string.perf_overlay_background,
|
||||
descriptionId = R.string.perf_overlay_background_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
@@ -360,6 +368,7 @@ abstract class SettingsItem(
|
||||
valuesId = R.array.staticThemeValues
|
||||
)
|
||||
)
|
||||
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SHOW_FPS,
|
||||
@@ -402,6 +411,53 @@ abstract class SettingsItem(
|
||||
descriptionId = R.string.show_shaders_building_description
|
||||
)
|
||||
)
|
||||
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SHOW_SOC_OVERLAY,
|
||||
R.string.enable_soc_overlay,
|
||||
descriptionId = R.string.soc_overlay_options_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SOC_OVERLAY_BACKGROUND,
|
||||
R.string.perf_overlay_background,
|
||||
descriptionId = R.string.perf_overlay_background_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SingleChoiceSetting(
|
||||
IntSetting.SOC_OVERLAY_POSITION,
|
||||
titleId = R.string.overlay_position,
|
||||
descriptionId = R.string.overlay_position_description,
|
||||
choicesId = R.array.statsPosition,
|
||||
valuesId = R.array.staticThemeValues
|
||||
)
|
||||
)
|
||||
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SHOW_DEVICE_MODEL,
|
||||
titleId = R.string.show_device_model,
|
||||
descriptionId = R.string.show_device_model_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SHOW_GPU_MODEL,
|
||||
titleId = R.string.show_gpu_model,
|
||||
descriptionId = R.string.show_gpu_model_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SHOW_SOC_MODEL,
|
||||
titleId = R.string.show_soc_model,
|
||||
descriptionId = R.string.show_soc_model_description
|
||||
)
|
||||
)
|
||||
|
||||
put(
|
||||
SingleChoiceSetting(
|
||||
IntSetting.RENDERER_VSYNC,
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.features.settings.ui
|
||||
@@ -97,6 +97,7 @@ class SettingsFragmentPresenter(
|
||||
MenuTag.SECTION_SYSTEM -> addSystemSettings(sl)
|
||||
MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl)
|
||||
MenuTag.SECTION_PERFORMANCE_STATS -> addPerformanceOverlaySettings(sl)
|
||||
MenuTag.SECTION_SOC_OVERLAY -> addSocOverlaySettings(sl)
|
||||
MenuTag.SECTION_AUDIO -> addAudioSettings(sl)
|
||||
MenuTag.SECTION_INPUT -> addInputSettings(sl)
|
||||
MenuTag.SECTION_INPUT_PLAYER_ONE -> addInputPlayer(sl, 0)
|
||||
@@ -138,7 +139,7 @@ class SettingsFragmentPresenter(
|
||||
menuKey = MenuTag.SECTION_RENDERER
|
||||
)
|
||||
)
|
||||
if (!NativeConfig.isPerGameConfigLoaded())
|
||||
if (!NativeConfig.isPerGameConfigLoaded()) {
|
||||
add(
|
||||
SubmenuSetting(
|
||||
titleId = R.string.stats_overlay_options,
|
||||
@@ -147,6 +148,16 @@ class SettingsFragmentPresenter(
|
||||
menuKey = MenuTag.SECTION_PERFORMANCE_STATS
|
||||
)
|
||||
)
|
||||
|
||||
add(
|
||||
SubmenuSetting(
|
||||
titleId = R.string.soc_overlay_options,
|
||||
descriptionId = R.string.soc_overlay_options_description,
|
||||
iconId = R.drawable.ic_system,
|
||||
menuKey = MenuTag.SECTION_SOC_OVERLAY
|
||||
)
|
||||
)
|
||||
}
|
||||
add(
|
||||
SubmenuSetting(
|
||||
titleId = R.string.preferences_audio,
|
||||
@@ -200,6 +211,10 @@ class SettingsFragmentPresenter(
|
||||
add(IntSetting.LANGUAGE_INDEX.key)
|
||||
add(BooleanSetting.USE_CUSTOM_RTC.key)
|
||||
add(LongSetting.CUSTOM_RTC.key)
|
||||
|
||||
// TODO(alekpop): Add functionality
|
||||
// add(HeaderSetting(R.string.network))
|
||||
// add(StringSetting.WEB_TOKEN.key)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,8 +242,9 @@ class SettingsFragmentPresenter(
|
||||
sl.apply {
|
||||
add(HeaderSetting(R.string.stats_overlay_customization))
|
||||
add(BooleanSetting.SHOW_PERFORMANCE_OVERLAY.key)
|
||||
add(BooleanSetting.OVERLAY_BACKGROUND.key)
|
||||
add(BooleanSetting.PERF_OVERLAY_BACKGROUND.key)
|
||||
add(IntSetting.PERF_OVERLAY_POSITION.key)
|
||||
|
||||
add(HeaderSetting(R.string.stats_overlay_items))
|
||||
add(BooleanSetting.SHOW_FPS.key)
|
||||
add(BooleanSetting.SHOW_FRAMETIME.key)
|
||||
@@ -237,7 +253,24 @@ class SettingsFragmentPresenter(
|
||||
add(BooleanSetting.SHOW_BAT_TEMPERATURE.key)
|
||||
add(BooleanSetting.SHOW_SHADERS_BUILDING.key)
|
||||
}
|
||||
}
|
||||
|
||||
private fun addSocOverlaySettings(sl: ArrayList<SettingsItem>) {
|
||||
sl.apply {
|
||||
add(HeaderSetting(R.string.stats_overlay_customization))
|
||||
add(BooleanSetting.SHOW_SOC_OVERLAY.key)
|
||||
add(BooleanSetting.SOC_OVERLAY_BACKGROUND.key)
|
||||
add(IntSetting.SOC_OVERLAY_POSITION.key)
|
||||
|
||||
add(HeaderSetting(R.string.stats_overlay_items))
|
||||
add(BooleanSetting.SHOW_DEVICE_MODEL.key)
|
||||
add(BooleanSetting.SHOW_GPU_MODEL.key)
|
||||
|
||||
// the Build.SOC_MODEL API is 31+ only
|
||||
if (Build.VERSION.SDK_INT >= 31) {
|
||||
add(BooleanSetting.SHOW_SOC_MODEL.key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun addAudioSettings(sl: ArrayList<SettingsItem>) {
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -0,0 +1,307 @@
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
||||
import android.app.AlertDialog
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.Fragment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updatePadding
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.navigation.findNavController
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.fasterxml.jackson.databind.JsonNode
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.transition.MaterialSharedAxis
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.databinding.FragmentDriverFetcherBinding
|
||||
import org.yuzu.yuzu_emu.features.fetcher.DriverGroupAdapter
|
||||
import org.yuzu.yuzu_emu.model.DriverViewModel
|
||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||
import org.yuzu.yuzu_emu.utils.Log
|
||||
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
|
||||
import java.io.IOException
|
||||
import java.net.URL
|
||||
import kotlin.getValue
|
||||
|
||||
class DriverFetcherFragment : Fragment() {
|
||||
private var _binding: FragmentDriverFetcherBinding? = null
|
||||
private val binding get() = _binding!!
|
||||
|
||||
private val client = OkHttpClient()
|
||||
|
||||
private val gpuModel: String?
|
||||
get() = GpuDriverHelper.getGpuModel()
|
||||
|
||||
private val adrenoModel: Int
|
||||
get() = parseAdrenoModel()
|
||||
|
||||
private val recommendedDriver: String
|
||||
get() = driverMap.firstOrNull { adrenoModel in it.first }?.second ?: "Unsupported"
|
||||
|
||||
private data class DriverRepo(
|
||||
val name: String = "",
|
||||
val path: String = "",
|
||||
val sort: Int = 0,
|
||||
val useTagName: Boolean = false
|
||||
)
|
||||
|
||||
private val repoList: List<DriverRepo> = listOf(
|
||||
DriverRepo("Mr. Purple Turnip", "MrPurple666/purple-turnip", 0),
|
||||
DriverRepo("GameHub Adreno 8xx", "crueter/GameHub-8Elite-Drivers", 1),
|
||||
DriverRepo("KIMCHI Turnip", "K11MCH1/AdrenoToolsDrivers", 2, true),
|
||||
DriverRepo("Weab-Chan Freedreno", "Weab-chan/freedreno_turnip-CI", 3),
|
||||
)
|
||||
|
||||
private val driverMap = listOf(
|
||||
IntRange(Integer.MIN_VALUE, 9) to "Unsupported",
|
||||
IntRange(10, 99) to "KIMCHI Latest", // Special case for Adreno Axx
|
||||
IntRange(100, 599) to "Unsupported",
|
||||
IntRange(600, 639) to "Mr. Purple EOL-24.3.4",
|
||||
IntRange(640, 699) to "Mr. Purple T19",
|
||||
IntRange(700, 710) to "KIMCHI 25.2.0_r5",
|
||||
IntRange(711, 799) to "Mr. Purple T21",
|
||||
IntRange(800, 899) to "GameHub Adreno 8xx",
|
||||
IntRange(900, Int.MAX_VALUE) to "Unsupported",
|
||||
)
|
||||
|
||||
private lateinit var driverGroupAdapter: DriverGroupAdapter
|
||||
private val driverViewModel: DriverViewModel by activityViewModels()
|
||||
|
||||
fun parseAdrenoModel(): Int {
|
||||
if (gpuModel == null) {
|
||||
return 0
|
||||
}
|
||||
|
||||
val modelList = gpuModel!!.split(" ")
|
||||
|
||||
// format: Adreno (TM) <ModelNumber>
|
||||
if (modelList.size < 3 || modelList[0] != "Adreno") {
|
||||
return 0
|
||||
}
|
||||
|
||||
val model = modelList[2]
|
||||
|
||||
try {
|
||||
// special case for Axx GPUs (e.g. AYANEO Pocket S2)
|
||||
// driverMap has specific ranges for this
|
||||
if (model.startsWith("A")) {
|
||||
return model.substring(1).toInt()
|
||||
}
|
||||
|
||||
return model.toInt()
|
||||
} catch (e: Exception) {
|
||||
// Model parse error, just say unsupported
|
||||
e.printStackTrace()
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
||||
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
_binding = FragmentDriverFetcherBinding.inflate(inflater)
|
||||
binding.badgeRecommendedDriver.text = recommendedDriver
|
||||
binding.badgeGpuModel.text = gpuModel
|
||||
|
||||
return binding.root
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
binding.toolbarDrivers.setNavigationOnClickListener {
|
||||
binding.root.findNavController().popBackStack()
|
||||
}
|
||||
|
||||
binding.listDrivers.layoutManager = LinearLayoutManager(context)
|
||||
driverGroupAdapter = DriverGroupAdapter(requireActivity(), driverViewModel)
|
||||
binding.listDrivers.adapter = driverGroupAdapter
|
||||
|
||||
setInsets()
|
||||
|
||||
fetchDrivers()
|
||||
}
|
||||
|
||||
private fun fetchDrivers() {
|
||||
binding.loadingIndicator.isVisible = true
|
||||
|
||||
val driverGroups = arrayListOf<DriverGroup>()
|
||||
|
||||
repoList.forEach { driver ->
|
||||
val name = driver.name
|
||||
val path = driver.path
|
||||
val useTagName = driver.useTagName
|
||||
val sort = driver.sort
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
val request = Request.Builder()
|
||||
.url("https://api.github.com/repos/$path/releases")
|
||||
.build()
|
||||
|
||||
withContext(Dispatchers.IO) {
|
||||
var releases: ArrayList<Release>
|
||||
try {
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (!response.isSuccessful) {
|
||||
throw IOException(response.body.toString())
|
||||
}
|
||||
|
||||
val body = response.body?.string() ?: return@withContext
|
||||
releases = Release.fromJsonArray(body, useTagName)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
withContext(Dispatchers.Main) {
|
||||
MaterialAlertDialogBuilder(requireActivity().applicationContext)
|
||||
.setTitle(getString(R.string.error_during_fetch))
|
||||
.setMessage("${getString(R.string.failed_to_fetch)} ${name}:\n${e.message}")
|
||||
.setPositiveButton(getString(R.string.ok)) { dialog, _ -> dialog.cancel() }
|
||||
.show()
|
||||
|
||||
releases = ArrayList<Release>()
|
||||
}
|
||||
}
|
||||
|
||||
val driver = DriverGroup(
|
||||
name,
|
||||
releases,
|
||||
sort
|
||||
)
|
||||
|
||||
synchronized(driverGroups) {
|
||||
driverGroups.add(driver)
|
||||
driverGroups.sortBy {
|
||||
it.sort
|
||||
}
|
||||
}
|
||||
|
||||
withContext(Dispatchers.Main) {
|
||||
driverGroupAdapter.updateDriverGroups(driverGroups)
|
||||
|
||||
if (driverGroups.size >= repoList.size) {
|
||||
binding.loadingIndicator.isVisible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setInsets() =
|
||||
ViewCompat.setOnApplyWindowInsetsListener(
|
||||
binding.root
|
||||
) { _: View, windowInsets: WindowInsetsCompat ->
|
||||
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
|
||||
|
||||
val leftInsets = barInsets.left + cutoutInsets.left
|
||||
val rightInsets = barInsets.right + cutoutInsets.right
|
||||
|
||||
binding.toolbarDrivers.updateMargins(left = leftInsets, right = rightInsets)
|
||||
binding.listDrivers.updateMargins(left = leftInsets, right = rightInsets)
|
||||
|
||||
binding.listDrivers.updatePadding(
|
||||
bottom = barInsets.bottom +
|
||||
resources.getDimensionPixelSize(R.dimen.spacing_bottom_list_fab)
|
||||
)
|
||||
|
||||
windowInsets
|
||||
}
|
||||
|
||||
data class Artifact(val url: URL, val name: String)
|
||||
|
||||
data class Release(
|
||||
var tagName: String = "",
|
||||
var title: String = "",
|
||||
var body: String = "",
|
||||
var artifacts: List<Artifact> = ArrayList<Artifact>(),
|
||||
var prerelease: Boolean = false,
|
||||
var latest: Boolean = false
|
||||
) {
|
||||
companion object {
|
||||
fun fromJsonArray(jsonString: String, useTagName: Boolean): ArrayList<Release> {
|
||||
val mapper = jacksonObjectMapper()
|
||||
|
||||
try {
|
||||
val rootNode = mapper.readTree(jsonString)
|
||||
|
||||
val releases = ArrayList<Release>()
|
||||
|
||||
var latestRelease: Release? = null
|
||||
|
||||
if (rootNode.isArray) {
|
||||
rootNode.forEach { node ->
|
||||
val release = fromJson(node, useTagName)
|
||||
|
||||
if (latestRelease == null && !release.prerelease) {
|
||||
latestRelease = release
|
||||
release.latest = true
|
||||
}
|
||||
|
||||
releases.add(release)
|
||||
}
|
||||
}
|
||||
|
||||
return releases
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
return ArrayList<Release>()
|
||||
}
|
||||
}
|
||||
|
||||
fun fromJson(node: JsonNode, useTagName: Boolean): Release {
|
||||
try {
|
||||
val tagName = node.get("tag_name").toString().removeSurrounding("\"")
|
||||
val body = node.get("body").toString().removeSurrounding("\"")
|
||||
val prerelease = node.get("prerelease").toString().toBoolean()
|
||||
val title = if (useTagName) tagName else node.get("name").toString().removeSurrounding("\"")
|
||||
|
||||
val assets = node.get("assets")
|
||||
val artifacts = ArrayList<Artifact>()
|
||||
if (assets?.isArray == true) {
|
||||
assets.forEach { node ->
|
||||
val urlStr =
|
||||
node.get("browser_download_url").toString().removeSurrounding("\"")
|
||||
|
||||
val url = URL(urlStr)
|
||||
val name = node.get("name").toString().removeSurrounding("\"")
|
||||
|
||||
val artifact = Artifact(url, name)
|
||||
artifacts.add(artifact)
|
||||
}
|
||||
}
|
||||
|
||||
return Release(tagName, title, body, artifacts, prerelease)
|
||||
} catch (e: Exception) {
|
||||
// TODO: handle malformed input.
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
return Release()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class DriverGroup(
|
||||
val name: String,
|
||||
val releases: ArrayList<Release>,
|
||||
val sort: Int,
|
||||
)
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
@@ -8,6 +8,7 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.updatePadding
|
||||
@@ -15,6 +16,7 @@ import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.navigation.findNavController
|
||||
import androidx.navigation.fragment.navArgs
|
||||
import androidx.preference.PreferenceManager
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import com.google.android.material.transition.MaterialSharedAxis
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -23,6 +25,8 @@ import kotlinx.coroutines.withContext
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.adapters.DriverAdapter
|
||||
import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding
|
||||
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
|
||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
|
||||
import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
|
||||
import org.yuzu.yuzu_emu.model.DriverViewModel
|
||||
@@ -103,6 +107,10 @@ class DriverManagerFragment : Fragment() {
|
||||
getDriver.launch(arrayOf("application/zip"))
|
||||
}
|
||||
|
||||
binding.buttonFetch.setOnClickListener {
|
||||
binding.root.findNavController().navigate(R.id.action_driverManagerFragment_to_driverFetcherFragment)
|
||||
}
|
||||
|
||||
binding.listDrivers.apply {
|
||||
layoutManager = GridLayoutManager(
|
||||
requireContext(),
|
||||
@@ -112,6 +120,10 @@ class DriverManagerFragment : Fragment() {
|
||||
}
|
||||
|
||||
setInsets()
|
||||
|
||||
if (!GpuDriverHelper.supportsCustomDriverLoading()) {
|
||||
showDriverWarningDialog()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
@@ -139,6 +151,12 @@ class DriverManagerFragment : Fragment() {
|
||||
bottom = barInsets.bottom + fabSpacing
|
||||
)
|
||||
|
||||
binding.buttonFetch.updateMargins(
|
||||
left = leftInsets + fabSpacing,
|
||||
right = rightInsets + fabSpacing,
|
||||
bottom = barInsets.bottom + fabSpacing
|
||||
)
|
||||
|
||||
binding.listDrivers.updatePadding(
|
||||
bottom = barInsets.bottom +
|
||||
resources.getDimensionPixelSize(R.dimen.spacing_bottom_list_fab)
|
||||
@@ -195,4 +213,26 @@ class DriverManagerFragment : Fragment() {
|
||||
return@newInstance Any()
|
||||
}.show(childFragmentManager, ProgressDialogFragment.TAG)
|
||||
}
|
||||
|
||||
fun showDriverWarningDialog() {
|
||||
val shouldDisplayGpuWarning =
|
||||
PreferenceManager.getDefaultSharedPreferences(requireContext())
|
||||
.getBoolean(Settings.PREF_SHOULD_SHOW_DRIVER_WARNING, true)
|
||||
if (shouldDisplayGpuWarning) {
|
||||
MessageDialogFragment.newInstance(
|
||||
activity,
|
||||
titleId = R.string.unsupported_gpu,
|
||||
descriptionId = R.string.unsupported_gpu_warning,
|
||||
positiveButtonTitleId = R.string.dont_show_again,
|
||||
negativeButtonTitleId = R.string.close,
|
||||
showNegativeButton = true,
|
||||
positiveAction = {
|
||||
PreferenceManager.getDefaultSharedPreferences(requireContext())
|
||||
.edit() {
|
||||
putBoolean(Settings.PREF_SHOULD_SHOW_DRIVER_WARNING, false)
|
||||
}
|
||||
}
|
||||
).show(requireActivity().supportFragmentManager, MessageDialogFragment.TAG)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@ import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Color
|
||||
import android.net.Uri
|
||||
import android.os.BatteryManager
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
@@ -53,6 +53,7 @@ import androidx.window.layout.WindowLayoutInfo
|
||||
import com.google.android.material.color.MaterialColors
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.slider.Slider
|
||||
import com.google.android.material.textview.MaterialTextView
|
||||
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||
import org.yuzu.yuzu_emu.NativeLibrary
|
||||
import org.yuzu.yuzu_emu.R
|
||||
@@ -74,6 +75,7 @@ import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
||||
import org.yuzu.yuzu_emu.utils.FileUtil
|
||||
import org.yuzu.yuzu_emu.utils.GameHelper
|
||||
import org.yuzu.yuzu_emu.utils.GameIconUtils
|
||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||
import org.yuzu.yuzu_emu.utils.Log
|
||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||
import org.yuzu.yuzu_emu.utils.ViewUtils
|
||||
@@ -84,11 +86,13 @@ import java.io.File
|
||||
class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
private lateinit var emulationState: EmulationState
|
||||
private var emulationActivity: EmulationActivity? = null
|
||||
|
||||
private var perfStatsUpdater: (() -> Unit)? = null
|
||||
private var socUpdater: (() -> Unit)? = null
|
||||
|
||||
private lateinit var cpuBackend: String
|
||||
private lateinit var gpuDriver: String
|
||||
|
||||
|
||||
private var _binding: FragmentEmulationBinding? = null
|
||||
private val binding get() = _binding!!
|
||||
|
||||
@@ -101,6 +105,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
private var isInFoldableLayout = false
|
||||
|
||||
private lateinit var gpuModel: String
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
super.onAttach(context)
|
||||
if (context is EmulationActivity) {
|
||||
@@ -180,6 +186,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
return
|
||||
}
|
||||
|
||||
gpuModel = GpuDriverHelper.getGpuModel().toString()
|
||||
|
||||
binding.surfaceEmulation.holder.addCallback(this)
|
||||
binding.doneControlConfig.setOnClickListener { stopConfiguringControls() }
|
||||
|
||||
@@ -400,22 +408,24 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
// Setup overlays
|
||||
updateShowStatsOverlay()
|
||||
updateSocOverlay()
|
||||
|
||||
// Re update binding when the specs values get initialized properly
|
||||
binding.inGameMenu.getHeaderView(0).apply {
|
||||
val titleView = findViewById<TextView>(R.id.text_game_title)
|
||||
val cpuBackendLabel = findViewById<TextView>(R.id.cpu_backend)
|
||||
val gpuvendorLabel = findViewById<TextView>(R.id.gpu_vendor)
|
||||
val vendorLabel = findViewById<TextView>(R.id.gpu_vendor)
|
||||
|
||||
titleView.text = game.title
|
||||
cpuBackendLabel.text = NativeLibrary.getCpuBackend()
|
||||
gpuvendorLabel.text = NativeLibrary.getGpuDriver()
|
||||
vendorLabel.text = NativeLibrary.getGpuDriver()
|
||||
}
|
||||
|
||||
|
||||
val position = IntSetting.PERF_OVERLAY_POSITION.getInt()
|
||||
updateStatsPosition(position)
|
||||
|
||||
val socPosition = IntSetting.SOC_OVERLAY_POSITION.getInt()
|
||||
updateSocPosition(socPosition)
|
||||
}
|
||||
}
|
||||
emulationViewModel.isEmulationStopping.collect(viewLifecycleOwner) {
|
||||
@@ -449,6 +459,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
if (perfStatsUpdater != null) {
|
||||
perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!)
|
||||
}
|
||||
|
||||
if (socUpdater != null) {
|
||||
socUpdateHandler.removeCallbacks(socUpdater!!)
|
||||
}
|
||||
|
||||
emulationState.changeProgram(emulationViewModel.programChanged.value)
|
||||
emulationViewModel.setProgramChanged(-1)
|
||||
emulationViewModel.setEmulationStopped(false)
|
||||
@@ -517,11 +532,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
NativeLibrary.clearEmulationActivity()
|
||||
super.onDetach()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
// If the overlay is enabled, we need to update the position if changed
|
||||
val position = IntSetting.PERF_OVERLAY_POSITION.getInt()
|
||||
updateStatsPosition(position)
|
||||
|
||||
val socPosition = IntSetting.SOC_OVERLAY_POSITION.getInt()
|
||||
updateSocPosition(socPosition)
|
||||
}
|
||||
|
||||
private fun resetInputOverlay() {
|
||||
@@ -531,6 +550,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
binding.surfaceInputOverlay.resetLayoutVisibilityAndPlacement()
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("DefaultLocale")
|
||||
private fun updateShowStatsOverlay() {
|
||||
val showOverlay = BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
|
||||
@@ -539,7 +559,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
MaterialColors.getColor(
|
||||
this,
|
||||
com.google.android.material.R.attr.colorPrimary
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
binding.showStatsOverlayText.setVisible(showOverlay)
|
||||
@@ -559,7 +579,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
val actualFps = perfStats[FPS]
|
||||
|
||||
if (BooleanSetting.SHOW_FPS.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
val enableFrameInterpolation = BooleanSetting.FRAME_INTERPOLATION.getBoolean()
|
||||
val enableFrameInterpolation =
|
||||
BooleanSetting.FRAME_INTERPOLATION.getBoolean()
|
||||
// val enableFrameSkipping = BooleanSetting.FRAME_SKIPPING.getBoolean()
|
||||
|
||||
var fpsText = String.format("FPS: %.1f", actualFps)
|
||||
@@ -588,13 +609,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
if (BooleanSetting.SHOW_APP_RAM_USAGE.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
if (sb.isNotEmpty()) sb.append(" | ")
|
||||
val appRamUsage = File("/proc/self/statm").readLines()[0].split(' ')[1].toLong() * 4096 / 1000000
|
||||
sb.append("Process RAM: $appRamUsage MB")
|
||||
sb.append(getString(R.string.process_ram, appRamUsage))
|
||||
}
|
||||
|
||||
if (BooleanSetting.SHOW_SYSTEM_RAM_USAGE.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
if (sb.isNotEmpty()) sb.append(" | ")
|
||||
context?.let { ctx ->
|
||||
val activityManager = ctx.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
||||
val activityManager =
|
||||
ctx.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
||||
val memInfo = ActivityManager.MemoryInfo()
|
||||
activityManager.getMemoryInfo(memInfo)
|
||||
val usedRamMB = (memInfo.totalMem - memInfo.availMem) / 1048576L
|
||||
@@ -619,7 +641,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
sb.append(String.format("$prefix %d $suffix", shadersBuilding))
|
||||
}
|
||||
|
||||
if (BooleanSetting.OVERLAY_BACKGROUND.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
if (BooleanSetting.PERF_OVERLAY_BACKGROUND.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
binding.showStatsOverlayText.setBackgroundResource(R.color.yuzu_transparent_black)
|
||||
} else {
|
||||
binding.showStatsOverlayText.setBackgroundResource(0)
|
||||
@@ -638,7 +660,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
}
|
||||
|
||||
private fun updateStatsPosition(position: Int) {
|
||||
val params = binding.showStatsOverlayText.layoutParams as FrameLayout.LayoutParams
|
||||
updateOverlayPosition(binding.showStatsOverlayText, position)
|
||||
}
|
||||
|
||||
private fun updateSocPosition(position: Int) {
|
||||
updateOverlayPosition(binding.showSocOverlayText, position)
|
||||
}
|
||||
|
||||
private fun updateOverlayPosition(overlay: MaterialTextView, position: Int) {
|
||||
val params = overlay.layoutParams as FrameLayout.LayoutParams
|
||||
when (position) {
|
||||
0 -> {
|
||||
params.gravity = (Gravity.TOP or Gravity.START)
|
||||
@@ -672,7 +702,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
private fun getBatteryTemperature(): Float {
|
||||
try {
|
||||
val batteryIntent = requireContext().registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
|
||||
val batteryIntent =
|
||||
requireContext().registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
|
||||
// Temperature in tenths of a degree Celsius
|
||||
val temperature = batteryIntent?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) ?: 0
|
||||
// Convert to degrees Celsius
|
||||
@@ -681,28 +712,64 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
return 0.0f
|
||||
}
|
||||
}
|
||||
|
||||
private fun celsiusToFahrenheit(celsius: Float): Float {
|
||||
return (celsius * 9 / 5) + 32
|
||||
}
|
||||
|
||||
private fun updateThermalOverlay(temperature: Float) {
|
||||
if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean() &&
|
||||
emulationViewModel.emulationStarted.value &&
|
||||
!emulationViewModel.isEmulationStopping.value
|
||||
) {
|
||||
// Convert to Fahrenheit
|
||||
val fahrenheit = (temperature * 9f / 5f) + 32f
|
||||
private fun updateSocOverlay() {
|
||||
val showOverlay = BooleanSetting.SHOW_SOC_OVERLAY.getBoolean()
|
||||
binding.showSocOverlayText.apply {
|
||||
setTextColor(
|
||||
MaterialColors.getColor(
|
||||
this,
|
||||
com.google.android.material.R.attr.colorPrimary
|
||||
)
|
||||
)
|
||||
}
|
||||
binding.showSocOverlayText.setVisible(showOverlay)
|
||||
|
||||
// Determine color based on temperature ranges
|
||||
val color = when {
|
||||
temperature < 35 -> Color.parseColor("#00C8FF")
|
||||
temperature < 40 -> Color.parseColor("#A146FF")
|
||||
temperature < 45 -> Color.parseColor("#FFA500")
|
||||
else -> Color.RED
|
||||
if (showOverlay) {
|
||||
val sb = StringBuilder()
|
||||
|
||||
socUpdater = {
|
||||
if (emulationViewModel.emulationStarted.value &&
|
||||
!emulationViewModel.isEmulationStopping.value
|
||||
) {
|
||||
sb.setLength(0)
|
||||
|
||||
if (BooleanSetting.SHOW_DEVICE_MODEL.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
sb.append(Build.MODEL)
|
||||
}
|
||||
|
||||
if (BooleanSetting.SHOW_GPU_MODEL.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
if (sb.isNotEmpty()) sb.append(" | ")
|
||||
sb.append(gpuModel)
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 31) {
|
||||
if (BooleanSetting.SHOW_SOC_MODEL.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
if (sb.isNotEmpty()) sb.append(" | ")
|
||||
sb.append(Build.SOC_MODEL)
|
||||
}
|
||||
}
|
||||
|
||||
binding.showSocOverlayText.text = sb.toString()
|
||||
|
||||
if (BooleanSetting.SOC_OVERLAY_BACKGROUND.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
|
||||
binding.showSocOverlayText.setBackgroundResource(R.color.yuzu_transparent_black)
|
||||
} else {
|
||||
binding.showSocOverlayText.setBackgroundResource(0)
|
||||
}
|
||||
}
|
||||
|
||||
socUpdateHandler.postDelayed(socUpdater!!, 1000)
|
||||
}
|
||||
socUpdateHandler.post(socUpdater!!)
|
||||
} else {
|
||||
if (socUpdater != null) {
|
||||
socUpdateHandler.removeCallbacks(socUpdater!!)
|
||||
}
|
||||
|
||||
binding.showThermalsText.setTextColor(color)
|
||||
binding.showThermalsText.text = String.format("%.1f°C • %.1f°F", temperature, fahrenheit)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -834,6 +901,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
popup.menu.apply {
|
||||
findItem(R.id.menu_show_stats_overlay).isChecked =
|
||||
BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
|
||||
findItem(R.id.menu_show_soc_overlay).isChecked =
|
||||
BooleanSetting.SHOW_SOC_OVERLAY.getBoolean()
|
||||
findItem(R.id.menu_rel_stick_center).isChecked =
|
||||
BooleanSetting.JOYSTICK_REL_CENTER.getBoolean()
|
||||
findItem(R.id.menu_dpad_slide).isChecked = BooleanSetting.DPAD_SLIDE.getBoolean()
|
||||
@@ -852,6 +921,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
updateShowStatsOverlay()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.menu_show_soc_overlay -> {
|
||||
it.isChecked = !it.isChecked
|
||||
BooleanSetting.SHOW_SOC_OVERLAY.setBoolean(it.isChecked)
|
||||
updateSocOverlay()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.menu_edit_overlay -> {
|
||||
binding.drawerLayout.close()
|
||||
binding.surfaceInputOverlay.requestFocus()
|
||||
@@ -1196,6 +1273,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
companion object {
|
||||
private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!)
|
||||
private val thermalStatsUpdateHandler = Handler(Looper.myLooper()!!)
|
||||
private val socUpdateHandler = Handler(Looper.myLooper()!!)
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,10 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
||||
import android.Manifest
|
||||
@@ -116,7 +112,7 @@ class HomeSettingsFragment : Fragment() {
|
||||
.actionHomeSettingsFragmentToDriverManagerFragment(null)
|
||||
binding.root.findNavController().navigate(action)
|
||||
},
|
||||
{ GpuDriverHelper.supportsCustomDriverLoading() },
|
||||
{true},
|
||||
R.string.custom_driver_not_supported,
|
||||
R.string.custom_driver_not_supported_description,
|
||||
driverViewModel.selectedDriverTitle
|
||||
@@ -128,7 +124,7 @@ class HomeSettingsFragment : Fragment() {
|
||||
R.string.multiplayer_description,
|
||||
R.drawable.ic_two_users,
|
||||
{
|
||||
val action = mainActivity.displayMultiplayerDialog()
|
||||
mainActivity.displayMultiplayerDialog()
|
||||
},
|
||||
)
|
||||
)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.model
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.model
|
||||
|
@@ -1,28 +1,41 @@
|
||||
// Copyright 2024 Mandarine Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
package org.yuzu.yuzu_emu.network
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.net.wifi.WifiManager
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.NetworkCapabilities
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.format.Formatter
|
||||
import android.widget.Toast
|
||||
import androidx.preference.PreferenceManager
|
||||
import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.dialogs.ChatMessage
|
||||
import java.net.Inet4Address
|
||||
|
||||
object NetPlayManager {
|
||||
external fun netPlayCreateRoom(ipAddress: String, port: Int, username: String, password: String, roomName: String, maxPlayers: Int): Int
|
||||
external fun netPlayJoinRoom(ipAddress: String, port: Int, username: String, password: String): Int
|
||||
external fun netPlayCreateRoom(
|
||||
ipAddress: String,
|
||||
port: Int,
|
||||
username: String,
|
||||
preferredGameName: String,
|
||||
preferredGameId: Long,
|
||||
password: String,
|
||||
roomName: String,
|
||||
maxPlayers: Int
|
||||
): Int
|
||||
|
||||
external fun netPlayJoinRoom(
|
||||
ipAddress: String,
|
||||
port: Int,
|
||||
username: String,
|
||||
password: String
|
||||
): Int
|
||||
|
||||
external fun netPlayRoomInfo(): Array<String>
|
||||
external fun netPlayIsJoined(): Boolean
|
||||
external fun netPlayIsHostedRoom(): Boolean
|
||||
@@ -33,6 +46,28 @@ object NetPlayManager {
|
||||
external fun netPlayGetBanList(): Array<String>
|
||||
external fun netPlayBanUser(username: String)
|
||||
external fun netPlayUnbanUser(username: String)
|
||||
external fun netPlayGetPublicRooms(): Array<String>
|
||||
|
||||
data class RoomInfo(
|
||||
val name: String,
|
||||
val hasPassword: Boolean,
|
||||
val maxPlayers: Int,
|
||||
val ip: String,
|
||||
val port: Int,
|
||||
val description: String,
|
||||
val owner: String,
|
||||
val preferredGameId: Long,
|
||||
val preferredGameName: String,
|
||||
val members: MutableList<RoomMember> = mutableListOf()
|
||||
)
|
||||
|
||||
data class RoomMember(
|
||||
val username: String,
|
||||
val nickname: String,
|
||||
val gameId: Long,
|
||||
val gameName: String
|
||||
)
|
||||
|
||||
|
||||
private var messageListener: ((Int, String) -> Unit)? = null
|
||||
private var adapterRefreshListener: ((Int, String) -> Unit)? = null
|
||||
@@ -41,11 +76,57 @@ object NetPlayManager {
|
||||
messageListener = listener
|
||||
}
|
||||
|
||||
fun getPublicRooms(): List<RoomInfo> {
|
||||
val roomData = netPlayGetPublicRooms()
|
||||
val rooms = mutableMapOf<String, RoomInfo>()
|
||||
|
||||
for (data in roomData) {
|
||||
val parts = data.split("|")
|
||||
|
||||
if (parts[0] == "MEMBER" && parts.size >= 6) {
|
||||
val roomName = parts[1]
|
||||
val member = RoomMember(
|
||||
username = parts[2],
|
||||
nickname = parts[3],
|
||||
gameId = parts[4].toLongOrNull() ?: 0L,
|
||||
gameName = parts[5]
|
||||
)
|
||||
rooms[roomName]?.members?.add(member)
|
||||
} else if (parts.size >= 9) {
|
||||
val roomInfo = RoomInfo(
|
||||
name = parts[0],
|
||||
hasPassword = parts[1] == "1",
|
||||
maxPlayers = parts[2].toIntOrNull() ?: 0,
|
||||
ip = parts[3],
|
||||
port = parts[4].toIntOrNull() ?: 0,
|
||||
description = parts[5],
|
||||
owner = parts[6],
|
||||
preferredGameId = parts[7].toLongOrNull() ?: 0L,
|
||||
preferredGameName = parts[8]
|
||||
)
|
||||
rooms[roomInfo.name] = roomInfo
|
||||
}
|
||||
}
|
||||
|
||||
return rooms.values.toList()
|
||||
}
|
||||
|
||||
fun refreshRoomListAsync(callback: (List<RoomInfo>) -> Unit) {
|
||||
Thread {
|
||||
val rooms = getPublicRooms()
|
||||
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
callback(rooms)
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
fun setOnAdapterRefreshListener(listener: (Int, String) -> Unit) {
|
||||
adapterRefreshListener = listener
|
||||
}
|
||||
|
||||
fun getUsername(activity: Context): String { val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||
fun getUsername(activity: Context): String {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||
val name = "Eden${(Math.random() * 100).toInt()}"
|
||||
return prefs.getString("NetPlayUsername", name) ?: name
|
||||
}
|
||||
@@ -103,31 +184,37 @@ object NetPlayManager {
|
||||
if (parts.size == 2) {
|
||||
val nickname = parts[0].trim()
|
||||
val chatMessage = parts[1].trim()
|
||||
addChatMessage(ChatMessage(
|
||||
nickname = nickname,
|
||||
username = "",
|
||||
message = chatMessage
|
||||
))
|
||||
addChatMessage(
|
||||
ChatMessage(
|
||||
nickname = nickname,
|
||||
username = "",
|
||||
message = chatMessage
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
NetPlayStatus.MEMBER_JOIN,
|
||||
NetPlayStatus.MEMBER_LEAVE,
|
||||
NetPlayStatus.MEMBER_KICKED,
|
||||
NetPlayStatus.MEMBER_BANNED -> {
|
||||
addChatMessage(ChatMessage(
|
||||
nickname = "System",
|
||||
username = "",
|
||||
message = message
|
||||
))
|
||||
addChatMessage(
|
||||
ChatMessage(
|
||||
nickname = "System",
|
||||
username = "",
|
||||
message = message
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
if (!isChatOpen) {
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
if (!isChatOpen) {
|
||||
// TODO(alekpop, crueter): Improve this, potentially a drawer at the top?
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
messageListener?.invoke(type, msg)
|
||||
@@ -159,34 +246,59 @@ object NetPlayManager {
|
||||
NetPlayStatus.ROOM_MODERATOR -> context.getString(R.string.multiplayer_room_moderator)
|
||||
NetPlayStatus.MEMBER_JOIN -> context.getString(R.string.multiplayer_member_join, msg)
|
||||
NetPlayStatus.MEMBER_LEAVE -> context.getString(R.string.multiplayer_member_leave, msg)
|
||||
NetPlayStatus.MEMBER_KICKED -> context.getString(R.string.multiplayer_member_kicked, msg)
|
||||
NetPlayStatus.MEMBER_BANNED -> context.getString(R.string.multiplayer_member_banned, msg)
|
||||
NetPlayStatus.MEMBER_KICKED -> context.getString(
|
||||
R.string.multiplayer_member_kicked,
|
||||
msg
|
||||
)
|
||||
|
||||
NetPlayStatus.MEMBER_BANNED -> context.getString(
|
||||
R.string.multiplayer_member_banned,
|
||||
msg
|
||||
)
|
||||
|
||||
NetPlayStatus.ADDRESS_UNBANNED -> context.getString(R.string.multiplayer_address_unbanned)
|
||||
NetPlayStatus.CHAT_MESSAGE -> msg
|
||||
else -> ""
|
||||
}
|
||||
}
|
||||
|
||||
fun getIpAddressByWifi(activity: Activity): String {
|
||||
var ipAddress = 0
|
||||
val wifiManager = activity.getSystemService(WifiManager::class.java)
|
||||
val wifiInfo = wifiManager.connectionInfo
|
||||
if (wifiInfo != null) {
|
||||
ipAddress = wifiInfo.ipAddress
|
||||
}
|
||||
fun isConnectedToWifi(activity: Activity): Boolean {
|
||||
val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
|
||||
val network = connectivityManager.activeNetwork
|
||||
val capabilities = connectivityManager.getNetworkCapabilities(network)
|
||||
return capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true
|
||||
}
|
||||
|
||||
if (ipAddress == 0) {
|
||||
val dhcpInfo = wifiManager.dhcpInfo
|
||||
if (dhcpInfo != null) {
|
||||
ipAddress = dhcpInfo.ipAddress
|
||||
fun getIpAddressByWifi(activity: Activity): String {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
// For Android 12 (API 31) and above
|
||||
val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
|
||||
val network = connectivityManager.activeNetwork
|
||||
val capabilities = connectivityManager.getNetworkCapabilities(network)
|
||||
|
||||
if (capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true) {
|
||||
val linkProperties = connectivityManager.getLinkProperties(network)
|
||||
linkProperties?.linkAddresses?.firstOrNull { it.address is Inet4Address }?.let {
|
||||
return it.address.hostAddress ?: "192.168.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return if (ipAddress == 0) {
|
||||
"192.168.0.1"
|
||||
} else {
|
||||
Formatter.formatIpAddress(ipAddress)
|
||||
// For Android 11 (API 30) and below
|
||||
try {
|
||||
val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
|
||||
val network = connectivityManager.activeNetwork
|
||||
if (network != null) {
|
||||
val linkProperties = connectivityManager.getLinkProperties(network)
|
||||
linkProperties?.linkAddresses?.firstOrNull { it.address is Inet4Address }?.let {
|
||||
return it.address.hostAddress ?: "192.168.0.1"
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
return "192.168.0.1"
|
||||
}
|
||||
|
||||
fun getBanList(): List<String> {
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.ui
|
||||
@@ -52,6 +52,11 @@ class GamesFragment : Fragment() {
|
||||
private var _binding: FragmentGamesBinding? = null
|
||||
private val binding get() = _binding!!
|
||||
|
||||
private var originalHeaderTopMargin: Int? = null
|
||||
private var originalHeaderBottomMargin: Int? = null
|
||||
private var originalHeaderRightMargin: Int? = null
|
||||
private var originalHeaderLeftMargin: Int? = null
|
||||
|
||||
companion object {
|
||||
private const val SEARCH_TEXT = "SearchText"
|
||||
private const val PREF_VIEW_TYPE = "GamesViewType"
|
||||
@@ -439,42 +444,52 @@ class GamesFragment : Fragment() {
|
||||
private fun setInsets() =
|
||||
ViewCompat.setOnApplyWindowInsetsListener(
|
||||
binding.root
|
||||
) { view: View, windowInsets: WindowInsetsCompat ->
|
||||
) { _: View, windowInsets: WindowInsetsCompat ->
|
||||
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
|
||||
val spacingNavigation = resources.getDimensionPixelSize(R.dimen.spacing_navigation)
|
||||
resources.getDimensionPixelSize(R.dimen.spacing_navigation_rail)
|
||||
val isLandscape =
|
||||
resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
binding.swipeRefresh.setProgressViewEndTarget(
|
||||
false,
|
||||
barInsets.top + resources.getDimensionPixelSize(R.dimen.spacing_refresh_end)
|
||||
)
|
||||
|
||||
val leftInsets = barInsets.left + cutoutInsets.left
|
||||
val rightInsets = barInsets.right + cutoutInsets.right
|
||||
val leftInset = barInsets.left + cutoutInsets.left
|
||||
val rightInset = barInsets.right + cutoutInsets.right
|
||||
val topInset = maxOf(barInsets.top, cutoutInsets.top)
|
||||
|
||||
val mlpSwipe = binding.swipeRefresh.layoutParams as ViewGroup.MarginLayoutParams
|
||||
if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) {
|
||||
mlpSwipe.leftMargin = leftInsets
|
||||
mlpSwipe.rightMargin = rightInsets
|
||||
} else {
|
||||
mlpSwipe.leftMargin = leftInsets
|
||||
mlpSwipe.rightMargin = rightInsets
|
||||
}
|
||||
mlpSwipe.leftMargin = leftInset
|
||||
mlpSwipe.rightMargin = rightInset
|
||||
binding.swipeRefresh.layoutParams = mlpSwipe
|
||||
|
||||
val mlpHeader = binding.header.layoutParams as ViewGroup.MarginLayoutParams
|
||||
|
||||
// Store original margins only once
|
||||
if (originalHeaderTopMargin == null) {
|
||||
originalHeaderTopMargin = mlpHeader.topMargin
|
||||
originalHeaderRightMargin = mlpHeader.rightMargin
|
||||
originalHeaderLeftMargin = mlpHeader.leftMargin
|
||||
}
|
||||
|
||||
// Always set margin as original + insets
|
||||
mlpHeader.leftMargin = (originalHeaderLeftMargin ?: 0) + leftInset
|
||||
mlpHeader.rightMargin = (originalHeaderRightMargin ?: 0) + rightInset
|
||||
mlpHeader.topMargin = (originalHeaderTopMargin ?: 0) + topInset + resources.getDimensionPixelSize(R.dimen.spacing_med)
|
||||
binding.header.layoutParams = mlpHeader
|
||||
|
||||
binding.noticeText.updatePadding(bottom = spacingNavigation)
|
||||
binding.header.updatePadding(top = cutoutInsets.top + resources.getDimensionPixelSize(R.dimen.spacing_large) + if (isLandscape) barInsets.top else 0)
|
||||
|
||||
binding.gridGames.updatePadding(
|
||||
top = resources.getDimensionPixelSize(R.dimen.spacing_med)
|
||||
)
|
||||
|
||||
val mlpFab = binding.addDirectory.layoutParams as ViewGroup.MarginLayoutParams
|
||||
val fabPadding = resources.getDimensionPixelSize(R.dimen.spacing_large)
|
||||
mlpFab.leftMargin = leftInsets + fabPadding
|
||||
mlpFab.leftMargin = leftInset + fabPadding
|
||||
mlpFab.bottomMargin = barInsets.bottom + fabPadding
|
||||
mlpFab.rightMargin = rightInsets + fabPadding
|
||||
mlpFab.rightMargin = rightInset + fabPadding
|
||||
binding.addDirectory.layoutParams = mlpFab
|
||||
|
||||
windowInsets
|
||||
|
@@ -1,10 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
package org.yuzu.yuzu_emu.ui.main
|
||||
|
||||
import android.content.Intent
|
||||
@@ -25,13 +21,10 @@ import androidx.core.view.WindowCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.navigation.NavController
|
||||
import androidx.navigation.fragment.NavHostFragment
|
||||
import androidx.navigation.ui.setupWithNavController
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.google.android.material.color.MaterialColors
|
||||
import com.google.android.material.navigation.NavigationBarView
|
||||
import java.io.File
|
||||
import java.io.FilenameFilter
|
||||
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||
import org.yuzu.yuzu_emu.NativeLibrary
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
|
||||
@@ -75,9 +68,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||
|
||||
ThemeHelper.ThemeChangeListener(this)
|
||||
ThemeHelper.setTheme(this)
|
||||
NativeLibrary.netPlayInit()
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
NativeLibrary.initMultiplayer()
|
||||
|
||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
@@ -1,8 +1,4 @@
|
||||
// Copyright 2024 Mandarine Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.utils
|
||||
|
@@ -24,6 +24,7 @@ import java.nio.charset.StandardCharsets
|
||||
import java.util.zip.Deflater
|
||||
import java.util.zip.ZipOutputStream
|
||||
import kotlin.IllegalStateException
|
||||
import androidx.core.net.toUri
|
||||
|
||||
object FileUtil {
|
||||
const val PATH_TREE = "tree"
|
||||
@@ -195,6 +196,10 @@ object FileUtil {
|
||||
* @return String display name
|
||||
*/
|
||||
fun getFilename(uri: Uri): String {
|
||||
if (uri.scheme == "file") {
|
||||
return uri.lastPathSegment?.takeIf { it.isNotEmpty() } ?: throw IOException("Invalid file URI: $uri")
|
||||
}
|
||||
|
||||
val resolver = YuzuApplication.appContext.contentResolver
|
||||
val columns = arrayOf(
|
||||
DocumentsContract.Document.COLUMN_DISPLAY_NAME
|
||||
@@ -236,7 +241,7 @@ object FileUtil {
|
||||
var size: Long = 0
|
||||
var c: Cursor? = null
|
||||
try {
|
||||
val mUri = Uri.parse(path)
|
||||
val mUri = path.toUri()
|
||||
c = resolver.query(mUri, columns, null, null, null)
|
||||
c!!.moveToNext()
|
||||
size = c.getLong(0)
|
||||
|
@@ -1,6 +1,9 @@
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.utils
|
||||
|
||||
import android.content.SharedPreferences
|
||||
@@ -13,11 +16,15 @@ import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.model.Game
|
||||
import org.yuzu.yuzu_emu.model.GameDir
|
||||
import org.yuzu.yuzu_emu.model.MinimalDocumentFile
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.net.toUri
|
||||
|
||||
object GameHelper {
|
||||
private const val KEY_OLD_GAME_PATH = "game_path"
|
||||
const val KEY_GAMES = "Games"
|
||||
|
||||
var cachedGameList = mutableListOf<Game>()
|
||||
|
||||
private lateinit var preferences: SharedPreferences
|
||||
|
||||
fun getGames(): List<Game> {
|
||||
@@ -29,7 +36,7 @@ object GameHelper {
|
||||
val oldGamesDir = preferences.getString(KEY_OLD_GAME_PATH, "") ?: ""
|
||||
if (oldGamesDir.isNotEmpty()) {
|
||||
gameDirs.add(GameDir(oldGamesDir, true))
|
||||
preferences.edit().remove(KEY_OLD_GAME_PATH).apply()
|
||||
preferences.edit() { remove(KEY_OLD_GAME_PATH) }
|
||||
}
|
||||
gameDirs.addAll(NativeConfig.getGameDirs())
|
||||
|
||||
@@ -44,7 +51,7 @@ object GameHelper {
|
||||
|
||||
val badDirs = mutableListOf<Int>()
|
||||
gameDirs.forEachIndexed { index: Int, gameDir: GameDir ->
|
||||
val gameDirUri = Uri.parse(gameDir.uriString)
|
||||
val gameDirUri = gameDir.uriString.toUri()
|
||||
val isValid = FileUtil.isTreeUriValid(gameDirUri)
|
||||
if (isValid) {
|
||||
addGamesRecursive(
|
||||
@@ -72,11 +79,12 @@ object GameHelper {
|
||||
games.forEach {
|
||||
serializedGames.add(Json.encodeToString(it))
|
||||
}
|
||||
preferences.edit()
|
||||
.remove(KEY_GAMES)
|
||||
.putStringSet(KEY_GAMES, serializedGames)
|
||||
.apply()
|
||||
preferences.edit() {
|
||||
remove(KEY_GAMES)
|
||||
.putStringSet(KEY_GAMES, serializedGames)
|
||||
}
|
||||
|
||||
cachedGameList = games.toMutableList()
|
||||
return games.toList()
|
||||
}
|
||||
|
||||
|
@@ -202,6 +202,11 @@ object GpuDriverHelper {
|
||||
hookLibPath: String = GpuDriverHelper.hookLibPath!!
|
||||
): Array<String>?
|
||||
|
||||
external fun getGpuModel(
|
||||
surface: Surface = Surface(SurfaceTexture(true)),
|
||||
hookLibPath: String = GpuDriverHelper.hookLibPath!!
|
||||
): String?
|
||||
|
||||
// Parse the custom driver metadata to retrieve the name.
|
||||
val installedCustomDriverData: GpuDriverMetadata
|
||||
get() = GpuDriverMetadata(File(driverInstallationPath + META_JSON_FILENAME))
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.utils
|
||||
|
@@ -9,92 +9,147 @@
|
||||
|
||||
namespace AndroidSettings {
|
||||
|
||||
struct GameDir {
|
||||
std::string path;
|
||||
bool deep_scan = false;
|
||||
};
|
||||
struct GameDir {
|
||||
std::string path;
|
||||
bool deep_scan = false;
|
||||
};
|
||||
|
||||
struct OverlayControlData {
|
||||
std::string id;
|
||||
bool enabled;
|
||||
std::pair<double, double> landscape_position;
|
||||
std::pair<double, double> portrait_position;
|
||||
std::pair<double, double> foldable_position;
|
||||
};
|
||||
struct OverlayControlData {
|
||||
std::string id;
|
||||
bool enabled;
|
||||
std::pair<double, double> landscape_position;
|
||||
std::pair<double, double> portrait_position;
|
||||
std::pair<double, double> foldable_position;
|
||||
};
|
||||
|
||||
struct Values {
|
||||
Settings::Linkage linkage;
|
||||
struct Values {
|
||||
Settings::Linkage linkage;
|
||||
|
||||
// Path settings
|
||||
std::vector<GameDir> game_dirs;
|
||||
// Path settings
|
||||
std::vector<GameDir> game_dirs;
|
||||
|
||||
// Android
|
||||
Settings::Setting<bool> picture_in_picture{linkage, false, "picture_in_picture",
|
||||
Settings::Category::Android};
|
||||
Settings::Setting<s32> screen_layout{linkage,
|
||||
5,
|
||||
"screen_layout",
|
||||
Settings::Category::Android,
|
||||
Settings::Specialization::Default,
|
||||
true,
|
||||
true};
|
||||
Settings::Setting<s32> vertical_alignment{linkage,
|
||||
0,
|
||||
"vertical_alignment",
|
||||
Settings::Category::Android,
|
||||
Settings::Specialization::Default,
|
||||
true,
|
||||
true};
|
||||
// Android
|
||||
Settings::Setting<bool> picture_in_picture{linkage, false, "picture_in_picture",
|
||||
Settings::Category::Android};
|
||||
Settings::Setting<s32> screen_layout{linkage,
|
||||
5,
|
||||
"screen_layout",
|
||||
Settings::Category::Android,
|
||||
Settings::Specialization::Default,
|
||||
true,
|
||||
true};
|
||||
Settings::Setting<s32> vertical_alignment{linkage,
|
||||
0,
|
||||
"vertical_alignment",
|
||||
Settings::Category::Android,
|
||||
Settings::Specialization::Default,
|
||||
true,
|
||||
true};
|
||||
|
||||
Settings::SwitchableSetting<std::string, false> driver_path{linkage, "", "driver_path",
|
||||
Settings::Category::GpuDriver};
|
||||
Settings::SwitchableSetting<std::string, false> driver_path{linkage, "", "driver_path",
|
||||
Settings::Category::GpuDriver};
|
||||
|
||||
// LRU Cache
|
||||
Settings::SwitchableSetting<bool> use_lru_cache{linkage, true, "use_lru_cache",
|
||||
Settings::Category::System};
|
||||
// LRU Cache
|
||||
Settings::SwitchableSetting<bool> use_lru_cache{linkage, true, "use_lru_cache",
|
||||
Settings::Category::System};
|
||||
|
||||
Settings::Setting<s32> theme{linkage, 0, "theme", Settings::Category::Android};
|
||||
Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android};
|
||||
Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds",
|
||||
Settings::Category::Android};
|
||||
Settings::Setting<s32> theme{linkage, 0, "theme", Settings::Category::Android};
|
||||
Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android};
|
||||
Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds",
|
||||
Settings::Category::Android};
|
||||
|
||||
// Input/performance overlay settings
|
||||
std::vector<OverlayControlData> overlay_control_data;
|
||||
Settings::Setting<s32> overlay_scale{linkage, 50, "control_scale", Settings::Category::Overlay};
|
||||
Settings::Setting<s32> overlay_opacity{linkage, 100, "control_opacity",
|
||||
// Input/performance overlay settings
|
||||
std::vector<OverlayControlData> overlay_control_data;
|
||||
Settings::Setting<s32> overlay_scale{linkage, 50, "control_scale",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<s32> overlay_opacity{linkage, 100, "control_opacity",
|
||||
Settings::Category::Overlay};
|
||||
|
||||
Settings::Setting<bool> joystick_rel_center{linkage, true, "joystick_rel_center",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> dpad_slide{linkage, true, "dpad_slide",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> haptic_feedback{linkage, true, "haptic_feedback",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> show_performance_overlay{linkage, true, "show_performance_overlay",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Paired, true,
|
||||
true};
|
||||
Settings::Setting<bool> perf_overlay_background{linkage, false, "perf_overlay_background",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<s32> perf_overlay_position{linkage, 0, "perf_overlay_position",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
|
||||
Settings::Setting<bool> show_fps{linkage, true, "show_fps",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<bool> show_frame_time{linkage, false, "show_frame_time",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<bool> show_app_ram_usage{linkage, false, "show_app_ram_usage",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<bool> show_system_ram_usage{linkage, false, "show_system_ram_usage",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<bool> show_bat_temperature{linkage, false, "show_bat_temperature",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<bool> show_shaders_building{linkage, true, "show_shaders_building",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<s32> lock_drawer{linkage, false, "lock_drawer",
|
||||
Settings::Category::Overlay};
|
||||
|
||||
Settings::Setting<bool> joystick_rel_center{linkage, true, "joystick_rel_center",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> dpad_slide{linkage, true, "dpad_slide", Settings::Category::Overlay};
|
||||
Settings::Setting<bool> haptic_feedback{linkage, true, "haptic_feedback",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> show_performance_overlay{linkage, true, "show_performance_overlay",
|
||||
Settings::Category::Overlay, Settings::Specialization::Paired, true , true};
|
||||
Settings::Setting<bool> overlay_background{linkage, false, "overlay_background",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<s32> perf_overlay_position{linkage, 0, "perf_overlay_position",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_fps{linkage, true, "show_fps",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_frame_time{linkage, false, "show_frame_time",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_app_ram_usage{linkage, false, "show_app_ram_usage",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_system_ram_usage{linkage, false, "show_system_ram_usage",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_bat_temperature{linkage, false, "show_bat_temperature",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_shaders_building{linkage, true, "show_shaders_building",
|
||||
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
|
||||
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
|
||||
Settings::Category::Overlay};
|
||||
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
|
||||
Settings::Setting<s32> lock_drawer{linkage, false, "lock_drawer", Settings::Category::Overlay};
|
||||
/// DEVICE/SOC OVERLAY
|
||||
|
||||
Settings::Setting<bool> dont_show_eden_veil_warning{linkage, false, "dont_show_eden_veil_warning", Settings::Category::Miscellaneous};
|
||||
};
|
||||
Settings::Setting<bool> show_soc_overlay{linkage, true, "show_soc_overlay",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Paired, true, true};
|
||||
|
||||
extern Values values;
|
||||
Settings::Setting<bool> show_device_model{linkage, true, "show_device_model",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
|
||||
Settings::Setting<bool> show_gpu_model{linkage, true, "show_gpu_model",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
|
||||
Settings::Setting<bool> show_soc_model{linkage, true, "show_soc_model",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_performance_overlay};
|
||||
|
||||
Settings::Setting<bool> soc_overlay_background{linkage, false, "soc_overlay_background",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_soc_overlay};
|
||||
Settings::Setting<s32> soc_overlay_position{linkage, 2, "soc_overlay_position",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true,
|
||||
&show_soc_overlay};
|
||||
|
||||
Settings::Setting<bool> dont_show_eden_veil_warning{linkage, false,
|
||||
"dont_show_eden_veil_warning",
|
||||
Settings::Category::Miscellaneous};
|
||||
};
|
||||
|
||||
extern Values values;
|
||||
|
||||
} // namespace AndroidSettings
|
||||
|
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
@@ -68,12 +68,17 @@
|
||||
#include "video_core/vulkan_common/vulkan_instance.h"
|
||||
#include "video_core/vulkan_common/vulkan_surface.h"
|
||||
#include "video_core/shader_notify.h"
|
||||
#include "network/announce_multiplayer_session.h"
|
||||
|
||||
#define jconst [[maybe_unused]] const auto
|
||||
#define jauto [[maybe_unused]] auto
|
||||
|
||||
static EmulationSession s_instance;
|
||||
|
||||
//Abdroid Multiplayer which can be initialized with parameters
|
||||
std::unique_ptr<AndroidMultiplayer> multiplayer{nullptr};
|
||||
std::shared_ptr<Core::AnnounceMultiplayerSession> announce_multiplayer_session;
|
||||
|
||||
EmulationSession::EmulationSession() {
|
||||
m_vfs = std::make_shared<FileSys::RealVfsFilesystem>();
|
||||
}
|
||||
@@ -567,6 +572,30 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
|
||||
return j_driver_info;
|
||||
}
|
||||
|
||||
jstring Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getGpuModel(JNIEnv *env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
|
||||
const char* file_redirect_dir_{};
|
||||
int featureFlags{};
|
||||
std::string hook_lib_dir = Common::Android::GetJString(env, j_hook_lib_dir);
|
||||
auto handle = adrenotools_open_libvulkan(RTLD_NOW, featureFlags, nullptr, hook_lib_dir.c_str(),
|
||||
nullptr, nullptr, file_redirect_dir_, nullptr);
|
||||
auto driver_library = std::make_shared<Common::DynamicLibrary>(handle);
|
||||
InputCommon::InputSubsystem input_subsystem;
|
||||
auto window =
|
||||
std::make_unique<EmuWindow_Android>(ANativeWindow_fromSurface(env, j_surf), driver_library);
|
||||
|
||||
Vulkan::vk::InstanceDispatch dld;
|
||||
Vulkan::vk::Instance vk_instance = Vulkan::CreateInstance(
|
||||
*driver_library, dld, VK_API_VERSION_1_1, Core::Frontend::WindowSystemType::Android);
|
||||
|
||||
auto surface = Vulkan::CreateSurface(vk_instance, window->GetWindowInfo());
|
||||
|
||||
auto device = Vulkan::CreateDevice(vk_instance, dld, *surface);
|
||||
|
||||
const std::string model_name{device.GetModelName()};
|
||||
|
||||
return Common::Android::ToJString(env, model_name);
|
||||
}
|
||||
|
||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) {
|
||||
Core::Crypto::KeyManager::Instance().ReloadKeys();
|
||||
return static_cast<jboolean>(Core::Crypto::KeyManager::Instance().AreKeysLoaded());
|
||||
@@ -892,12 +921,33 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobje
|
||||
return ContentManager::AreKeysPresent();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_NativeLibrary_initMultiplayer(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
if (multiplayer) {
|
||||
return;
|
||||
}
|
||||
|
||||
announce_multiplayer_session = std::make_shared<Core::AnnounceMultiplayerSession>();
|
||||
|
||||
multiplayer = std::make_unique<AndroidMultiplayer>(s_instance.System(), announce_multiplayer_session);
|
||||
multiplayer->NetworkInit();
|
||||
}
|
||||
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayGetPublicRooms(
|
||||
JNIEnv *env, [[maybe_unused]] jobject obj) {
|
||||
return Common::Android::ToJStringArray(env, multiplayer->NetPlayGetPublicRooms());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayCreateRoom(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj, jstring ipaddress, jint port,
|
||||
jstring username, jstring password, jstring room_name, jint max_players) {
|
||||
jstring username, jstring preferredGameName, jlong preferredGameId, jstring password,
|
||||
jstring room_name, jint max_players) {
|
||||
return static_cast<jint>(
|
||||
NetPlayCreateRoom(Common::Android::GetJString(env, ipaddress), port,
|
||||
Common::Android::GetJString(env, username), Common::Android::GetJString(env, password),
|
||||
multiplayer->NetPlayCreateRoom(Common::Android::GetJString(env, ipaddress), port,
|
||||
Common::Android::GetJString(env, username), Common::Android::GetJString(env, preferredGameName),
|
||||
preferredGameId,Common::Android::GetJString(env, password),
|
||||
Common::Android::GetJString(env, room_name), max_players));
|
||||
}
|
||||
|
||||
@@ -905,70 +955,63 @@ JNIEXPORT jint JNICALL Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayJoi
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj, jstring ipaddress, jint port,
|
||||
jstring username, jstring password) {
|
||||
return static_cast<jint>(
|
||||
NetPlayJoinRoom(Common::Android::GetJString(env, ipaddress), port,
|
||||
multiplayer->NetPlayJoinRoom(Common::Android::GetJString(env, ipaddress), port,
|
||||
Common::Android::GetJString(env, username), Common::Android::GetJString(env, password)));
|
||||
}
|
||||
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayRoomInfo(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
return Common::Android::ToJStringArray(env, NetPlayRoomInfo());
|
||||
return Common::Android::ToJStringArray(env, multiplayer->NetPlayRoomInfo());
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayIsJoined(
|
||||
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
return NetPlayIsJoined();
|
||||
return multiplayer->NetPlayIsJoined();
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayIsHostedRoom(
|
||||
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
return NetPlayIsHostedRoom();
|
||||
return multiplayer->NetPlayIsHostedRoom();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlaySendMessage(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj, jstring msg) {
|
||||
NetPlaySendMessage(Common::Android::GetJString(env, msg));
|
||||
multiplayer->NetPlaySendMessage(Common::Android::GetJString(env, msg));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayKickUser(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj, jstring username) {
|
||||
NetPlayKickUser(Common::Android::GetJString(env, username));
|
||||
multiplayer->NetPlayKickUser(Common::Android::GetJString(env, username));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayLeaveRoom(
|
||||
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
NetPlayLeaveRoom();
|
||||
multiplayer->NetPlayLeaveRoom();
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayIsModerator(
|
||||
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
return NetPlayIsModerator();
|
||||
return multiplayer->NetPlayIsModerator();
|
||||
}
|
||||
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayGetBanList(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
return Common::Android::ToJStringArray(env, NetPlayGetBanList());
|
||||
return Common::Android::ToJStringArray(env, multiplayer->NetPlayGetBanList());
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayBanUser(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj, jstring username) {
|
||||
NetPlayBanUser(Common::Android::GetJString(env, username));
|
||||
multiplayer->NetPlayBanUser(Common::Android::GetJString(env, username));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_yuzu_yuzu_1emu_network_NetPlayManager_netPlayUnbanUser(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj, jstring username) {
|
||||
NetPlayUnbanUser(Common::Android::GetJString(env, username));
|
||||
multiplayer->NetPlayUnbanUser(Common::Android::GetJString(env, username));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_yuzu_yuzu_1emu_NativeLibrary_netPlayInit(
|
||||
JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||
NetworkInit(&EmulationSession::GetInstance().System().GetRoomNetwork());
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 45 KiB |
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M7,10l5,5 5,-5" />
|
||||
</vector>
|
9
src/android/app/src/main/res/drawable/ic_ip.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_ip.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="?attr/colorControlNormal"
|
||||
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,19.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L9,15v1c0,1.1 0.9,2 2,2v1.93zM17.9,17.39c-0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L8,12v-2h2c0.55,0 1,-0.45 1,-1L11,7h2c1.1,0 2,-0.9 2,-2v-0.41c2.93,1.19 5,4.06 5,7.41 0,2.08 -0.8,3.97 -2.1,5.39z"/>
|
||||
</vector>
|
10
src/android/app/src/main/res/drawable/ic_joined.xml
Normal file
10
src/android/app/src/main/res/drawable/ic_joined.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
|
||||
</vector>
|
9
src/android/app/src/main/res/drawable/ic_multiplayer.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_multiplayer.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
|
||||
</vector>
|
14
src/android/app/src/main/res/drawable/item_release_box.xml
Normal file
14
src/android/app/src/main/res/drawable/item_release_box.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="?attr/colorSurface" />
|
||||
<stroke
|
||||
android:width="1dp"
|
||||
android:color="?attr/colorOutline" />
|
||||
<corners android:radius="8dp" />
|
||||
<padding
|
||||
android:left="12dp"
|
||||
android:top="12dp"
|
||||
android:right="12dp"
|
||||
android:bottom="12dp" />
|
||||
</shape>
|
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="?attr/colorSurfaceVariant" />
|
||||
<corners android:radius="8dp" />
|
||||
<padding
|
||||
android:left="8dp"
|
||||
android:right="8dp"
|
||||
android:top="0dp"
|
||||
android:bottom="0dp" />
|
||||
</shape>
|
219
src/android/app/src/main/res/layout-land/fragment_games.xml
Normal file
219
src/android/app/src/main/res/layout-land/fragment_games.xml
Normal file
@@ -0,0 +1,219 @@
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/colorSurface"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginHorizontal="20dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/app_name"
|
||||
android:textAppearance="@style/TextAppearance.Material3.HeadlineLarge"
|
||||
android:textSize="27sp"
|
||||
android:textStyle="bold"
|
||||
/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/frame_search"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="15dp"
|
||||
android:layout_weight="1"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/header"
|
||||
>
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/search_background"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
app:cardCornerRadius="21dp"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/search_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="18dp"
|
||||
android:layout_marginEnd="42dp"
|
||||
android:orientation="horizontal"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="21dp"
|
||||
android:layout_height="21dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="18dp"
|
||||
android:src="@drawable/ic_search"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/search_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/transparent"
|
||||
android:hint="@string/home_search_games"
|
||||
android:inputType="text"
|
||||
android:maxLines="1"
|
||||
android:imeOptions="flagNoFullscreen"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/clear_button"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:layout_marginEnd="18dp"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:src="@drawable/ic_clear"
|
||||
android:visibility="invisible"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
/>
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/view_button"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="42dp"
|
||||
android:layout_height="42dp"
|
||||
app:cardCornerRadius="21dp"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_gravity="center"
|
||||
android:src="@drawable/ic_eye"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
/>
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<Space
|
||||
android:layout_width="15dp"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/filter_button"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="42dp"
|
||||
android:layout_height="42dp"
|
||||
app:cardCornerRadius="21dp"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_gravity="center"
|
||||
android:src="@drawable/ic_filter"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
/>
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<Space
|
||||
android:layout_width="15dp"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/settings_button"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="42dp"
|
||||
android:layout_height="42dp"
|
||||
app:cardCornerRadius="21dp"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_gravity="center"
|
||||
android:src="@drawable/ic_settings"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
/>
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
android:id="@+id/swipe_refresh"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="8dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/header"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
>
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/notice_text"
|
||||
style="@style/TextAppearance.Material3.BodyLarge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:padding="@dimen/spacing_large"
|
||||
android:text="@string/empty_gamelist"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/grid_games"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:scrollbarStyle="outsideOverlay"
|
||||
android:scrollbars="vertical"
|
||||
android:fadeScrollbars="true"
|
||||
android:paddingHorizontal="4dp"
|
||||
android:paddingVertical="4dp"
|
||||
/>
|
||||
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
android:id="@+id/add_directory"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="16dp"
|
||||
android:contentDescription="Select_game_folder"
|
||||
android:text="@string/folder"
|
||||
app:icon="@drawable/ic_cartridge_outline"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:textColor="?attr/colorOnPrimaryContainer"
|
||||
app:backgroundTint="?attr/colorPrimaryContainer"
|
||||
app:iconTint="?attr/colorOnPrimaryContainer"
|
||||
/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
226
src/android/app/src/main/res/layout/dialog_lobby_browser.xml
Normal file
226
src/android/app/src/main/res/layout/dialog_lobby_browser.xml
Normal file
@@ -0,0 +1,226 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent"
|
||||
android:elevation="0dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_scrollFlags="scroll|enterAlways|snap">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingHorizontal="16dp"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<Space
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="0dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="@string/multiplayer_room_browser"
|
||||
android:textAppearance="@style/TextAppearance.Material3.TitleLarge" />
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/refresh_button"
|
||||
style="@style/Widget.Material3.Button.IconButton"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:text="@string/refresh"
|
||||
app:icon="@drawable/ic_refresh" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
style="?android:attr/progressBarStyleSmall"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/search_background"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginTop="12dp"
|
||||
app:cardCornerRadius="24dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/search_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:src="@drawable/ic_search"
|
||||
app:tint="?attr/colorOnSurfaceVariant" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/search_text"
|
||||
android:layout_width="180dp"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/transparent"
|
||||
android:hint="@string/multiplayer_search_public_lobbies"
|
||||
android:imeOptions="flagNoFullscreen"
|
||||
android:inputType="text"
|
||||
android:maxLines="1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/clear_button"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:layout_marginEnd="48dp"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:src="@drawable/ic_clear"
|
||||
android:visibility="invisible"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/btn_submit"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:src="@drawable/ic_send"
|
||||
android:contentDescription="@string/submit"
|
||||
app:tint="?attr/colorOnSurfaceVariant"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<HorizontalScrollView
|
||||
android:id="@+id/horizontalScrollView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fadingEdge="horizontal"
|
||||
android:scrollbars="none"
|
||||
android:layout_marginVertical="8dp"
|
||||
android:clipToPadding="false"
|
||||
android:paddingHorizontal="16dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/chips"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/chip_hide_empty"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checkable="true"
|
||||
android:checked="false"
|
||||
android:text="@string/multiplayer_hide_empty_rooms"
|
||||
app:chipCornerRadius="16dp" />
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/chip_hide_full"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checkable="true"
|
||||
android:checked="false"
|
||||
android:text="@string/multiplayer_hide_full_rooms"
|
||||
app:chipCornerRadius="16dp" />
|
||||
|
||||
</LinearLayout>
|
||||
</HorizontalScrollView>
|
||||
</LinearLayout>
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/room_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:contentDescription="@string/room_list"
|
||||
android:paddingBottom="16dp"
|
||||
android:scrollbars="vertical"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/empty_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center"
|
||||
android:padding="32dp"
|
||||
android:visibility="gone">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="72dp"
|
||||
android:layout_height="72dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:src="@drawable/ic_refresh"
|
||||
android:alpha="0.5"
|
||||
app:tint="?attr/colorOnSurface" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/multiplayer_no_rooms_found"
|
||||
android:textAppearance="@style/TextAppearance.Material3.TitleMedium" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/multiplayer_tap_refresh_to_check_again"
|
||||
android:textAppearance="@style/TextAppearance.Material3.BodyMedium" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/empty_refresh_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/refresh"
|
||||
app:icon="@drawable/ic_refresh" />
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
@@ -28,7 +28,7 @@
|
||||
|
||||
<ImageView
|
||||
android:layout_width="140dp"
|
||||
android:layout_height="140dp"
|
||||
android:layout_height="114dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="24dp"
|
||||
@@ -38,19 +38,45 @@
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Space
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_lobby_browser"
|
||||
style="@style/Widget.Material3.Button.ElevatedButton"
|
||||
android:layout_width="175dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/multiplayer_public_room"
|
||||
app:cornerRadius="16dp"
|
||||
app:icon="@drawable/ic_search" />
|
||||
|
||||
<Space
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_marginBottom="8dp">
|
||||
android:layout_marginBottom="8dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_join"
|
||||
style="@style/Widget.Material3.Button.TonalButton"
|
||||
style="@style/Widget.Material3.Button.ElevatedButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/multiplayer_join_room"
|
||||
app:icon="@drawable/ic_install"
|
||||
app:cornerRadius="16dp" />
|
||||
app:cornerRadius="16dp"
|
||||
app:icon="@drawable/ic_install" />
|
||||
|
||||
<Space
|
||||
android:layout_width="16dp"
|
||||
@@ -58,13 +84,13 @@
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_create"
|
||||
style="@style/Widget.Material3.Button"
|
||||
style="@style/Widget.Material3.Button.ElevatedButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/multiplayer_create_room"
|
||||
app:icon="@drawable/ic_add"
|
||||
app:cornerRadius="16dp" />
|
||||
app:cornerRadius="16dp"
|
||||
app:icon="@drawable/ic_add" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@@ -59,6 +59,22 @@
|
||||
android:inputType="text" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||
android:id="@+id/preferred_game_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:hint="@string/multiplayer_preferred_game_name">
|
||||
|
||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||
android:id="@+id/dropdown_preferred_game_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="none"
|
||||
/>
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/multiplayer_password"
|
||||
android:layout_marginTop="8dp">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/password_input"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
</LinearLayout>
|
34
src/android/app/src/main/res/layout/dialog_progress.xml
Normal file
34
src/android/app/src/main/res/layout/dialog_progress.xml
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/dialog_progress_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:textAlignment="center"
|
||||
android:textAppearance="?attr/textAppearanceHeadline6"
|
||||
android:textColor="?attr/colorPrimary" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:indeterminate="true"
|
||||
android:layout_marginBottom="8dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAlignment="center"
|
||||
android:textAppearance="?attr/textAppearanceBody1"
|
||||
android:textColor="?attr/colorOnSurface" />
|
||||
|
||||
</LinearLayout>
|
9
src/android/app/src/main/res/layout/dropdown_item.xml
Normal file
9
src/android/app/src/main/res/layout/dropdown_item.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/dropdown_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textAppearance="?attr/textAppearanceSubtitle1" />
|
116
src/android/app/src/main/res/layout/fragment_driver_fetcher.xml
Normal file
116
src/android/app/src/main/res/layout/fragment_driver_fetcher.xml
Normal file
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/coordinator_licenses"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/colorSurface">
|
||||
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/appbar_drivers"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true"
|
||||
android:touchscreenBlocksFocus="false"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
|
||||
app:liftOnScrollTargetViewId="@id/list_drivers">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar_drivers"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:touchscreenBlocksFocus="false"
|
||||
app:navigationIcon="@drawable/ic_back"
|
||||
app:title="@string/gpu_driver_fetcher" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/label_gpu_model"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:padding="8dp"
|
||||
android:text="@string/gpu_model"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/appbar_drivers" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/badge_gpu_model"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:background="@drawable/item_release_latest_badge_background"
|
||||
android:textColor="?attr/colorPrimary"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/label_gpu_model"
|
||||
app:layout_constraintStart_toEndOf="@id/label_gpu_model"
|
||||
app:layout_constraintTop_toTopOf="@id/label_gpu_model" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/label_recommended_driver"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:padding="8dp"
|
||||
android:text="@string/recommended_driver"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/label_gpu_model" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/badge_recommended_driver"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:background="@drawable/item_release_latest_badge_background"
|
||||
android:textColor="?attr/colorPrimary"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/label_recommended_driver"
|
||||
app:layout_constraintStart_toEndOf="@id/label_recommended_driver"
|
||||
app:layout_constraintTop_toTopOf="@id/label_recommended_driver" />
|
||||
|
||||
<View
|
||||
android:id="@+id/divider"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:background="?attr/colorOutline"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/label_recommended_driver" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/list_drivers"
|
||||
android:layout_height="0dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginTop="8dp"
|
||||
android:clipToPadding="false"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
app:layout_constraintTop_toBottomOf="@id/divider"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/loadingIndicator"
|
||||
style="?android:attr/progressBarStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:visibility="invisible"
|
||||
app:layout_constraintEnd_toEndOf="@id/list_drivers"
|
||||
app:layout_constraintStart_toStartOf="@id/list_drivers"
|
||||
app:layout_constraintTop_toTopOf="@id/list_drivers" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@@ -7,6 +7,7 @@
|
||||
android:background="?attr/colorSurface">
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/coordinatorLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
@@ -47,4 +48,14 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
android:id="@+id/button_fetch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|start"
|
||||
android:text="@string/fetch"
|
||||
app:icon="@drawable/ic_import"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
@@ -155,11 +155,10 @@
|
||||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/show_thermals_text"
|
||||
android:id="@+id/show_soc_overlay_text"
|
||||
style="@style/TextAppearance.Material3.BodySmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="right"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:textColor="@android:color/white"
|
||||
|
39
src/android/app/src/main/res/layout/item_driver_group.xml
Normal file
39
src/android/app/src/main/res/layout/item_driver_group.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_group_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="?attr/colorControlNormal"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/image_dropdown_arrow" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/image_dropdown_arrow"
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="24dp"
|
||||
android:src="@drawable/ic_dropdown_arrow"
|
||||
app:tint="?attr/colorControlNormal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:contentDescription="@string/show_releases" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recycler_releases"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@id/text_group_name"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginTop="8dp" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
113
src/android/app/src/main/res/layout/item_lobby_room.xml
Normal file
113
src/android/app/src/main/res/layout/item_lobby_room.xml
Normal file
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="24dp"
|
||||
android:layout_marginHorizontal="12dp"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:backgroundTint="?attr/colorSurfaceVariant"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="12dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/lock_icon"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:contentDescription="@string/multiplayer_password_protected"
|
||||
android:src="@drawable/ic_lock"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:tint="?attr/colorOnSurface" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginEnd="8dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/lock_icon"
|
||||
app:layout_constraintBottom_toBottomOf="parent">
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/room_name"
|
||||
style="@style/TextAppearance.Material3.BodyMedium"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="Room Name" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/room_owner"
|
||||
style="@style/TextAppearance.Material3.BodySmall"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="14sp"
|
||||
tools:text="Hosted by: Owner" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/game_info"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:contentDescription="@string/multiplayer_game"
|
||||
android:src="@drawable/ic_controller" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/game_name"
|
||||
style="@style/TextAppearance.Material3.LabelMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textStyle="bold"
|
||||
tools:text="Game Name" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="16dp"
|
||||
android:src="@drawable/ic_user"
|
||||
android:contentDescription="@string/multiplayer_player_count"
|
||||
app:tint="?attr/colorAccent" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/player_count"
|
||||
style="@style/TextAppearance.Material3.BodyMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:textColor="?attr/colorAccent"
|
||||
tools:text="2/4" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
82
src/android/app/src/main/res/layout/item_release.xml
Normal file
82
src/android/app/src/main/res/layout/item_release.xml
Normal file
@@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/item_release_box"
|
||||
android:padding="8dp"
|
||||
android:paddingStart="12dp"
|
||||
tools:ignore="RtlSymmetry">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_release_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/badge_latest"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/latest"
|
||||
android:textColor="?attr/colorPrimary"
|
||||
android:textSize="14sp"
|
||||
android:background="@drawable/item_release_latest_badge_background"
|
||||
app:layout_constraintStart_toEndOf="@id/text_release_name"
|
||||
app:layout_constraintTop_toTopOf="@id/text_release_name"
|
||||
app:layout_constraintBottom_toBottomOf="@id/text_release_name"
|
||||
android:layout_marginStart="8dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_body"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="3"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/text_release_name" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_toggle_downloads"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_downloads"
|
||||
android:textStyle="bold"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/text_body"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/image_downloads_arrow"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:contentDescription="@string/show_downloads"
|
||||
android:src="@drawable/ic_dropdown_arrow"
|
||||
app:layout_constraintBottom_toBottomOf="@id/button_toggle_downloads"
|
||||
app:layout_constraintStart_toEndOf="@id/button_toggle_downloads"
|
||||
app:layout_constraintTop_toTopOf="@id/button_toggle_downloads"
|
||||
app:tint="?attr/colorControlNormal" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/container_downloads"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@id/button_toggle_downloads"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginTop="8dp" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@@ -6,6 +6,11 @@
|
||||
android:title="@string/show_stats_overlay"
|
||||
android:checkable="true" />
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_show_soc_overlay"
|
||||
android:title="@string/show_soc_overlay"
|
||||
android:checkable="true" />
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_edit_overlay"
|
||||
android:title="@string/emulation_touch_overlay_edit" />
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/home_navigation"
|
||||
app:startDestination="@id/gamesFragment">
|
||||
|
||||
@@ -111,6 +112,9 @@
|
||||
app:argType="org.yuzu.yuzu_emu.model.Game"
|
||||
app:nullable="true"
|
||||
android:defaultValue="@null" />
|
||||
<action
|
||||
android:id="@+id/action_driverManagerFragment_to_driverFetcherFragment"
|
||||
app:destination="@id/driverFetcherFragment" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/appletLauncherFragment"
|
||||
@@ -164,5 +168,10 @@
|
||||
android:name="game"
|
||||
app:argType="org.yuzu.yuzu_emu.model.Game" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/driverFetcherFragment"
|
||||
android:name="org.yuzu.yuzu_emu.fragments.DriverFetcherFragment"
|
||||
android:label="fragment_driver_fetcher"
|
||||
tools:layout="@layout/fragment_driver_fetcher" />
|
||||
|
||||
</navigation>
|
||||
|
@@ -7,6 +7,9 @@
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(مُحسَّن)</string>
|
||||
<string name="process_ram">ذاكرة RAM للعملية: %1$d م.ب</string>
|
||||
<string name="shaders_prefix">جاري بناء</string>
|
||||
<string name="shaders_suffix">شادر(شادرات)</string>
|
||||
<string name="system_info_label">النظام:</string>
|
||||
<string name="show_stats_overlay">عرض إحصائيات الأداء</string>
|
||||
<string name="stats_overlay_customization">تخصيص</string>
|
||||
@@ -26,6 +29,8 @@
|
||||
<string name="show_system_ram_usage_description">عرض كمية ذاكرة الوصول العشوائي المستخدمة من قبل النظام</string>
|
||||
<string name="show_bat_temperature">عرض درجة حرارة البطارية</string>
|
||||
<string name="show_bat_temperature_description">عرض درجة حرارة البطارية الحالية</string>
|
||||
<string name="show_shaders_building">عرض بناء الشادرات</string>
|
||||
<string name="show_shaders_building_description">عرض العدد الحالي للشادرات التي يتم بناؤها</string>
|
||||
<string name="overlay_position">موضع العرض</string>
|
||||
<string name="overlay_position_description">اختيار مكان عرض الإحصائيات على الشاشة</string>
|
||||
<string name="overlay_position_top_left">أعلى اليسار</string>
|
||||
@@ -34,12 +39,30 @@
|
||||
<string name="overlay_position_bottom_right">أسفل اليمين</string>
|
||||
<string name="overlay_position_center_top">منتصف الأعلى</string>
|
||||
<string name="overlay_position_center_bottom">منتصف الأسفل</string>
|
||||
<string name="overlay_background">خلفية العرض</string>
|
||||
<string name="overlay_background_description">إضافة خلفية لعرض الإحصائيات لسهولة القراءة</string>
|
||||
<string name="perf_overlay_background">خلفية العرض</string>
|
||||
<string name="perf_overlay_background_description">إضافة خلفية لعرض الإحصائيات لسهولة القراءة</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">عرض تراكب معلومات الجهاز</string>
|
||||
<string name="enable_soc_overlay">تمكين تراكب الجهاز</string>
|
||||
<string name="soc_overlay_options">تراكب الجهاز</string>
|
||||
<string name="soc_overlay_options_description">تكوين المعلومات المعروضة في تراكب الجهاز</string>
|
||||
|
||||
<string name="show_device_model">عرض طراز الجهاز</string>
|
||||
<string name="show_device_model_description">عرض طراز الجهاز المضيف</string>
|
||||
<string name="show_gpu_model">عرض طراز GPU</string>
|
||||
<string name="show_gpu_model_description">عرض طراز GPU المضيف</string>
|
||||
<string name="show_soc_model">عرض طراز SoC</string>
|
||||
<string name="show_soc_model_description">عرض طراز SoC المضيف</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">امتدادات GPU</string>
|
||||
<string name="veil_renderer">العارض</string>
|
||||
<string name="veil_misc">متنوع</string>
|
||||
<string name="eden_veil">حجاب عدن</string>
|
||||
<string name="eden_veil_description">ما بعد الافتراضي</string>
|
||||
<string name="eden_veil_description">إعدادات تجريبية لتحسين الأداء والقدرة. قد تسبب هذه الإعدادات شاشات سوداء أو مشاكل أخرى في اللعبة.</string>
|
||||
<string name="eden_veil_warning_title">إعدادات تجريبية</string>
|
||||
<string name="eden_veil_warning_description">الإعدادات الموجودة في إيدن فيل تجريبية للغاية وقد تسبب مشاكل. إذا لم يتم تشغيل لعبتك، قم بتعطيل أي ملحقات وقم بتغيير الحالة الديناميكية الممتدة إلى 0.</string>
|
||||
<string name="frame_skipping">قيد التطوير: تخطي الإطارات</string>
|
||||
<string name="frame_skipping_description">تبديل تخطي الإطارات لتحسين الأداء عن طريق تقليل عدد الإطارات المعروضة. هذه الميزة قيد التطوير وسيتم تمكينها في الإصدارات المستقبلية.</string>
|
||||
<string name="frame_interpolation">تحسين توقيت الإطارات</string>
|
||||
@@ -47,7 +70,7 @@
|
||||
<string name="use_lru_cache">تمكين ذاكرة التخزين المؤقت LRU</string>
|
||||
<string name="use_lru_cache_description">تمكين أو تعطيل ذاكرة التخزين المؤقت الأقل استخدامًا (LRU)، مما يزيد الأداء عن طريق توفير استخدام وحدة المعالجة المركزية. بعض الألعاب بها مشاكل معها، خاصة TotK 1.2.1، لذا قم بتعطيلها إذا لم يتم تشغيل اللعبة أو تعطلت بشكل عشوائي.</string>
|
||||
<string name="dyna_state">الحالة الديناميكية الممتدة</string>
|
||||
<string name="dyna_state_description">يُمكّن ميزات فولكان لتحسين الأداء، التقديم، وتوفير الموارد أثناء إنشاء خطوط المعالجة مع الحفاظ على استهلاك أقل لوحدة المعالجة المركزية/وحدة معالجة الرسومات. قد تزيد هذه الامتدادات من درجة حرارة الجهاز، وقد لا تتفاعل وحدات معالجة الرسومات القديمة من سلسلة A6XX بشكل صحيح. اضبط على 0 لاستخدام تنسيقات Yuzu المحاكاة.</string>
|
||||
<string name="dyna_state_description">يُمكّن ميزات فولكان لتحسين الأداء وعرض الرسومات وتوفير الموارد عند إنشاء خطوط المعالجة مع الحفاظ على استهلاك منخفض لوحدة المعالجة المركزية/وحدة معالجة الرسومات. قد تزيد هذه الامتدادات من درجة حرارة الجهاز، وقد لا تعمل وحدات معالجة الرسومات من سلسلة A6XX القديمة بشكل صحيح. اضبط على 0 لاستخدام الأشكال المحاكاة التقليدية.</string>
|
||||
<string name="use_sync_core">مزامنة سرعة النواة</string>
|
||||
<string name="use_sync_core_description">مزامنة سرعة النواة مع النسبة القصوى للسرعة لتحسين الأداء دون تغيير السرعة الفعلية للعبة.</string>
|
||||
<string name="use_auto_stub">استخدام الستاب التلقائي</string>
|
||||
@@ -62,42 +85,65 @@
|
||||
<string name="descriptor_indexing_description">يحسن معالجة القوام والمخازن المؤقتة، بالإضافة إلى طبقة ترجمة ماكسويل. مدعوم من قبل بعض وحدات معالجة الرسومات التي تدعم فولكان 1.1 وجميع وحدات معالجة الرسومات التي تدعم فولكان 1.2+.</string>
|
||||
<string name="use_fast_gpu_time">استخدام وقت GPU السريع</string>
|
||||
<string name="use_fast_gpu_time_description">يجبر معظم الألعاب على العمل بأعلى دقة أصلية. هذا الخيار غير مثبت وقد يسبب مشاكل.</string>
|
||||
<string name="fast_gpu_time">عامل زيادة سرعة GPU</string>
|
||||
<string name="fast_gpu_time_description">استخدم 128 لأقصى أداء و512 لأقصى دقة رسومية.</string>
|
||||
<string name="use_fast_cpu_time">وقت CPU سريع</string>
|
||||
<string name="use_fast_cpu_time_description">يجبر وحدة المعالجة المركزية المحاكاة على العمل بسرعة أعلى، مما يقلل من بعض محددات معدل الإطارات. هذا الخيار غير مستقر وقد يسبب مشاكل، وقد يرى المستخدمون بأجهزة أضعف انخفاضًا في الأداء.</string>
|
||||
<string name="fast_cpu_time">سرعة CPU</string>
|
||||
<string name="fast_cpu_time_description">استخدم Boost (1700MHz) للتشغيل بأعلى سرعة أصلية لـ Switch، أو Fast (2000MHz) للتشغيل بضعف السرعة.</string>
|
||||
<string name="memory_layout">تخطيط الذاكرة</string>
|
||||
<string name="memory_layout_description">(تجريبي) تغيير تخطيط الذاكرة المحاكاة. هذا الإعداد لن يزيد الأداء، ولكن قد يساعد في الألعاب التي تستخدم دقة عالية عبر التعديلات. لا تستخدم على الهواتف التي تحتوي على 8 جيجابايت من الذاكرة العشوائية أو أقل.</string>
|
||||
|
||||
<!-- طرق فك ضغط ASTC -->
|
||||
<!-- Memory Layouts -->
|
||||
<string name="memory_4gb">4 جيجابايت (موصى به)</string>
|
||||
<string name="memory_6gb">6 جيجابايت (غير آمن)</string>
|
||||
<string name="memory_8gb">8 جيجابايت (غير آمن)</string>
|
||||
|
||||
<!--CPU clock speeds-->
|
||||
<string name="clock_base">أساسي (1000MHz)</string>
|
||||
<string name="clock_boost">زيادة (1700MHz)</string>
|
||||
<string name="clock_fast">سريع (2000MHz)</string>
|
||||
|
||||
<!-- GPU overclock factors -->
|
||||
<string name="gpu_low">منخفض (128)</string>
|
||||
<string name="gpu_medium">متوسط (256)</string>
|
||||
<string name="gpu_high">مرتفع (512)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">طريقة فك ضغط ASTC</string>
|
||||
<string name="accelerate_astc_description">اختر كيفية فك ضغط نسيج ASTC للعرض: CPU (بطيء، آمن)، GPU (سريع، موصى به)، أو CPU Async (بدون توقف، قد يسبب مشاكل)</string>
|
||||
<string name="accelerate_astc_cpu">وحدة المعالجة المركزية</string>
|
||||
<string name="accelerate_astc_gpu">وحدة المعالجة الرسومية</string>
|
||||
<string name="accelerate_astc_async">وحدة المعالجة المركزية غير المتزامنة</string>
|
||||
|
||||
<!-- طرق إعادة ضغط ASTC -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">طريقة إعادة ضغط ASTC</string>
|
||||
<string name="astc_recompression_description">اختر كيفية إعادة ضغط نسيج ASTC لتحسين التوافق والأداء. تمكين هذا الخيار يوفر VRAM ولكن قد يقلل من جودة النسيج.</string>
|
||||
<string name="astc_recompression_description">اختر كيفية إعادة ضغط نسيج ASTC لتحسين التوافق والأداء. تمكين هذا الخيار يوفر VRAM ولكن قد يقلل من جودة النسيج.</string>
|
||||
<string name="astc_recompression_uncompressed">غير مضغوط</string>
|
||||
<string name="astc_recompression_bc1">BC1 (جودة منخفضة)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (جودة متوسطة)</string>
|
||||
|
||||
<!-- وضع استخدام VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">وضع استخدام VRAM</string>
|
||||
<string name="vram_usage_mode_description">التحكم في إدارة ذاكرة GPU</string>
|
||||
<string name="vram_usage_conservative">محافظ</string>
|
||||
<string name="vram_usage_aggressive">عدواني</string>
|
||||
|
||||
<!-- خلفية Shader -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">خلفية Shader</string>
|
||||
<string name="shader_backend_description">اختيار طريقة ترجمة Shaders</string>
|
||||
<string name="shader_backend_glsl">عام</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- محاكاة NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">محاكاة NVDEC</string>
|
||||
<string name="nvdec_emulation_description">اختيار طريقة معالجة الفيديو</string>
|
||||
<string name="nvdec_emulation_cpu">وحدة المعالجة المركزية</string>
|
||||
<string name="nvdec_emulation_gpu">وحدة المعالجة الرسومية</string>
|
||||
<string name="nvdec_emulation_none">لا شيء</string>
|
||||
|
||||
<!-- تحسين SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">تحسين SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">يحسن الشادر المترجم لزيادة كفاءة GPU.</string>
|
||||
<string name="never">أبداً</string>
|
||||
@@ -105,75 +151,99 @@
|
||||
<string name="always">دائماً</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">اللعب الجماعي</string>
|
||||
<string name="multiplayer_description">إنشاء غرفة أو الانضمام إلى واحدة</string>
|
||||
<string name="multiplayer">متعدد اللاعبين</string>
|
||||
<string name="multiplayer_description">استضف غرفة لعبتك الخاصة أو انضم إلى غرفة موجودة للعب مع الآخرين</string>
|
||||
<string name="multiplayer_room_title">الغرفة: %1$s</string>
|
||||
<string name="multiplayer_console_id">معرف الجهاز: %1$s</string>
|
||||
<string name="multiplayer_console_id">معرف الكونسول: %1$s</string>
|
||||
<string name="multiplayer_create_room">إنشاء</string>
|
||||
<string name="multiplayer_join_room">انضمام</string>
|
||||
<string name="multiplayer_join_room">انضم</string>
|
||||
<string name="multiplayer_public_room">تصفح الغرف العامة</string>
|
||||
<string name="multiplayer_username">اسم المستخدم</string>
|
||||
<string name="multiplayer_ip_address">عنوان IP</string>
|
||||
<string name="multiplayer_ip_port">المنفذ</string>
|
||||
<string name="multiplayer_create_room_success">تم إنشاء الغرفة!</string>
|
||||
<string name="multiplayer_join_room_success">تم الانضمام!</string>
|
||||
<string name="multiplayer_create_room_failed">فشل الإنشاء!</string>
|
||||
<string name="multiplayer_join_room_failed">فشل الانضمام!</string>
|
||||
<string name="multiplayer_input_invalid">عنوان أو اسم غير صالح!</string>
|
||||
<string name="multiplayer_create_room_success">تم إنشاء الغرفة بنجاح</string>
|
||||
<string name="multiplayer_join_room_success">تم الانضمام إلى الغرفة بنجاح</string>
|
||||
<string name="multiplayer_create_room_failed">فشل في إنشاء الغرفة</string>
|
||||
<string name="multiplayer_join_room_failed">فشل في الانضمام إلى الغرفة</string>
|
||||
<string name="multiplayer_name_invalid">الاسم قصير جدًا</string>
|
||||
<string name="multiplayer_address_invalid">عنوان غير صالح</string>
|
||||
<string name="multiplayer_port_invalid">منفذ غير صالح!</string>
|
||||
<string name="multiplayer_exit_room">مغادرة الغرفة</string>
|
||||
<string name="multiplayer_network_error">خطأ في الشبكة</string>
|
||||
<string name="multiplayer_lost_connection">فقدان الاتصال</string>
|
||||
<string name="multiplayer_name_collision">تعارض أسماء</string>
|
||||
<string name="multiplayer_mac_collision">تعارض MAC</string>
|
||||
<string name="multiplayer_console_id_collision">تعارض معرف الجهاز</string>
|
||||
<string name="multiplayer_name_collision">تعارض في الاسم</string>
|
||||
<string name="multiplayer_mac_collision">تعارض في عنوان MAC</string>
|
||||
<string name="multiplayer_console_id_collision">تعارض في معرف الجهاز</string>
|
||||
<string name="multiplayer_wrong_version">إصدار خاطئ</string>
|
||||
<string name="multiplayer_wrong_password">كلمة مرور خاطئة</string>
|
||||
<string name="multiplayer_could_not_connect">تعذر الاتصال</string>
|
||||
<string name="multiplayer_room_is_full">الغرفة ممتلئة</string>
|
||||
<string name="multiplayer_host_banned">المضيف محظور</string>
|
||||
<string name="multiplayer_permission_denied">رفض الإذن</string>
|
||||
<string name="multiplayer_no_such_user">مستخدم غير موجود</string>
|
||||
<string name="multiplayer_already_in_room">مستخدم موجود بالفعل</string>
|
||||
<string name="multiplayer_create_room_error">خطأ في الإنشاء</string>
|
||||
<string name="multiplayer_host_kicked">طرد المضيف</string>
|
||||
<string name="multiplayer_permission_denied">تم رفض الإذن</string>
|
||||
<string name="multiplayer_no_such_user">لا يوجد مثل هذا المستخدم</string>
|
||||
<string name="multiplayer_already_in_room">موجود بالفعل في الغرفة</string>
|
||||
<string name="multiplayer_create_room_error">خطأ في إنشاء الغرفة</string>
|
||||
<string name="multiplayer_host_kicked">تم طرد المضيف</string>
|
||||
<string name="multiplayer_unknown_error">خطأ غير معروف</string>
|
||||
<string name="multiplayer_room_uninitialized">غرفة غير مهيأة</string>
|
||||
<string name="multiplayer_room_idle">غرفة خاملة</string>
|
||||
<string name="multiplayer_room_joining">جاري الانضمام</string>
|
||||
<string name="multiplayer_room_joined">تم الانضمام</string>
|
||||
<string name="multiplayer_room_uninitialized">الغرفة غير مهيأة</string>
|
||||
<string name="multiplayer_room_idle">الغرفة خاملة</string>
|
||||
<string name="multiplayer_room_joining">جارٍ الانضمام إلى الغرفة</string>
|
||||
<string name="multiplayer_room_joined">تم الانضمام إلى الغرفة</string>
|
||||
<string name="multiplayer_room_moderator">مشرف الغرفة</string>
|
||||
<string name="multiplayer_member_join">%1$s انضم</string>
|
||||
<string name="multiplayer_member_leave">%1$s غادر</string>
|
||||
<string name="multiplayer_member_kicked">%1$s طرد</string>
|
||||
<string name="multiplayer_member_banned">%1$s حظر</string>
|
||||
<string name="multiplayer_address_unbanned">رفع الحظر</string>
|
||||
<string name="multiplayer_member_kicked">%1$s طُرِد</string>
|
||||
<string name="multiplayer_member_banned">%1$s حُظِر</string>
|
||||
<string name="multiplayer_address_unbanned">تم إلغاء حظر العنوان</string>
|
||||
<string name="multiplayer_kick_member">طرد</string>
|
||||
<string name="multiplayer_chat_input_hint">إرسال رسالة...</string>
|
||||
<string name="multiplayer_chat_input_hint">إرسال رسائل…</string>
|
||||
<string name="multiplayer_password">كلمة المرور</string>
|
||||
<string name="original_button_text">انضمام</string>
|
||||
<string name="disabled_button_text">جاري الانضمام...</string>
|
||||
<string name="multiplayer_joining">جارٍ الانضمام…</string>
|
||||
<string name="multiplayer_creating">جارٍ الإنشاء…</string>
|
||||
<string name="multiplayer_room_name">اسم الغرفة</string>
|
||||
<string name="multiplayer_room_name_invalid">الاسم يجب أن يكون بين 3 و20 حرفاً</string>
|
||||
<string name="multiplayer_max_players">الحد الأقصى (16)</string>
|
||||
<string name="multiplayer_max_players_value">الحد الأقصى: %d</string>
|
||||
<string name="multiplayer_room_name_invalid">يجب أن يكون اسم الغرفة بين 3 و20 حرفًا</string>
|
||||
<string name="multiplayer_max_players">الحد الأقصى للاعبين (16)</string>
|
||||
<string name="multiplayer_max_players_value">الحد الأقصى للاعبين: %d</string>
|
||||
<string name="multiplayer_chat">الدردشة</string>
|
||||
<string name="multiplayer_more_options">المزيد</string>
|
||||
<string name="multiplayer_ip_copied">تم نسخ عنوان IP</string>
|
||||
<string name="multiplayer_more_options">المزيد من الخيارات</string>
|
||||
<string name="multiplayer_ip_copied">تم نسخ عنوان IP إلى الحافظة</string>
|
||||
<string name="multiplayer_server_address">عنوان الخادم</string>
|
||||
<string name="chat">الدردشة</string>
|
||||
<string name="type_message">اكتب رسالة...</string>
|
||||
<string name="type_message">اكتب رسالة…</string>
|
||||
<string name="send">إرسال</string>
|
||||
<string name="send_message">إرسال رسالة</string>
|
||||
<string name="multiplayer_moderation">الإدارة</string>
|
||||
<string name="multiplayer_moderation">الإشراف</string>
|
||||
<string name="multiplayer_moderation_title">قائمة الحظر</string>
|
||||
<string name="multiplayer_no_bans">لا يوجد مستخدمين محظورين</string>
|
||||
<string name="multiplayer_unban_title">رفع الحظر</string>
|
||||
<string name="multiplayer_unban">رفع الحظر</string>
|
||||
<string name="multiplayer_unban_message">هل تريد رفع الحظر عن %1$s؟</string>
|
||||
<string name="multiplayer_ban">حظر</string>
|
||||
<string name="emulation_multiplayer">اللعب الجماعي</string>
|
||||
<string name="multiplayer_no_bans">لا يوجد مستخدمون محظورون</string>
|
||||
<string name="multiplayer_unban_title">إلغاء حظر المستخدم</string>
|
||||
<string name="multiplayer_unban">إلغاء الحظر</string>
|
||||
<string name="multiplayer_unban_message">هل أنت متأكد أنك تريد إلغاء حظر %1$s؟</string>
|
||||
<string name="multiplayer_ban">حظر المستخدم</string>
|
||||
<string name="multiplayer_room_browser">الغرف العامة</string>
|
||||
<string name="multiplayer_no_rooms_found">لم يتم العثور على غرف عامة</string>
|
||||
<string name="multiplayer_password_required">كلمة المرور مطلوبة</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">اللعبة</string>
|
||||
<string name="multiplayer_no_game_info">أي لعبة</string>
|
||||
<string name="multiplayer_password_protected">غرفة محمية بكلمة مرور</string>
|
||||
<string name="multiplayer_hide_full_rooms">إخفاء الغرف الممتلئة</string>
|
||||
<string name="multiplayer_hide_empty_rooms">إخفاء الغرف الفارغة</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">اضغط على تحديث للتحقق مرة أخرى</string>
|
||||
<string name="multiplayer_search_public_lobbies">البحث في الغرف…</string>
|
||||
<string name="emulation_multiplayer">متعدد اللاعبين</string>
|
||||
<string name="multiplayer_game_name">الألعاب المفضلة</string>
|
||||
<string name="multiplayer_preferred_game_name">اللعبة المفضلة</string>
|
||||
<string name="multiplayer_no_game">لم يتم العثور على ألعاب</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">يجب اختيار لعبة مفضلة لاستضافة غرفة.</string>
|
||||
<string name="multiplayer_room_name_error">يجب أن يكون بين 3 و20 حرفًا</string>
|
||||
<string name="multiplayer_required">مطلوب</string>
|
||||
<string name="multiplayer_ip_error">تنسيق IP غير صالح</string>
|
||||
<string name="multiplayer_username_error">يجب أن يكون 5 أحرف على الأقل</string>
|
||||
<string name="multiplayer_port_error">يجب أن يكون بين 1 و65535</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="ok">موافق</string>
|
||||
<string name="refresh">تحديث</string>
|
||||
<string name="room_list">قائمة الغرف</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">لون السمة</string>
|
||||
@@ -309,6 +379,8 @@
|
||||
<string name="no_save_data_found">لم يتم العثور على بيانات الحفظ</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">تشغيل التطبيقات من الشاشة الرئيسية للنظام</string>
|
||||
<string name="applets">قائمة التطبيقات المصغرة</string>
|
||||
<string name="applets_description">قم بتشغيل تطبيقات النظام باستخدام فيرموير المثبت</string>
|
||||
<string name="applets_error_firmware">فيرموير غير مثبت</string>
|
||||
@@ -336,17 +408,6 @@
|
||||
<string name="user_data_import_success">تم استيراد بيانات المستخدم بنجاح</string>
|
||||
<string name="user_data_export_cancelled">تم إلغاء التصدير</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">الوصول المبكر</string>
|
||||
<string name="early_access_benefits">مزايا الوصول المبكر</string>
|
||||
<string name="cutting_edge_features">ميزات متطورة</string>
|
||||
<string name="early_access_updates">الوصول المبكر إلى التحديثات</string>
|
||||
<string name="no_manual_installation">لا يوجد التثبيت اليدوي</string>
|
||||
<string name="prioritized_support">الدعم ذو الأولوية</string>
|
||||
<string name="helping_game_preservation">المساعدة في الحفاظ على اللعبة</string>
|
||||
<string name="our_eternal_gratitude">امتناننا الأبدي</string>
|
||||
<string name="are_you_interested">هل انت مهتم؟</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">الحد من السرعة</string>
|
||||
<string name="frame_limit_enable_description">يحد من سرعة المحاكاة بنسبة محددة من السرعة العادية</string>
|
||||
@@ -356,6 +417,7 @@
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">اسم الجهاز</string>
|
||||
<string name="use_docked_mode">وضع الإرساء</string>
|
||||
<string name="use_docked_mode_description">زيادة الدقة، وانخفاض الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى خفض الدقة وزيادة الأداء.</string>
|
||||
<string name="emulated_region">المنطقة التي تمت محاكاتها</string>
|
||||
@@ -366,6 +428,11 @@
|
||||
<string name="use_custom_rtc_description">يسمح لك بتعيين ساعة مخصصة في الوقت الفعلي منفصلة عن وقت النظام الحالي لديك</string>
|
||||
<string name="set_custom_rtc">تعيين ساعة مخصصة في الوقت الحقيقي</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">رمز الويب</string>
|
||||
<string name="web_token_description">رمز الويب المستخدم لإنشاء غرف عامة. وهو سلسلة من 48 حرفًا تحتوي فقط على أحرف صغيرة من a-z.</string>
|
||||
<string name="network">الشبكة</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">مستوى الدقة</string>
|
||||
<string name="renderer_resolution">(Handheld/Docked) الدقة</string>
|
||||
@@ -388,6 +455,10 @@
|
||||
<string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">التسجيل</string>
|
||||
<string name="flush_by_line">تفريغ سجلات التصحيح حسب السطر</string>
|
||||
<string name="flush_by_line_description">يفرغ سجلات التصحيح عند كتابة كل سطر، مما يجعل التصحيح أسهل في حالات التوقف أو التجميد.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">محرك الإخراج</string>
|
||||
<string name="audio_volume">مستوى الصوت</string>
|
||||
@@ -427,6 +498,7 @@
|
||||
<string name="custom">مخصص</string>
|
||||
<string name="notice">إشعار</string>
|
||||
<string name="import_complete">اكتمل الاستيراد</string>
|
||||
|
||||
<!-- GPU driver installation -->
|
||||
<string name="select_gpu_driver">GPU حدد برنامج تشغيل</string>
|
||||
<string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب في استبدال برنامج تشغيل</string>
|
||||
@@ -438,7 +510,34 @@
|
||||
<string name="system_gpu_driver">تعريف معالج الرسومات الخاص بالنظام</string>
|
||||
<string name="installing_driver">جاري تثبيت برنامج التشغيل…</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="fetch_error">خطأ أثناء الجلب</string>
|
||||
<string name="check_connection">تحقق من اتصالك وحاول مرة أخرى.</string>
|
||||
<string name="show_releases">عرض الإصدارات</string>
|
||||
<string name="view_full_release_notes">ملاحظات الإصدار</string>
|
||||
<string name="failed_to_fetch">فشل في الجلب</string>
|
||||
<string name="error_during_fetch">خطأ أثناء الجلب</string>
|
||||
<string name="toggle_release_notes">تبديل ملاحظات الإصدار</string>
|
||||
<string name="downloads">التحميلات</string>
|
||||
<string name="show_downloads">عرض التحميلات</string>
|
||||
<string name="hide_downloads">إخفاء التحميلات</string>
|
||||
<string name="failed_cache_dir">دليل الذاكرة المؤقتة غير متاح</string>
|
||||
<string name="empty_response_body">نص الاستجابة فارغ</string>
|
||||
<string name="successfully_installed">تم تثبيت %1$s بنجاح</string>
|
||||
<string name="driver_failed_title">فشل تثبيت برنامج التشغيل</string>
|
||||
<string name="failed_install_driver">فشل تثبيت برنامج تشغيل %1$s، هل نظامك يدعمه؟</string>
|
||||
<string name="driver_empty">برنامج التشغيل الذي تم تنزيله فارغ، تحقق من اتصالك بالإنترنت</string>
|
||||
<string name="downloading">جارٍ التنزيل...</string>
|
||||
<string name="installing">جارٍ التثبيت...</string>
|
||||
<string name="latest">الأحدث</string>
|
||||
<string name="recommended_driver">برنامج التشغيل الموصى به:</string>
|
||||
<string name="gpu_model">طراز GPU:</string>
|
||||
<string name="unsupported_gpu">GPU غير مدعوم</string>
|
||||
<string name="unsupported_gpu_warning">GPU الخاص بك لا يدعم حقن برنامج التشغيل. لا يُنصح بمحاولة تعيين برامج تشغيل مخصصة.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="gpu_driver_fetcher">جلب برامج تشغيل GPU</string>
|
||||
<string name="fetch">جلب</string>
|
||||
<string name="preferences_settings">إعدادات</string>
|
||||
<string name="preferences_general">عام</string>
|
||||
<string name="preferences_system">النظام</string>
|
||||
@@ -642,6 +741,15 @@
|
||||
<string name="mute">كتم</string>
|
||||
<string name="unmute">إلغاء الكتم</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">التطبيقات الصغيرة</string>
|
||||
<string name="applets_menu_description">(قيد العمل) تغيير واجهات التطبيقات الصغيرة والإعدادات</string>
|
||||
|
||||
<string name="applet_hle">واجهة مخصصة</string>
|
||||
<string name="applet_lle">تطبيق حقيقي</string>
|
||||
|
||||
<string name="swkbd_applet">لوحة المفاتيح البرمجية</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">التراخيص</string>
|
||||
<string name="license_fidelityfx_fsr_description">AMD ترقية عالية الجودة من</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی <![CDATA[<b> prod.keys </b>]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">زیاتر فێربە</a>]]></string>
|
||||
<string name="app_disclaimer">ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی <![CDATA[<b> prod.keys </b>]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">زیاتر فێربە</a>]]></string>
|
||||
<string name="notice_notification_channel_name">ئاگاداری و هەڵەکان</string>
|
||||
<string name="notice_notification_channel_description">ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت.</string>
|
||||
<string name="notification_permission_not_granted">مۆڵەتی ئاگادارکردنەوە نەدراوە!</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(پێشکەوتوو)</string>
|
||||
<string name="process_ram">RAMی پرۆسە: %1$d MB</string>
|
||||
<string name="shaders_prefix">بیناکردنی</string>
|
||||
<string name="shaders_suffix">شەیدەر(ەکان)</string>
|
||||
<string name="system_info_label">سیستەم:</string>
|
||||
<string name="show_stats_overlay">پیشاندانی ستاتیستی کارایی</string>
|
||||
<string name="stats_overlay_customization">خۆڕێکخستن</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">خوارەوە ڕاست</string>
|
||||
<string name="overlay_position_center_top">ناوەڕاستی سەرەوە</string>
|
||||
<string name="overlay_position_center_bottom">ناوەڕاستی خوارەوە</string>
|
||||
<string name="overlay_background">پاشبنەمای ئاوێرە</string>
|
||||
<string name="overlay_background_description">پاشبنەمای ئاوێرە بۆ خوێندنەوەی ئاسانتر</string>
|
||||
<string name="perf_overlay_background">پاشبنەمای ئاوێرە</string>
|
||||
<string name="perf_overlay_background_description">پاشبنەمای ئاوێرە بۆ خوێندنەوەی ئاسانتر</string>
|
||||
<string name="show_shaders_building">پیشاندانی دروستکردنی شادەرەکان</string>
|
||||
<string name="show_shaders_building_description">ژمارەی ئێستای شادەرەکانی کە دروست دەکرێن پیشان بدە</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">نیشاندانی زانیاری ئامێر</string>
|
||||
<string name="enable_soc_overlay">چالاکردنی ئامێر</string>
|
||||
<string name="soc_overlay_options">ئامێر</string>
|
||||
<string name="soc_overlay_options_description">ڕێکخستنی زانیارییەکانی نیشاندراو لە ئامێرەکە</string>
|
||||
|
||||
<string name="show_device_model">نیشاندانی مۆدێلی ئامێر</string>
|
||||
<string name="show_device_model_description">نیشاندانی مۆدێلی ئامێری میواندار</string>
|
||||
<string name="show_gpu_model">نیشاندانی مۆدێلی GPU</string>
|
||||
<string name="show_gpu_model_description">نیشاندانی مۆدێلی GPUی میواندار</string>
|
||||
<string name="show_soc_model">نیشاندانی مۆدێلی SoC</string>
|
||||
<string name="show_soc_model_description">نیشاندانی مۆدێلی SoCی میواندار</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">پاشکۆکانی GPU</string>
|
||||
<string name="veil_renderer">رێندرەر</string>
|
||||
<string name="veil_misc">جۆراوجۆر</string>
|
||||
<string name="eden_veil">حجاب عدن</string>
|
||||
<string name="eden_veil_description">ما بعد الافتراضي</string>
|
||||
<string name="eden_veil_description">ڕێکخستنە تاقیکارییەکان بۆ باشترکردنی کارایی و توانا. ئەم ڕێکخستنانە لەوانەیە ببێتە هۆی شاشە ڕەشەکان یان کێشەیتری یاری.</string>
|
||||
<string name="eden_veil_warning_title">ڕێکخستنە تاقیکارییەکان</string>
|
||||
<string name="eden_veil_warning_description">ڕێکخستنەکانی ناو ئیدین ڤێڵ زۆر تاقیکارین و لەوانەیە کێشە دروست بکەن. ئەگەر یاریەکەت نەگەشتە ناوەوە، هەموو زیادکراوەکان ناچالاک بکە و گۆڕینی دۆخی داینامیکی درێژکراو بۆ 0.</string>
|
||||
<string name="frame_skipping">قيد التطوير: تخطي الإطارات</string>
|
||||
<string name="frame_skipping_description">تێپەڕاندنی فرەیمەکان بکە بۆ باشترکردنی کارایی بە کەمکردنەوەی ژمارەی فرەیمە ڕێندرکراوەکان. ئەم تایبەتمەندییە هێشتا کاردەکرێت و لە وەشانە داهاتووەکاندا چالاکدەکرێت.</string>
|
||||
<string name="frame_interpolation">تحسين توقيت الإطارات</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">تمكين ذاكرة التخزين المؤقت LRU</string>
|
||||
<string name="use_lru_cache_description">چالاک یان ناچالاککردنی کاشەی LRU (کەمترین بەکارهێنراوی دوایی)، کارایی زیاد دەکات بە هەڵگرتنی بەکارهێنانی CPU. هەندێک یاری کێشەییان هەیە لەگەڵیدا، بەتایبەتی TotK 1.2.1، بۆیە ئەگەر یاریەکە نەکەوتەوە یان بە هەڕەمەکی داخرا، ناچالاکی بکە.</string>
|
||||
<string name="dyna_state">الحالة الديناميكية الممتدة</string>
|
||||
<string name="dyna_state_description">يُمكّن ميزات فولكان لتحسين الأداء، التقديم، وتوفير الموارد أثناء إنشاء خطوط المعالجة مع الحفاظ على استهلاك أقل لوحدة المعالجة المركزية/وحدة معالجة الرسومات. قد تزيد هذه الامتدادات من درجة حرارة الجهاز، وقد لا تتفاعل وحدات معالجة الرسومات القديمة من سلسلة A6XX بشكل صحيح. اضبط على 0 لاستخدام تنسيقات Yuzu المحاكاة.</string>
|
||||
<string name="dyna_state_description">کاریگەرییەکانی ڤولکان چالاک دەکات بۆ باشترکردنی کارایی، رێندرکردن، و هەڵگرتنی سەرچاوەکان لە دروستکردنی پایپلاین بە بەکارهێنانی کەمی CPU/GPU. ئەم فراوانکراوانە لەوانەیە پلەی گەرمی ئامێر زیاد بکەن، و کارتە گرافیکییە کۆنەکانی زنجیرەی A6XX لەوانەیە بە شێوەیەکی گونجاو کار نەکەن. بۆ بەکارهێنانی شێوازە کۆنەکانی دروستکراو، بڕەکە بۆ ٠ دابنێ.</string>
|
||||
<string name="use_sync_core">مزامنة سرعة النواة</string>
|
||||
<string name="use_sync_core_description">خێرایی تیکەکانی ناوک ڕێکبخە لەگەڵ ڕێژەی خێرایی بەرزترین بۆ باشترکردنی کارایی بەبێ گۆڕینی خێرایی ڕاستەقینەی یارییەکە.</string>
|
||||
<string name="use_auto_stub">استخدام الستاب التلقائي</string>
|
||||
@@ -63,42 +86,60 @@
|
||||
<string name="descriptor_indexing_description">يحسن معالجة القوام والمخازن المؤقتة، بالإضافة إلى طبقة ترجمة ماكسويل. مدعوم من قبل بعض وحدات معالجة الرسومات التي تدعم فولكان 1.1 وجميع وحدات معالجة الرسومات التي تدعم فولكان 1.2+.</string>
|
||||
<string name="use_fast_gpu_time">بەکارهێنانی کاتی GPU خێرا</string>
|
||||
<string name="use_fast_gpu_time_description">زۆربەی یارییەکان بەرزی ڕەزولوشنی ڕەسەنی خۆیان دادەمەزرێنێت. ئەم هەڵبژاردە هەڵەیە و لەوانەیە کێشە دروست بکات.</string>
|
||||
<string name="fast_gpu_time">فاکتۆری خێراکردنی GPU</string>
|
||||
<string name="fast_gpu_time_description">128 بەکاربهێنە بۆ باشترین کارایی و 512 بۆ باشترین وردی گرافیک.</string>
|
||||
<string name="gpu_low">نزم (128)</string>
|
||||
<string name="gpu_medium">ناوەند (256)</string>
|
||||
<string name="gpu_high">بەرز (512)</string>
|
||||
<string name="use_fast_cpu_time">کاتی CPU خێرا</string>
|
||||
<string name="use_fast_cpu_time_description">CPUی شبیهسازیکراو بە زۆرکردنی کاتژمێر وادەکات بە خێرایی زیاتر کاربکات، ئەمەش هەندێک لە سنووردارکەرانی FPS کەم دەکاتەوە. ئەم هەڵبژاردە هەڵە و لەوانەیە کێشە دروست بکات، و لەوانەیە کەسی بە CPUی بێهێز کارایی کەمتر ببینێت.</string>
|
||||
<string name="fast_cpu_time">کاتژمێری CPU</string>
|
||||
<string name="fast_cpu_time_description">Boost (1700MHz) بەکاربهێنە بۆ کارکردن بە بەرزترین کاتژمێری نەیتیڤی سوویچ، یان Fast (2000MHz) بۆ کارکردن بە دوو هێندەی کاتژمێر.</string>
|
||||
<string name="memory_layout">ڕێکخستنی بیرگە</string>
|
||||
<string name="memory_layout_description">(تاقیکاری) گۆڕینی ڕێکخستنی بیرگەی شبیهسازیکراو. ئەم ڕێکخستنە کارایی زیاد ناکات، بەڵام لەوانەیە یارمەتی یارییەکان بدات کە بەرزی ڕێزۆلۆشن بەکاردهێنن بە هۆی مۆدەکان. لەسەر مۆبایلەکانی کە 8GB یان کەمتر RAMیان هەیە بەکارمەهێنە.</string>
|
||||
<string name="memory_4gb">4GB (پێشنیارکراو)</string>
|
||||
<string name="memory_6gb">6GB (نائاسایش)</string>
|
||||
<string name="memory_8gb">8GB (نائاسایش)</string>
|
||||
|
||||
<!-- ڕێگای دیکۆدکردنی ASTC -->
|
||||
<string name="clock_base">بنەڕەتی (1000MHz)</string>
|
||||
<string name="clock_boost">زۆرکردن (1700MHz)</string>
|
||||
<string name="clock_fast">خێرا (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">ڕێگای دیکۆدکردنی ASTC</string>
|
||||
<string name="accelerate_astc_description">هەڵبژێرە چۆن تێکستوورە پەستووکراوەکانی ASTC دەکرێنەوە بۆ ڕێندرکردن: CPU (هێواش، سەلامەت)، GPU (خێرا، پێشنیارکراو)، یان CPU Async (بێ ستەتەر، لەوانەیە کێشە دروست بکات)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPUی ناڕێک</string>
|
||||
|
||||
<!-- ڕێگای پێکهێنانەوەی ASTC -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">ڕێگای پێکهێنانەوەی ASTC</string>
|
||||
<string name="astc_recompression_description">هەڵبژێرە چۆن تێکستوورەکانی ASTC پەستوو دەکرێنەوە بۆ باشترکردنی گونجاندن و کارایی. چالاککردنی ئەم هەڵبژاردە VRAM هەڵدەگرێت بەڵام لەوانەیە کەمکردنەوەی کوالێتی تێکستوور بکات.</string>
|
||||
<string name="astc_recompression_uncompressed">پێکهێنەنەوە</string>
|
||||
<string name="astc_recompression_bc1">BC1 (کوالیتی نزم)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (کوالیتی مامناوەند)</string>
|
||||
|
||||
<!-- دۆخی بەکارهێنانی VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">دۆخی بەکارهێنانی VRAM</string>
|
||||
<string name="vram_usage_mode_description">کۆنتڕۆڵی بەکارهێنانی VRAM</string>
|
||||
<string name="vram_usage_conservative">پارێزەر</string>
|
||||
<string name="vram_usage_aggressive">توند</string>
|
||||
|
||||
<!-- شادەر باکند -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">شادەر باکند</string>
|
||||
<string name="shader_backend_description">هەڵبژاردنی ڕێگای پێکهێنانی شادەر</string>
|
||||
<string name="shader_backend_glsl">گشتی</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- ئیمولەیشنی NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">ئیمولەیشنی NVDEC</string>
|
||||
<string name="nvdec_emulation_description">هەڵبژاردنی ڕێگای دیکۆدکردنی ڤیدیۆ</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
<string name="nvdec_emulation_gpu">GPU</string>
|
||||
<string name="nvdec_emulation_none">هیچ</string>
|
||||
|
||||
<!-- باشترکردنی دەرچوونی SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">باشترکردنی دەرچوونی SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">شێیدەرە کۆمپایلکراوەکان باش دەکات بۆ باشترکردنی کارایی GPU.</string>
|
||||
<string name="never">هەرگیز</string>
|
||||
@@ -106,75 +147,99 @@
|
||||
<string name="always">هەمیشە</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">فرە یاریکەر</string>
|
||||
<string name="multiplayer_description">خۆڕێکخستنی ژوور یان بەشداریکردن لە ژوورێک</string>
|
||||
<string name="multiplayer">یاری فرە یاریکەر</string>
|
||||
<string name="multiplayer_description">ژووری یاری خۆت دروست بکە یان بچۆ ناو ژوورێکی تر بۆ یاریکردن لەگەڵ خەڵک</string>
|
||||
<string name="multiplayer_room_title">ژوور: %1$s</string>
|
||||
<string name="multiplayer_console_id">IDی کۆنسۆڵ: %1$s</string>
|
||||
<string name="multiplayer_console_id">ناسنامەی کۆنسۆڵ: %1$s</string>
|
||||
<string name="multiplayer_create_room">دروستکردن</string>
|
||||
<string name="multiplayer_join_room">بەشداریکردن</string>
|
||||
<string name="multiplayer_public_room">گەڕان بە ژوورە گشتییەکان</string>
|
||||
<string name="multiplayer_username">ناوی بەکارهێنەر</string>
|
||||
<string name="multiplayer_ip_address">ناونیشانی IP</string>
|
||||
<string name="multiplayer_ip_port">پۆرت</string>
|
||||
<string name="multiplayer_create_room_success">ژوور بە سەرکەوتوویی دروستکرا!</string>
|
||||
<string name="multiplayer_join_room_success">بە سەرکەوتوویی بەشداریکرا!</string>
|
||||
<string name="multiplayer_create_room_failed">دروستکردنی ژوور شکستی هێنا!</string>
|
||||
<string name="multiplayer_join_room_failed">بەشداریکردن شکستی هێنا!</string>
|
||||
<string name="multiplayer_input_invalid">ناونیشانی نادروست یان ناو زۆر کورتە!</string>
|
||||
<string name="multiplayer_create_room_success">ژوور بە سەرکەوتوویی دروستکرا</string>
|
||||
<string name="multiplayer_join_room_success">بە سەرکەوتوویی چوویتە ناو ژوورەوە</string>
|
||||
<string name="multiplayer_create_room_failed">دروستکردنی ژوور سەرنەکەوت</string>
|
||||
<string name="multiplayer_join_room_failed">نەتوانی بچیتە ناو ژوورەوە</string>
|
||||
<string name="multiplayer_name_invalid">ناو زۆر کورتە</string>
|
||||
<string name="multiplayer_address_invalid">ناونیشانی نادروست</string>
|
||||
<string name="multiplayer_port_invalid">پۆرتی نادروست!</string>
|
||||
<string name="multiplayer_exit_room">دەرچوون لە ژوور</string>
|
||||
<string name="multiplayer_network_error">هەڵەی تۆڕ</string>
|
||||
<string name="multiplayer_lost_connection">پێوەندی لەدەستچوو</string>
|
||||
<string name="multiplayer_name_collision">ناوی دووبارە</string>
|
||||
<string name="multiplayer_mac_collision">MACی دووبارە</string>
|
||||
<string name="multiplayer_console_id_collision">IDی کۆنسۆڵی دووبارە</string>
|
||||
<string name="multiplayer_lost_connection">پەیوەندی لەدەستچوو</string>
|
||||
<string name="multiplayer_name_collision">ناو دووبارەکراوەتەوە</string>
|
||||
<string name="multiplayer_mac_collision">ناونیشانی MAC دووبارەکراوەتەوە</string>
|
||||
<string name="multiplayer_console_id_collision">ناسنامەی کۆنسۆڵ دووبارەکراوەتەوە</string>
|
||||
<string name="multiplayer_wrong_version">وەشانی هەڵە</string>
|
||||
<string name="multiplayer_wrong_password">تێپەڕەوشەی هەڵە</string>
|
||||
<string name="multiplayer_could_not_connect">نەتوانرا پەیوەندی بکرێت</string>
|
||||
<string name="multiplayer_could_not_connect">نەتوانی پەیوەندی بکات</string>
|
||||
<string name="multiplayer_room_is_full">ژوور پڕە</string>
|
||||
<string name="multiplayer_host_banned">هاست ڕێگەپێدراو نییە</string>
|
||||
<string name="multiplayer_permission_denied">ڕێگەپێدراو نییە</string>
|
||||
<string name="multiplayer_no_such_user">بەکارهێنەر بوونی نییە</string>
|
||||
<string name="multiplayer_already_in_room">پێشتر لە ژوورە</string>
|
||||
<string name="multiplayer_create_room_error">هەڵەی دروستکردنی ژوور</string>
|
||||
<string name="multiplayer_host_kicked">هاست لابرا</string>
|
||||
<string name="multiplayer_unknown_error">هەڵەی نەزانراو</string>
|
||||
<string name="multiplayer_host_banned">خاوەن ژوور قەدەغەکراوە</string>
|
||||
<string name="multiplayer_permission_denied">ڕێگەپێنەدراوە</string>
|
||||
<string name="multiplayer_no_such_user">ئەم بەکارهێنەرە بوونی نییە</string>
|
||||
<string name="multiplayer_already_in_room">خۆت لە ژوور دەیت</string>
|
||||
<string name="multiplayer_create_room_error">هەڵە لە دروستکردنی ژوور</string>
|
||||
<string name="multiplayer_host_kicked">خاوەن ژوور دەرکرا</string>
|
||||
<string name="multiplayer_unknown_error">هەڵەی نەناسراو</string>
|
||||
<string name="multiplayer_room_uninitialized">ژوور ڕێکنەخراوە</string>
|
||||
<string name="multiplayer_room_idle">ژوور بێکارە</string>
|
||||
<string name="multiplayer_room_joining">لە پڕۆسەی بەشداریکردن</string>
|
||||
<string name="multiplayer_room_joined">بەشداریکرا</string>
|
||||
<string name="multiplayer_room_moderator">چاودێر</string>
|
||||
<string name="multiplayer_room_joining">چوونە ناو ژوور</string>
|
||||
<string name="multiplayer_room_joined">چوویتە ناو ژوورەوە</string>
|
||||
<string name="multiplayer_room_moderator">چاودێری ژوور</string>
|
||||
<string name="multiplayer_member_join">%1$s بەشداریکرد</string>
|
||||
<string name="multiplayer_member_leave">%1$s جێهێشت</string>
|
||||
<string name="multiplayer_member_kicked">%1$s لابرا</string>
|
||||
<string name="multiplayer_member_banned">%1$s ڕێگەپێدراو نییە</string>
|
||||
<string name="multiplayer_address_unbanned">ناونیشان ڕێگەپێدراوە</string>
|
||||
<string name="multiplayer_kick_member">لابردن</string>
|
||||
<string name="multiplayer_chat_input_hint">ناردنی نامە...</string>
|
||||
<string name="multiplayer_member_kicked">%1$s دەرکرا</string>
|
||||
<string name="multiplayer_member_banned">%1$s قەدەغەکرا</string>
|
||||
<string name="multiplayer_address_unbanned">ناونیشان لە قەدەغە دەرکرا</string>
|
||||
<string name="multiplayer_kick_member">دەرکردن</string>
|
||||
<string name="multiplayer_chat_input_hint">ناردنی نامە…</string>
|
||||
<string name="multiplayer_password">تێپەڕەوشە</string>
|
||||
<string name="original_button_text">بەشداریکردن</string>
|
||||
<string name="disabled_button_text">لە پڕۆسەی بەشداریکردن...</string>
|
||||
<string name="multiplayer_joining">چوونە ناو ژوور…</string>
|
||||
<string name="multiplayer_creating">دروستکردنی ژوور…</string>
|
||||
<string name="multiplayer_room_name">ناوی ژوور</string>
|
||||
<string name="multiplayer_room_name_invalid">ناوی ژوور دەبێت لەنێوان ٣ بۆ ٢٠ پیت بێت</string>
|
||||
<string name="multiplayer_max_players">زۆرترین یاریکەر (١٦)</string>
|
||||
<string name="multiplayer_room_name_invalid">ناوی ژوور دەبێت لە نێوان 3 بۆ 20 پیت بێت</string>
|
||||
<string name="multiplayer_max_players">زۆرترین یاریکەر (16)</string>
|
||||
<string name="multiplayer_max_players_value">زۆرترین یاریکەر: %d</string>
|
||||
<string name="multiplayer_chat">چات</string>
|
||||
<string name="multiplayer_chat">گفتوگۆ</string>
|
||||
<string name="multiplayer_more_options">هەڵبژاردنی زیاتر</string>
|
||||
<string name="multiplayer_ip_copied">ناونیشانی IP کۆپی کراوە</string>
|
||||
<string name="multiplayer_ip_copied">ناونیشانی IP کۆپی کراوە بۆ کلیپبۆرد</string>
|
||||
<string name="multiplayer_server_address">ناونیشانی سێرڤەر</string>
|
||||
<string name="chat">چات</string>
|
||||
<string name="type_message">نووسینی نامە...</string>
|
||||
<string name="chat">گفتوگۆ</string>
|
||||
<string name="type_message">نامە بنووسە…</string>
|
||||
<string name="send">ناردن</string>
|
||||
<string name="send_message">ناردنی نامە</string>
|
||||
<string name="send_message">ناردنی پەیام</string>
|
||||
<string name="multiplayer_moderation">چاودێری</string>
|
||||
<string name="multiplayer_moderation_title">لیستی ڕێگەپێدراوەکان</string>
|
||||
<string name="multiplayer_no_bans">هیچ بەکارهێنەرێک ڕێگەپێدراو نییە</string>
|
||||
<string name="multiplayer_unban_title">لابردنی ڕێگەپێدان</string>
|
||||
<string name="multiplayer_unban">لابردنی ڕێگەپێدان</string>
|
||||
<string name="multiplayer_unban_message">دڵنیای لە لابردنی ڕێگەپێدانی %1$s?</string>
|
||||
<string name="multiplayer_ban">ڕێگەپێدان</string>
|
||||
<string name="emulation_multiplayer">فرە یاریکەر</string>
|
||||
<string name="multiplayer_moderation_title">لیستی قەدەغەکراوەکان</string>
|
||||
<string name="multiplayer_no_bans">هیچ بەکارهێنەرێک قەدەغە نەکراوە</string>
|
||||
<string name="multiplayer_unban_title">لادانی قەدەغە لە بەکارهێنەر</string>
|
||||
<string name="multiplayer_unban">لادانی قەدەغە</string>
|
||||
<string name="multiplayer_unban_message">دڵنیایت دەتەوێ قەدەغە لە %1$s لابەری؟</string>
|
||||
<string name="multiplayer_ban">قەدەغەکردنی بەکارهێنەر</string>
|
||||
<string name="multiplayer_room_browser">ژوورە گشتییەکان</string>
|
||||
<string name="multiplayer_no_rooms_found">هیچ ژوورێکی گشتی نەدۆزرایەوە</string>
|
||||
<string name="multiplayer_password_required">تێپەڕەوشە پێویستە</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">یاری</string>
|
||||
<string name="multiplayer_no_game_info">هیچ یارییەک</string>
|
||||
<string name="multiplayer_password_protected">ژوور بە تێپەڕەوشە پارێزراوە</string>
|
||||
<string name="multiplayer_hide_full_rooms">شاردنەوەی ژوورە پڕەکان</string>
|
||||
<string name="multiplayer_hide_empty_rooms">شاردنەوەی ژوورە بەتاڵەکان</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">بیپەڕێنەوە بۆ پشکنینی دووبارە</string>
|
||||
<string name="multiplayer_search_public_lobbies">گەڕان بە ژوورەکان…</string>
|
||||
<string name="emulation_multiplayer">یاری فرە یاریکەر</string>
|
||||
<string name="multiplayer_game_name">یارییە پەسەندکراوەکان</string>
|
||||
<string name="multiplayer_preferred_game_name">یاریی پەسەندکراو</string>
|
||||
<string name="multiplayer_no_game">هیچ یارییەک نەدۆزرایەوە</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">پێویستە یارییەکی پەسەندکراو هەڵبژێریت بۆ میوانداریکردنی ژوور.</string>
|
||||
<string name="multiplayer_room_name_error">دەبێت لە نێوان 3 بۆ 20 پیت بێت</string>
|
||||
<string name="multiplayer_required">پێویستە</string>
|
||||
<string name="multiplayer_ip_error">فۆرماتی IP نادروستە</string>
|
||||
<string name="multiplayer_username_error">دەبێت لانیکەم 5 پیت بێت</string>
|
||||
<string name="multiplayer_port_error">دەبێت لە نێوان 1 بۆ 65535 بێت</string>
|
||||
<string name="cancel">پاشگەزبوونەوە</string>
|
||||
<string name="ok">باشە</string>
|
||||
<string name="refresh">نوێکردنەوە</string>
|
||||
<string name="room_list">لیستی ژوورەکان</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">ڕەنگی پۆل</string>
|
||||
@@ -283,6 +348,26 @@
|
||||
<string name="install_game_content">دامەزراندنی ناوەڕۆکی یاری</string>
|
||||
<string name="install_game_content_description">دامەزراندنی نوێکاری یارییەکان یان DLC</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">ئەپەکان لە شاشەی سەرەکی سیستەم دەستپێبکە</string>
|
||||
<string name="applets">دەستپێکەری ئەپلێت</string>
|
||||
<string name="applets_description">ئەپلێتی سیستەم دەستپێبکە بە بەکارهێنانی پتەوواڵای دامەزراو</string>
|
||||
<string name="applets_error_firmware">پتەوواڵا دامەزراو نییە</string>
|
||||
<string name="applets_error_applet">ئەپلێت بەردەست نییە</string>
|
||||
<string name="applets_error_description"><![CDATA[تکایە دڵنیابە لە بوونی فایلی <a href="https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys">prod.keys</a> و <a href="https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware">پتەوواڵا</a> و دووبارە هەوڵبدەرەوە.]]></string>
|
||||
<string name="album_applet">ئەلبوم</string>
|
||||
<string name="album_applet_description">وێنەکان لە فۆڵدەری وێنەی بەکارهێنەر ببینە</string>
|
||||
<string name="mii_edit_applet">دەستکاریی Mii</string>
|
||||
<string name="mii_edit_applet_description">Miiەکان بینە و دەستکاری بکە</string>
|
||||
<string name="cabinet_applet">کابینەت</string>
|
||||
<string name="cabinet_applet_description">داتای سەر amiibo دەستکاری یان بسڕەوە</string>
|
||||
<string name="cabinet_launcher">دەستپێکەری کابینەت</string>
|
||||
<string name="cabinet_nickname_and_owner">ڕێکخستنی نازناو و خاوەن</string>
|
||||
<string name="cabinet_game_data_eraser">سڕینەوەی داتای یاری</string>
|
||||
<string name="cabinet_restorer">پاشکەوتکەر</string>
|
||||
<string name="cabinet_formatter">ڕێکخەر</string>
|
||||
|
||||
<!-- About screen strings -->
|
||||
<string name="gaia_is_not_real">گایا ڕاستەقینە نییە</string>
|
||||
<string name="copied_to_clipboard">کۆپی کرا بۆ تەختەی نووسین</string>
|
||||
@@ -292,23 +377,15 @@
|
||||
<string name="licenses_description">ئەو پڕۆژانەی کە یوزوی بۆ ئەندرۆید ڕەخساند</string>
|
||||
<string name="build">بونیات</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">بەزوویی دەسپێگەشتن</string>
|
||||
<string name="early_access_benefits">سوودەکانی بەزوویی دەسپێگەشتن</string>
|
||||
<string name="cutting_edge_features">تایبەتمەندییە پێشکەوتووەکان</string>
|
||||
<string name="early_access_updates">زوو دەستگەیشتن بە نوێکارییەکان</string>
|
||||
<string name="no_manual_installation">چیتر دامەزراندنی دەستی نییە</string>
|
||||
<string name="prioritized_support">پشتگیری لە پێشینە</string>
|
||||
<string name="helping_game_preservation">یارمەتیدانی پاراستنی یارییەکان</string>
|
||||
<string name="our_eternal_gratitude">سوپاس و پێزانینی هەمیشەییمان</string>
|
||||
<string name="are_you_interested">ئایا تۆ خوازیاریت؟</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">سنووردارکردنی خێرایی</string>
|
||||
<string name="frame_limit_enable_description">خێرایی ئیمولەیشن سنووردار دەکات بۆ ڕێژەیەکی دیاریکراو لە خێرایی ئاسایی.</string>
|
||||
<string name="frame_limit_slider">سنووردارکردنی لەسەدای خێرایی</string>
|
||||
<string name="frame_limit_slider_description">ڕێژەی سەدی دیاری دەکات بۆ سنووردارکردنی خێرایی ئیمولەیشن. 100% خێرایی ئاساییە. بەهایی بەرزتر یان نزمتر دەبێتە هۆی زیاد یان کەمکردنەوەی سنووری خێرایی.</string>
|
||||
<string name="cpu_accuracy">وردی CPU</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">ناوی ئامێر</string>
|
||||
<string name="use_docked_mode">دۆخی دۆککراو</string>
|
||||
<string name="use_docked_mode_description">ڕوونی زیاد دەکات، کارایی کەم دەکاتەوە. دۆخی دەستی بەکاردێت کاتێک لەکاردەخرێت، ئەمەش ڕوونی دادەبەزێنێت و کارایی زیاد دەکات.</string>
|
||||
<string name="emulated_region">ناوچەی ئیمولەیشن</string>
|
||||
@@ -319,6 +396,11 @@
|
||||
<string name="use_custom_rtc_description">ڕێگەت پێدەدات کاتژمێرێکی کاتی ڕاستەقینەی تایبەتمەند دابنێیت کە جیاوازە لە کاتی ئێستای سیستەمەکەت.</string>
|
||||
<string name="set_custom_rtc">دانانی RTCی تایبەتمەند</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">نیشانەی وێب</string>
|
||||
<string name="web_token_description">نیشانەی وێب بۆ دروستکردنی ژوورە گشتییەکان. زنجیرەیەکی 48 پیتییە تەنها پیتی a-z بچووک لەخۆدەگرێت.</string>
|
||||
<string name="network">تۆڕ</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">ئاستی وردبینی</string>
|
||||
<string name="renderer_resolution">ڕوونی (دۆخی دەستی/دۆخی دۆک)</string>
|
||||
@@ -334,14 +416,28 @@
|
||||
<string name="renderer_reactive_flushing_description">وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی.</string>
|
||||
<string name="use_disk_shader_cache">بیرگەخێرای سێبەری دیسک</string>
|
||||
<string name="use_disk_shader_cache_description">پچڕپچڕی کەمدەکاتەوە بە هەڵگرتن و بارکردنی سێبەری دروستکراو لە ناوخۆدا.</string>
|
||||
|
||||
<!-- Debug settings strings -->
|
||||
<string name="cpu">CPU</string>
|
||||
<string name="renderer_api">API گرافیک</string>
|
||||
<string name="cpu_debug_mode">چاککردنەوەی CPU</string>
|
||||
<string name="cpu_debug_mode_description">CPU لە دۆخی چاککردنەوەی هێواش دادەنێت.</string>
|
||||
<string name="gpu">GPU</string>
|
||||
<string name="renderer_api">API</string>
|
||||
<string name="renderer_debug">چاککردنەوەی گرافیک</string>
|
||||
<string name="renderer_debug_description">API ی گرافیکەکان ڕێکدەخات بۆ دۆخی چاککردنی خاو.</string>
|
||||
<string name="audio_volume">قەبارەی دەنگی</string>
|
||||
<string name="audio_volume_description">دیاریکردنی قەبارەی دەنگی دەرچووی بیستۆک و بزوێنەری دەنگی دەرەکی.</string>
|
||||
<string name="renderer_debug_description">API ی گرافیکەکان لە دۆخی چاککردنەوەی هێواش دادەنێت.</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">تۆمارکردن</string>
|
||||
<string name="flush_by_line">خاوکردنەوەی تۆمارەکانی دیباگ بە هێڵ</string>
|
||||
<string name="flush_by_line_description">تۆمارەکانی دیباگ لە هەر هێڵێکدا دەنوسرێت خاو دەکاتەوە، ئەمە وا دەکات دیباگکردن ئاسانتر بێت لە کاتی کرشکردن یان پێکەنین.</string>
|
||||
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">بزوێنری دەرچوونی دەنگ</string>
|
||||
<string name="audio_volume">دەنگ</string>
|
||||
<string name="audio_volume_description">قەبارەی دەنگی دەرچوون دیاری دەکات.</string>
|
||||
|
||||
<!-- Input strings -->
|
||||
<string name="button_a">A</string>
|
||||
<string name="button_b">B</string>
|
||||
<string name="button_x">X</string>
|
||||
@@ -413,6 +509,33 @@
|
||||
<string name="system_gpu_driver">وەگەڕخەری GPU ی سیستەم</string>
|
||||
<string name="installing_driver">دامەزراندنی وەگەڕخەر...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">هێنەری درایڤەری GPU</string>
|
||||
<string name="fetch">هێنان</string>
|
||||
<string name="fetch_error">هەڵە لە کاتی هێنان</string>
|
||||
<string name="check_connection">پەیوەندییەکەت پشکنە و دووبارە هەوڵبدە.</string>
|
||||
<string name="show_releases">پیشاندانی وەشانەکان</string>
|
||||
<string name="view_full_release_notes">تێبینییەکانی وەشان</string>
|
||||
<string name="failed_to_fetch">هێنان شکستی هێنا</string>
|
||||
<string name="error_during_fetch">هەڵە لە کاتی هێنان</string>
|
||||
<string name="toggle_release_notes">گۆڕینی تێبینییەکانی وەشان</string>
|
||||
<string name="downloads">داگرتنەکان</string>
|
||||
<string name="show_downloads">پیشاندانی داگرتنەکان</string>
|
||||
<string name="hide_downloads">شاردنەوەی داگرتنەکان</string>
|
||||
<string name="failed_cache_dir">دایری کاش بەردەست نییە</string>
|
||||
<string name="empty_response_body">ناوەڕۆکی وەڵام بەتاڵە</string>
|
||||
<string name="successfully_installed">%1$s بە سەرکەوتوویی دامەزرا</string>
|
||||
<string name="driver_failed_title">دامەزراندنی درایڤەر شکستی هێنا</string>
|
||||
<string name="failed_install_driver">دامەزراندنی درایڤەری %1$s شکستی هێنا، سیستەمەکەت پشتگیری دەکات؟</string>
|
||||
<string name="driver_empty">درایڤەری داگرتوو بەتاڵە، پەیوەندییەکەت بە ئینتەرنێت پشکنە</string>
|
||||
<string name="downloading">لە داگرتندایە...</string>
|
||||
<string name="installing">لە دامەزراندن...</string>
|
||||
<string name="latest">نوێترین</string>
|
||||
<string name="recommended_driver">درایڤەری پێشنیارکراو:</string>
|
||||
<string name="gpu_model">مۆدێلی GPU:</string>
|
||||
<string name="unsupported_gpu">GPU پشتگیری نەکراوە</string>
|
||||
<string name="unsupported_gpu_warning">GPUی تۆ پشتگیری لە درایڤەری تایبەت ناکات. پێشنیار ناکرێت درایڤەری تایبەت دابنێیت.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">ڕێکخستنەکان</string>
|
||||
<string name="preferences_general">گشتی</string>
|
||||
@@ -426,7 +549,7 @@
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">ڕۆمەکەت کۆدکراوە</string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[تکایە دڵنیابەوە لەدامەزراوی <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[تکایە دڵنیابەوە لەدامەزراوی <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]></string>
|
||||
<string name="loader_error_video_core">هەڵەیەک لە دەستپێکردنی ناوەکی ڤیدیۆکەدا ڕوویدا</string>
|
||||
<string name="loader_error_video_core_description">ئەمەش بەزۆری بەهۆی وەگەڕخەرێکی ناتەبای GPU ەوەیە. دامەزراندنی وەگەڕخەری GPU ی تایبەتمەندکراو لەوانەیە ئەم کێشەیە چارەسەر بکات.</string>
|
||||
<string name="loader_error_invalid_format">ناتوانرێت ڕۆم باربکرێت</string>
|
||||
@@ -560,6 +683,29 @@
|
||||
<string name="use_black_backgrounds">پاشبنەمای ڕەش</string>
|
||||
<string name="use_black_backgrounds_description">لە کاتی بەکارهێنانی ڕووکاری تاریکدا، پاشبنەمای ڕەش دادەنێ.</string>
|
||||
|
||||
<!-- Picture-In-Picture -->
|
||||
<string name="picture_in_picture">وێنە لە ناو وێنە</string>
|
||||
<string name="picture_in_picture_description">پەنجەرە بچووک دەکاتەوە کاتێک لە پاشبنەیە.</string>
|
||||
<string name="pause">وەستان</string>
|
||||
<string name="play">یاریکردن</string>
|
||||
<string name="mute">بێدەنگ</string>
|
||||
<string name="unmute">لادانی بێدەنگی</string>
|
||||
|
||||
<!-- Emulation vertical alignment -->
|
||||
<string name="vertical_alignment">ڕێکخستنی ستوونی</string>
|
||||
<string name="top">سەرەوە</string>
|
||||
<string name="center">ناوەند</string>
|
||||
<string name="bottom">خوارەوە</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">ئەپلێتەکان</string>
|
||||
<string name="applets_menu_description">(کار دەکرێت) گۆڕینی فرۆنتێندەکانی ئەپلێت و ڕێکخستنەکان</string>
|
||||
|
||||
<string name="applet_hle">فرۆنتێندی خوازراو</string>
|
||||
<string name="applet_lle">ئەپلێتی ڕاستەقینە</string>
|
||||
|
||||
<string name="swkbd_applet">کلیلەبۆردی نەرمەکاڵا</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">مۆڵەتەکان</string>
|
||||
<string name="license_fidelityfx_fsr_description">بەرزکردنەوەی کوالێتی بەرز لە کۆمپانیای AMD</string>
|
||||
|
@@ -7,6 +7,9 @@
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(Vylepšený)</string>
|
||||
<string name="process_ram">RAM procesu: %1$d MB</string>
|
||||
<string name="shaders_prefix">Sestavování</string>
|
||||
<string name="shaders_suffix">shaderů</string>
|
||||
<string name="system_info_label">Systém:</string>
|
||||
<string name="show_stats_overlay">Zobrazit překryv statistik výkonu</string>
|
||||
<string name="stats_overlay_customization">Přizpůsobení</string>
|
||||
@@ -34,12 +37,32 @@
|
||||
<string name="overlay_position_bottom_right">Vpravo dole</string>
|
||||
<string name="overlay_position_center_top">Nahoře uprostřed</string>
|
||||
<string name="overlay_position_center_bottom">Dole uprostřed</string>
|
||||
<string name="overlay_background">Pozadí překryvu</string>
|
||||
<string name="overlay_background_description">Přidá pozadí pro lepší čitelnost</string>
|
||||
<string name="perf_overlay_background">Pozadí překryvu</string>
|
||||
<string name="perf_overlay_background_description">Přidá pozadí pro lepší čitelnost</string>
|
||||
<string name="show_shaders_building">Zobrazit vytváření shaderů</string>
|
||||
<string name="show_shaders_building_description">Zobrazuje aktuální počet vytvářených shaderů</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Zobrazit překryv informací o zařízení</string>
|
||||
<string name="enable_soc_overlay">Povolit překryv zařízení</string>
|
||||
<string name="soc_overlay_options">Překryv zařízení</string>
|
||||
<string name="soc_overlay_options_description">Konfigurovat, jaké informace se zobrazí v překryvu zařízení</string>
|
||||
|
||||
<string name="show_device_model">Zobrazit model zařízení</string>
|
||||
<string name="show_device_model_description">Zobrazit model hostitelského zařízení</string>
|
||||
<string name="show_gpu_model">Zobrazit model GPU</string>
|
||||
<string name="show_gpu_model_description">Zobrazit model hostitelské GPU</string>
|
||||
<string name="show_soc_model">Zobrazit model SoC</string>
|
||||
<string name="show_soc_model_description">Zobrazit model hostitelského SoC</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">Rozšíření GPU</string>
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="veil_misc">Různé</string>
|
||||
<string name="eden_veil">Edenův závoj</string>
|
||||
<string name="eden_veil_description">Mimo výchozí</string>
|
||||
<string name="eden_veil_description">Experimentální nastavení pro zlepšení výkonu a schopností. Tato nastavení mohou způsobit černé obrazovky nebo další herní problémy.</string>
|
||||
<string name="eden_veil_warning_title">Experimentální nastavení</string>
|
||||
<string name="eden_veil_warning_description">Nastavení v Eden\'s Veil jsou vysoce experimentální a mohou způsobit problémy. Pokud se vaše hra nespustí, deaktivujte všechna rozšíření a nastavte Extended Dynamic State na 0.</string>
|
||||
<string name="frame_skipping">WIP: Přeskočení snímků</string>
|
||||
<string name="frame_skipping_description">Přepínání přeskočení snímků pro zlepšení výkonu snížením počtu vykreslených snímků. Tato funkce je stále ve vývoji a bude povolena v budoucích verzích.</string>
|
||||
<string name="frame_interpolation">Vylepšené časování snímků</string>
|
||||
@@ -47,7 +70,7 @@
|
||||
<string name="use_lru_cache">Povolit LRU mezipaměť</string>
|
||||
<string name="use_lru_cache_description">Povolte nebo zakažte mezipaměť LRU (Least Recently Used), což zvýší výkon snížením zatížení CPU. Některé hry s ní mají problémy, zejména TotK 1.2.1, proto ji deaktivujte, pokud hra nespustí nebo náhodně padá.</string>
|
||||
<string name="dyna_state">Rozšířený dynamický stav</string>
|
||||
<string name="dyna_state_description">Umožňuje funkce Vulkan pro lepší výkon, vykreslování a úsporu zdrojů při vytváření grafických pipeline při zachování nižšího využití CPU/GPU. Tato rozšíření mohou zvýšit teplotu zařízení a starší GPU řady A6XX nemusí reagovat správně. Nastavte na 0 pro použití emulovaných formátů Yuzu.</string>
|
||||
<string name="dyna_state_description">Umožňuje funkce Vulkan pro lepší výkon, vykreslování a úsporu prostředků při vytváření pipeline při zachování nízkého využití CPU/GPU. Tato rozšíření mohou zvýšit teplotu zařízení a starší GPU řady A6XX nemusí fungovat správně. Nastavte na 0 pro použití zastaralých emulovaných formátů.</string>
|
||||
<string name="use_sync_core">Synchronizovat rychlost jádra</string>
|
||||
<string name="use_sync_core_description">Synchronizuje rychlost jádra s maximálním procentem rychlosti, aby se zlepšil výkon bez změny skutečné rychlosti hry.</string>
|
||||
<string name="use_auto_stub">Použít automatický stub</string>
|
||||
@@ -62,35 +85,53 @@
|
||||
<string name="descriptor_indexing_description">Zlepšuje zpracování textur a bufferů, stejně jako Maxwell překladovou vrstvu. Podporováno některými GPU s Vulkan 1.1 a všemi GPU s Vulkan 1.2+.</string>
|
||||
<string name="use_fast_gpu_time">Použít rychlý čas GPU</string>
|
||||
<string name="use_fast_gpu_time_description">Nutí většinu her běžet v jejich nativním rozlišení. Tato volba je nestabilní a může způsobovat problémy.</string>
|
||||
<string name="fast_gpu_time">Faktor přetaktování GPU</string>
|
||||
<string name="fast_gpu_time_description">Použijte 128 pro maximální výkon a 512 pro maximální věrnost grafiky.</string>
|
||||
<string name="gpu_low">Nízké (128)</string>
|
||||
<string name="gpu_medium">Střední (256)</string>
|
||||
<string name="gpu_high">Vysoké (512)</string>
|
||||
<string name="use_fast_cpu_time">Rychlý čas CPU</string>
|
||||
<string name="use_fast_cpu_time_description">Nutí emulované CPU běžet na vyšší frekvenci, čímž snižuje některé limity FPS. Tato volba je nestabilní a může způsobit problémy a slabší CPU mohou mít snížený výkon.</string>
|
||||
<string name="fast_cpu_time">Taktování CPU</string>
|
||||
<string name="fast_cpu_time_description">Použijte Boost (1700MHz) pro běh na nejvyšším nativním taktu Switch nebo Fast (2000MHz) pro běh na dvojnásobném taktu.</string>
|
||||
<string name="memory_layout">Rozložení paměti</string>
|
||||
<string name="memory_layout_description">(EXPERIMENTÁLNÍ) Změna emulovaného rozložení paměti. Toto nastavení nezvyšuje výkon, ale může pomoci hrám využívajícím vysoké rozlišení pomocí modů. Nepoužívejte na telefonech s 8GB RAM nebo méně.</string>
|
||||
<string name="memory_4gb">4GB (Doporučeno)</string>
|
||||
<string name="memory_6gb">6GB (Nebezpečné)</string>
|
||||
<string name="memory_8gb">8GB (Nebezpečné)</string>
|
||||
|
||||
<!-- Metoda dekódování ASTC -->
|
||||
<string name="clock_base">Základní (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">Rychlé (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">Metoda dekódování ASTC</string>
|
||||
<string name="accelerate_astc_description">Vyberte způsob dekódování textur komprimovaných pomocí ASTC pro vykreslování: CPU (pomalé, bezpečné), GPU (rychlé, doporučené) nebo CPU Async (žádné zasekávání, ale mohou nastat problémy)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPU asynchronně</string>
|
||||
|
||||
<!-- Metoda rekomprese ASTC -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">Metoda rekomprese ASTC</string>
|
||||
<string name="astc_recompression_description">Vyberte způsob rekomprese textur ASTC pro zlepšení kompatibility a výkonu. Zapnutí této volby ušetří VRAM, ale může snížit kvalitu textur.</string>
|
||||
<string name="astc_recompression_description">Vyberte způsob rekomprese textur ASTC pro zlepšení kompatibility a výkonu. Zapnutí této volby ušetří VRAM, ale může snížit kvalitu textur.</string>
|
||||
<string name="astc_recompression_uncompressed">Nekomprimované</string>
|
||||
<string name="astc_recompression_bc1">BC1 (nízká kvalita)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (střední kvalita)</string>
|
||||
|
||||
<!-- Režim využití VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">Režim využití VRAM</string>
|
||||
<string name="vram_usage_mode_description">Správa alokace GPU paměti</string>
|
||||
<string name="vram_usage_conservative">Konzervativní</string>
|
||||
<string name="vram_usage_aggressive">Agresivní</string>
|
||||
|
||||
<!-- Backend shaderů -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">Backend shaderů</string>
|
||||
<string name="shader_backend_description">Způsob kompilace shaderů</string>
|
||||
<string name="shader_backend_glsl">Univerzální</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- Emulace NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">Emulace NVDEC</string>
|
||||
<string name="nvdec_emulation_description">Zpracování dekódování videa</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
@@ -105,75 +146,99 @@
|
||||
<string name="always">Vždy</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">Multiplayer</string>
|
||||
<string name="multiplayer_description">Hostování nebo připojení k herní místnosti</string>
|
||||
<string name="multiplayer">Více hráčů</string>
|
||||
<string name="multiplayer_description">Vytvořte si vlastní herní místnost nebo se připojte k existující a hrajte s ostatními</string>
|
||||
<string name="multiplayer_room_title">Místnost: %1$s</string>
|
||||
<string name="multiplayer_console_id">ID konzole: %1$s</string>
|
||||
<string name="multiplayer_create_room">Vytvořit</string>
|
||||
<string name="multiplayer_join_room">Připojit</string>
|
||||
<string name="multiplayer_join_room">Připojit se</string>
|
||||
<string name="multiplayer_public_room">Procházet veřejné místnosti</string>
|
||||
<string name="multiplayer_username">Uživatelské jméno</string>
|
||||
<string name="multiplayer_ip_address">IP adresa</string>
|
||||
<string name="multiplayer_ip_port">Port</string>
|
||||
<string name="multiplayer_create_room_success">Místnost vytvořena</string>
|
||||
<string name="multiplayer_join_room_success">Úspěšné připojení</string>
|
||||
<string name="multiplayer_create_room_failed">Chyba při vytváření</string>
|
||||
<string name="multiplayer_join_room_failed">Chyba při připojování</string>
|
||||
<string name="multiplayer_input_invalid">Neplatná adresa nebo jméno</string>
|
||||
<string name="multiplayer_port_invalid">Neplatný port</string>
|
||||
<string name="multiplayer_create_room_success">Místnost úspěšně vytvořena</string>
|
||||
<string name="multiplayer_join_room_success">Úspěšně připojeno k místnosti</string>
|
||||
<string name="multiplayer_create_room_failed">Nepodařilo se vytvořit místnost</string>
|
||||
<string name="multiplayer_join_room_failed">Nepodařilo se připojit k místnosti</string>
|
||||
<string name="multiplayer_name_invalid">Jméno je příliš krátké</string>
|
||||
<string name="multiplayer_address_invalid">Neplatná adresa</string>
|
||||
<string name="multiplayer_port_invalid">Neplatný port!</string>
|
||||
<string name="multiplayer_exit_room">Opustit místnost</string>
|
||||
<string name="multiplayer_network_error">Chyba sítě</string>
|
||||
<string name="multiplayer_lost_connection">Ztraceno připojení</string>
|
||||
<string name="multiplayer_name_collision">Kolize jmen</string>
|
||||
<string name="multiplayer_mac_collision">Kolize MAC</string>
|
||||
<string name="multiplayer_mac_collision">Kolize MAC adresy</string>
|
||||
<string name="multiplayer_console_id_collision">Kolize ID konzole</string>
|
||||
<string name="multiplayer_wrong_version">Nesprávná verze</string>
|
||||
<string name="multiplayer_wrong_password">Nesprávné heslo</string>
|
||||
<string name="multiplayer_could_not_connect">Nelze připojit</string>
|
||||
<string name="multiplayer_could_not_connect">Nelze se připojit</string>
|
||||
<string name="multiplayer_room_is_full">Místnost je plná</string>
|
||||
<string name="multiplayer_host_banned">Host zabanován</string>
|
||||
<string name="multiplayer_host_banned">Hostitel zablokován</string>
|
||||
<string name="multiplayer_permission_denied">Přístup odepřen</string>
|
||||
<string name="multiplayer_no_such_user">Uživatel neexistuje</string>
|
||||
<string name="multiplayer_already_in_room">Již v místnosti</string>
|
||||
<string name="multiplayer_create_room_error">Chyba vytváření</string>
|
||||
<string name="multiplayer_host_kicked">Host vyhozen</string>
|
||||
<string name="multiplayer_create_room_error">Chyba při vytváření místnosti</string>
|
||||
<string name="multiplayer_host_kicked">Hostitel vyhozen</string>
|
||||
<string name="multiplayer_unknown_error">Neznámá chyba</string>
|
||||
<string name="multiplayer_room_uninitialized">Místnost neinicializována</string>
|
||||
<string name="multiplayer_room_uninitialized">Místnost není inicializována</string>
|
||||
<string name="multiplayer_room_idle">Místnost nečinná</string>
|
||||
<string name="multiplayer_room_joining">Připojování</string>
|
||||
<string name="multiplayer_room_joined">Připojeno</string>
|
||||
<string name="multiplayer_room_moderator">Moderátor</string>
|
||||
<string name="multiplayer_member_join">%1$s připojen</string>
|
||||
<string name="multiplayer_member_leave">%1$s opustil</string>
|
||||
<string name="multiplayer_room_joining">Připojování k místnosti</string>
|
||||
<string name="multiplayer_room_joined">Připojeno k místnosti</string>
|
||||
<string name="multiplayer_room_moderator">Moderátor místnosti</string>
|
||||
<string name="multiplayer_member_join">%1$s se připojil</string>
|
||||
<string name="multiplayer_member_leave">%1$s odešel</string>
|
||||
<string name="multiplayer_member_kicked">%1$s vyhozen</string>
|
||||
<string name="multiplayer_member_banned">%1$s zabanován</string>
|
||||
<string name="multiplayer_address_unbanned">Adresa odbanována</string>
|
||||
<string name="multiplayer_member_banned">%1$s zablokován</string>
|
||||
<string name="multiplayer_address_unbanned">Adresa odblokována</string>
|
||||
<string name="multiplayer_kick_member">Vyhodit</string>
|
||||
<string name="multiplayer_chat_input_hint">Zpráva…</string>
|
||||
<string name="multiplayer_chat_input_hint">Poslat zprávu…</string>
|
||||
<string name="multiplayer_password">Heslo</string>
|
||||
<string name="original_button_text">Připojit</string>
|
||||
<string name="disabled_button_text">Připojování…</string>
|
||||
<string name="multiplayer_joining">Připojování…</string>
|
||||
<string name="multiplayer_creating">Vytváření…</string>
|
||||
<string name="multiplayer_room_name">Název místnosti</string>
|
||||
<string name="multiplayer_room_name_invalid">Název musí mít 3-20 znaků</string>
|
||||
<string name="multiplayer_max_players">Max hráčů (16)</string>
|
||||
<string name="multiplayer_max_players_value">Max hráčů: %d</string>
|
||||
<string name="multiplayer_room_name_invalid">Název místnosti musí mít 3 až 20 znaků</string>
|
||||
<string name="multiplayer_max_players">Maximální počet hráčů (16)</string>
|
||||
<string name="multiplayer_max_players_value">Maximální počet hráčů: %d</string>
|
||||
<string name="multiplayer_chat">Chat</string>
|
||||
<string name="multiplayer_more_options">Více možností</string>
|
||||
<string name="multiplayer_ip_copied">IP zkopírována</string>
|
||||
<string name="multiplayer_more_options">Další možnosti</string>
|
||||
<string name="multiplayer_ip_copied">IP adresa zkopírována do schránky</string>
|
||||
<string name="multiplayer_server_address">Adresa serveru</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Zpráva…</string>
|
||||
<string name="type_message">Napište zprávu…</string>
|
||||
<string name="send">Odeslat</string>
|
||||
<string name="send_message">Odeslat zprávu</string>
|
||||
<string name="multiplayer_moderation">Moderace</string>
|
||||
<string name="multiplayer_moderation_title">Seznam banů</string>
|
||||
<string name="multiplayer_no_bans">Žádní zabanovaní uživatelé</string>
|
||||
<string name="multiplayer_unban_title">Odbanovat uživatele</string>
|
||||
<string name="multiplayer_unban">Odbanovat</string>
|
||||
<string name="multiplayer_unban_message">Odbanovat %1$s?</string>
|
||||
<string name="multiplayer_ban">Zabanovat uživatele</string>
|
||||
<string name="emulation_multiplayer">Multiplayer</string>
|
||||
<string name="multiplayer_moderation_title">Seznam zablokovaných</string>
|
||||
<string name="multiplayer_no_bans">Žádní zablokovaní uživatelé</string>
|
||||
<string name="multiplayer_unban_title">Odblokovat uživatele</string>
|
||||
<string name="multiplayer_unban">Odblokovat</string>
|
||||
<string name="multiplayer_unban_message">Opravdu chcete odblokovat %1$s?</string>
|
||||
<string name="multiplayer_ban">Zablokovat uživatele</string>
|
||||
<string name="multiplayer_room_browser">Veřejné místnosti</string>
|
||||
<string name="multiplayer_no_rooms_found">Nebyly nalezeny žádné veřejné místnosti</string>
|
||||
<string name="multiplayer_password_required">Vyžadováno heslo</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">Hra</string>
|
||||
<string name="multiplayer_no_game_info">Jakákoli hra</string>
|
||||
<string name="multiplayer_password_protected">Místnost chráněná heslem</string>
|
||||
<string name="multiplayer_hide_full_rooms">Skrýt plné místnosti</string>
|
||||
<string name="multiplayer_hide_empty_rooms">Skrýt prázdné místnosti</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">Klepnutím obnovte znovu</string>
|
||||
<string name="multiplayer_search_public_lobbies">Hledat místnosti…</string>
|
||||
<string name="emulation_multiplayer">Více hráčů</string>
|
||||
<string name="multiplayer_game_name">Preferované hry</string>
|
||||
<string name="multiplayer_preferred_game_name">Preferovaná hra</string>
|
||||
<string name="multiplayer_no_game">Nenalezeny žádné hry</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">Pro hostování místnosti musíte vybrat preferovanou hru.</string>
|
||||
<string name="multiplayer_room_name_error">Musí mít 3 až 20 znaků</string>
|
||||
<string name="multiplayer_required">Povinné</string>
|
||||
<string name="multiplayer_ip_error">Neplatný formát IP</string>
|
||||
<string name="multiplayer_username_error">Musí mít alespoň 5 znaků</string>
|
||||
<string name="multiplayer_port_error">Musí být mezi 1 a 65535</string>
|
||||
<string name="cancel">Zrušit</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="refresh">Obnovit</string>
|
||||
<string name="room_list">Seznam místností</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Barva motivu</string>
|
||||
@@ -267,8 +332,26 @@
|
||||
<string name="game_folders">Složky s hrami</string>
|
||||
<string name="folder_already_added">Tato složka byla již přidána!</string>
|
||||
<string name="game_folder_properties">Vlastnosti složky s hrami</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Spouštění aplikací z domovské obrazovky</string>
|
||||
<string name="applets">Spouštěč apletů</string>
|
||||
<string name="applets_description">Spouštění systémových apletů</string>
|
||||
<string name="applets_error_firmware">Firmware není nainstalován</string>
|
||||
<string name="applets_error_applet">Aplet není dostupný</string>
|
||||
<string name="applets_error_description"><![CDATA[Ovněřte instalaci <a href="https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys">prod.keys</a> a <a href="https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware">firmware</a>.]]></string>
|
||||
<string name="album_applet">Album</string>
|
||||
<string name="album_applet_description">Zobrazovat obrázky uložené v uživatelské složce se snímky obrazovky pomocí systémového prohlížeče fotografií</string>
|
||||
<string name="mii_edit_applet">Editor Mii</string>
|
||||
<string name="mii_edit_applet_description">Úprava Mii postav</string>
|
||||
<string name="cabinet_applet">Kabinet</string>
|
||||
<string name="cabinet_applet_description">Správa dat Amiibo</string>
|
||||
<string name="cabinet_launcher">Spouštěč kabinetu</string>
|
||||
<string name="cabinet_nickname_and_owner">Nastavení přezdívky a vlastníka</string>
|
||||
<string name="cabinet_game_data_eraser">Mazání herních dat</string>
|
||||
<string name="cabinet_restorer">Obnovovač</string>
|
||||
<string name="cabinet_formatter">Formátovač</string>
|
||||
|
||||
<!-- About screen strings -->
|
||||
<string name="gaia_is_not_real">Gaia není skutečná</string>
|
||||
@@ -286,10 +369,6 @@
|
||||
<string name="user_data_import_success">Uživatelská data byla úspěšně importována.</string>
|
||||
<string name="user_data_export_cancelled">Export zrušen</string>
|
||||
|
||||
<string name="no_manual_installation">Žádná manuální instalace</string>
|
||||
<string name="prioritized_support">Prioritní podpora</string>
|
||||
<string name="our_eternal_gratitude">Naše věčná vděčnost</string>
|
||||
<string name="are_you_interested">Máte zájem?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">Omezit rychlost</string>
|
||||
@@ -299,6 +378,8 @@
|
||||
<string name="cpu_backend">CPU backend</string>
|
||||
<string name="cpu_accuracy">Přesnost CPU</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Název zařízení</string>
|
||||
<string name="use_docked_mode">Docked režim</string>
|
||||
<string name="use_docked_mode_description">Větší rozlišení, menší výkon</string>
|
||||
@@ -310,6 +391,11 @@
|
||||
<string name="use_custom_rtc_description">Vlastní nastavení času</string>
|
||||
<string name="set_custom_rtc">Nastavit vlastní RTC</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">Webový token</string>
|
||||
<string name="web_token_description">Webový token používaný k vytváření veřejných místností. Jedná se o řetězec o délce 48 znaků obsahující pouze malá písmena a-z.</string>
|
||||
<string name="network">Síť</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">Úroveň přesnosti</string>
|
||||
<string name="renderer_resolution">Rozlišení (Handheld/Docked)</string>
|
||||
@@ -333,7 +419,17 @@
|
||||
|
||||
<!-- Debug settings strings -->
|
||||
<string name="cpu">CPU</string>
|
||||
<string name="cpu_debug_mode">Ladění CPU</string>
|
||||
<string name="cpu_debug_mode_description">Pomalý ladící režim</string>
|
||||
<string name="gpu">GPU</string>
|
||||
<string name="renderer_api">API</string>
|
||||
<string name="renderer_debug">Ladění grafiky</string>
|
||||
<string name="renderer_debug_description">Pomalý ladící režim</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">Protokolování</string>
|
||||
<string name="flush_by_line">Vypisovat ladicí záznamy po řádcích</string>
|
||||
<string name="flush_by_line_description">Vypisuje ladicí záznamy po každém napsaném řádku, což usnadňuje ladění v případě pádu nebo zamrznutí.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">Výstupní engine</string>
|
||||
@@ -372,6 +468,33 @@
|
||||
<string name="system_gpu_driver">Systémový ovladač GPU</string>
|
||||
<string name="installing_driver">Instalování ovladače...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">Stahovač ovladačů GPU</string>
|
||||
<string name="fetch">Stáhnout</string>
|
||||
<string name="fetch_error">Chyba při stahování</string>
|
||||
<string name="check_connection">Zkontrolujte připojení a zkuste to znovu.</string>
|
||||
<string name="show_releases">Zobrazit verze</string>
|
||||
<string name="view_full_release_notes">Poznámky k verzi</string>
|
||||
<string name="failed_to_fetch">Nepodařilo se stáhnout</string>
|
||||
<string name="error_during_fetch">Chyba při stahování</string>
|
||||
<string name="toggle_release_notes">Přepnout poznámky k verzi</string>
|
||||
<string name="downloads">Stažené soubory</string>
|
||||
<string name="show_downloads">Zobrazit stažené soubory</string>
|
||||
<string name="hide_downloads">Skrýt stažené soubory</string>
|
||||
<string name="failed_cache_dir">Adresář mezipaměti není k dispozici</string>
|
||||
<string name="empty_response_body">Prázdné tělo odpovědi</string>
|
||||
<string name="successfully_installed">%1$s úspěšně nainstalován</string>
|
||||
<string name="driver_failed_title">Instalace ovladače selhala</string>
|
||||
<string name="failed_install_driver">Nepodařilo se nainstalovat ovladač %1$s, podporuje jej váš systém?</string>
|
||||
<string name="driver_empty">Stažený ovladač je prázdný, zkontrolujte připojení k internetu</string>
|
||||
<string name="downloading">Stahování…</string>
|
||||
<string name="installing">Instalace…</string>
|
||||
<string name="latest">Nejnovější</string>
|
||||
<string name="recommended_driver">Doporučený ovladač:</string>
|
||||
<string name="gpu_model">Model GPU:</string>
|
||||
<string name="unsupported_gpu">Nepodporovaná GPU</string>
|
||||
<string name="unsupported_gpu_warning">Vaše GPU nepodporuje vkládání ovladačů. Nastavení vlastních ovladačů se nedoporučuje.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">Nastavení</string>
|
||||
<string name="preferences_general">Obecné</string>
|
||||
@@ -477,11 +600,30 @@
|
||||
|
||||
<!-- Black backgrounds theme -->
|
||||
<string name="use_black_backgrounds">Černá pozadí</string>
|
||||
<string name="use_black_backgrounds_description">Použít černá pozadí v tmavém režimu</string>
|
||||
|
||||
<!-- Picture-In-Picture -->
|
||||
<string name="picture_in_picture">Obraz v obraze</string>
|
||||
<string name="picture_in_picture_description">Minimalizace při pozadí</string>
|
||||
<string name="pause">Pauza</string>
|
||||
<string name="play">Přehrát</string>
|
||||
<string name="mute">Ztlumit</string>
|
||||
<string name="unmute">Vypnout ztlumení</string>
|
||||
<string name="unmute">Zrušit ztlumení</string>
|
||||
|
||||
<!-- Emulation vertical alignment -->
|
||||
<string name="vertical_alignment">Vertikální zarovnání</string>
|
||||
<string name="top">Nahoru</string>
|
||||
<string name="center">Na střed</string>
|
||||
<string name="bottom">Dolů</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">Aplety</string>
|
||||
<string name="applets_menu_description">(Ve vývoji) Změna frontendů a nastavení apletů</string>
|
||||
|
||||
<string name="applet_hle">Vlastní frontend</string>
|
||||
<string name="applet_lle">Skutečný aplet</string>
|
||||
|
||||
<string name="swkbd_applet">Softwarová klávesnice</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">Licence</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.<br /><br />Bevor du beginnst, bitte halte deine <![CDATA[<b> prod.keys </b>]]> auf deinem Gerät bereit. .<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Mehr Infos</a>]]></string>
|
||||
<string name="app_disclaimer">Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.<br /><br />Bevor du beginnst, bitte halte deine <![CDATA[<b> prod.keys </b>]]> auf deinem Gerät bereit. .<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Mehr Infos</a>]]></string>
|
||||
<string name="notice_notification_channel_name">Hinweise und Fehler</string>
|
||||
<string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
|
||||
<string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht erlaubt!</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(Enhanced)</string>
|
||||
<string name="process_ram">Prozess-RAM: %1$d MB</string>
|
||||
<string name="shaders_prefix">Erstelle</string>
|
||||
<string name="shaders_suffix">Shader</string>
|
||||
<string name="system_info_label">System:</string>
|
||||
<string name="show_stats_overlay">Leistungsstatistik Overlay anzeigen</string>
|
||||
<string name="stats_overlay_customization">Anpassung</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">Unten rechts</string>
|
||||
<string name="overlay_position_center_top">Mitte oben</string>
|
||||
<string name="overlay_position_center_bottom">Mitte unten</string>
|
||||
<string name="overlay_background">Overlay-Hintergrund</string>
|
||||
<string name="overlay_background_description">Hintergrund für bessere Lesbarkeit</string>
|
||||
<string name="perf_overlay_background">Overlay-Hintergrund</string>
|
||||
<string name="perf_overlay_background_description">Hintergrund für bessere Lesbarkeit</string>
|
||||
<string name="show_shaders_building">Shader-Bau anzeigen</string>
|
||||
<string name="show_shaders_building_description">Aktuelle Anzahl der erstellten Shader anzeigen</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Geräteinfo-Overlay anzeigen</string>
|
||||
<string name="enable_soc_overlay">Geräte-Overlay aktivieren</string>
|
||||
<string name="soc_overlay_options">Geräte-Overlay</string>
|
||||
<string name="soc_overlay_options_description">Konfigurieren Sie, welche Informationen im Geräte-Overlay angezeigt werden</string>
|
||||
|
||||
<string name="show_device_model">Gerätemodell anzeigen</string>
|
||||
<string name="show_device_model_description">Modell des Host-Geräts anzeigen</string>
|
||||
<string name="show_gpu_model">GPU-Modell anzeigen</string>
|
||||
<string name="show_gpu_model_description">Modell der Host-GPU anzeigen</string>
|
||||
<string name="show_soc_model">SoC-Modell anzeigen</string>
|
||||
<string name="show_soc_model_description">Modell des Host-SoC anzeigen</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">GPU-Erweiterungen</string>
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="veil_misc">Verschiedenes</string>
|
||||
<string name="eden_veil">Edens Schleier</string>
|
||||
<string name="eden_veil_description">Jenseits der Standardeinstellungen</string>
|
||||
<string name="eden_veil_description">Experimentelle Einstellungen zur Verbesserung der Leistung und Funktionalität. Diese Einstellungen können schwarze Bildschirme oder andere Spielprobleme verursachen.</string>
|
||||
<string name="eden_veil_warning_title">Experimentelle Einstellungen</string>
|
||||
<string name="eden_veil_warning_description">Die Einstellungen in Eden\'s Veil sind hoch experimentell und können Probleme verursachen. Wenn Ihr Spiel nicht startet, deaktivieren Sie alle Erweiterungen und setzen Sie Extended Dynamic State auf 0.</string>
|
||||
<string name="frame_skipping">WIP: Frame Skipping</string>
|
||||
<string name="frame_skipping_description">Aktivieren Sie Frame Skipping, um die Leistung durch Reduzierung der gerenderten Frames zu verbessern. Diese Funktion wird noch entwickelt und in zukünftigen Versionen verfügbar sein.</string>
|
||||
<string name="frame_interpolation">Erweiterte Frame-Synchronisation</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">LRU-Cache aktivieren</string>
|
||||
<string name="use_lru_cache_description">Aktivieren oder deaktivieren Sie den LRU-Cache (Least Recently Used), um die Leistung durch Reduzierung der CPU-Auslastung zu verbessern. Einige Spiele haben Probleme damit, insbesondere TotK 1.2.1, deaktivieren Sie ihn also, wenn das Spiel nicht startet oder zufällig abstürzt.</string>
|
||||
<string name="dyna_state">Erweiterter dynamischer Status</string>
|
||||
<string name="dyna_state_description">Aktiviert Vulkan-Funktionen zur Verbesserung der Leistung, des Renderings und zur Ressourceneinsparung bei der Pipeline-Erstellung, während die CPU/GPU-Auslastung niedrig bleibt. Diese Erweiterungen können die Gerätetemperatur erhöhen, und ältere GPUs der A6XX-Serie reagieren möglicherweise nicht korrekt. Auf 0 setzen, um emulierte Yuzu-Formate zu verwenden.</string>
|
||||
<string name="dyna_state_description">Aktiviert Vulkan-Funktionen zur Leistungssteigerung, verbessertem Rendering und Ressourcenschonung bei der Pipeline-Erstellung bei niedriger CPU/GPU-Auslastung. Diese Erweiterungen können die Gerätetemperatur erhöhen, und GPUs der älteren A6XX-Serie funktionieren möglicherweise nicht korrekt. Auf 0 setzen, um emulierte Legacy-Formate zu verwenden.</string>
|
||||
<string name="use_sync_core">Kern-Geschwindigkeit synchronisieren</string>
|
||||
<string name="use_sync_core_description">Synchronisiert die Taktrate des Kerns mit der maximalen Geschwindigkeit, um die Leistung zu verbessern, ohne die tatsächliche Spielgeschwindigkeit zu verändern.</string>
|
||||
<string name="use_auto_stub">Auto-Stub verwenden</string>
|
||||
@@ -63,6 +86,24 @@
|
||||
<string name="descriptor_indexing_description">Verbessert die Textur- und Puffer-Verarbeitung sowie die Maxwell-Übersetzungsschicht. Wird von einigen Vulkan 1.1-GPUs und allen Vulkan 1.2+-GPUs unterstützt.</string>
|
||||
<string name="use_fast_gpu_time">Schnelle GPU-Zeit verwenden</string>
|
||||
<string name="use_fast_gpu_time_description">Erzwingt bei den meisten Spielen die höchste native Auflösung. Diese Option ist experimentell und kann Probleme verursachen.</string>
|
||||
<string name="fast_gpu_time">GPU-Übertaktungsfaktor</string>
|
||||
<string name="fast_gpu_time_description">Verwenden Sie 128 für maximale Leistung und 512 für maximale Grafikqualität.</string>
|
||||
<string name="gpu_low">Niedrig (128)</string>
|
||||
<string name="gpu_medium">Mittel (256)</string>
|
||||
<string name="gpu_high">Hoch (512)</string>
|
||||
<string name="use_fast_cpu_time">Schnelle CPU-Zeit</string>
|
||||
<string name="use_fast_cpu_time_description">Zwingt die emulierte CPU, mit höherer Taktrate zu laufen, wodurch bestimmte FPS-Begrenzungen reduziert werden. Diese Option ist unsauber und kann Probleme verursachen, und schwächere CPUs können eine geringere Leistung aufweisen.</string>
|
||||
<string name="fast_cpu_time">CPU-Takt</string>
|
||||
<string name="fast_cpu_time_description">Verwenden Sie Boost (1700MHz), um mit der höchsten nativen Taktrate des Switch zu laufen, oder Fast (2000MHz), um mit der doppelten Taktrate zu laufen.</string>
|
||||
<string name="memory_layout">Speicherlayout</string>
|
||||
<string name="memory_layout_description">(EXPERIMENTELL) Ändert das emulierte Speicherlayout. Diese Einstellung erhöht nicht die Leistung, kann aber bei Spielen helfen, die hohe Auflösungen über Mods nutzen. Nicht auf Telefonen mit 8 GB RAM oder weniger verwenden.</string>
|
||||
<string name="memory_4gb">4 GB (Empfohlen)</string>
|
||||
<string name="memory_6gb">6 GB (Unsicher)</string>
|
||||
<string name="memory_8gb">8 GB (Unsicher)</string>
|
||||
|
||||
<string name="clock_base">Basis (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">Schnell (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">ASTC-Decodierung</string>
|
||||
@@ -106,60 +147,62 @@
|
||||
<string name="always">Immer</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">Multiplayer</string>
|
||||
<string name="multiplayer_description">Spiele mit anderen online</string>
|
||||
<string name="multiplayer">Mehrspieler</string>
|
||||
<string name="multiplayer_description">Erstelle deinen eigenen Spielraum oder trete einem bestehenden bei, um mit anderen zu spielen</string>
|
||||
<string name="multiplayer_room_title">Raum: %1$s</string>
|
||||
<string name="multiplayer_console_id">Konsole-ID: %1$s</string>
|
||||
<string name="multiplayer_create_room">Erstellen</string>
|
||||
<string name="multiplayer_join_room">Beitreten</string>
|
||||
<string name="multiplayer_public_room">Öffentliche Räume durchsuchen</string>
|
||||
<string name="multiplayer_username">Benutzername</string>
|
||||
<string name="multiplayer_ip_address">IP-Adresse</string>
|
||||
<string name="multiplayer_ip_port">Port</string>
|
||||
<string name="multiplayer_create_room_success">Raum erstellt</string>
|
||||
<string name="multiplayer_join_room_success">Beitritt erfolgreich</string>
|
||||
<string name="multiplayer_create_room_failed">Fehler beim Erstellen</string>
|
||||
<string name="multiplayer_join_room_failed">Fehler beim Beitreten</string>
|
||||
<string name="multiplayer_input_invalid">Ungültige Eingabe</string>
|
||||
<string name="multiplayer_port_invalid">Ungültiger Port</string>
|
||||
<string name="multiplayer_create_room_success">Raum erfolgreich erstellt</string>
|
||||
<string name="multiplayer_join_room_success">Erfolgreich beigetreten</string>
|
||||
<string name="multiplayer_create_room_failed">Raum konnte nicht erstellt werden</string>
|
||||
<string name="multiplayer_join_room_failed">Beitritt fehlgeschlagen</string>
|
||||
<string name="multiplayer_name_invalid">Name zu kurz</string>
|
||||
<string name="multiplayer_address_invalid">Ungültige Adresse</string>
|
||||
<string name="multiplayer_port_invalid">Ungültiger Port!</string>
|
||||
<string name="multiplayer_exit_room">Raum verlassen</string>
|
||||
<string name="multiplayer_network_error">Netzwerkfehler</string>
|
||||
<string name="multiplayer_lost_connection">Verbindung verloren</string>
|
||||
<string name="multiplayer_name_collision">Name existiert bereits</string>
|
||||
<string name="multiplayer_mac_collision">MAC-Kollision</string>
|
||||
<string name="multiplayer_console_id_collision">Konsole-ID-Kollision</string>
|
||||
<string name="multiplayer_name_collision">Namenskonflikt</string>
|
||||
<string name="multiplayer_mac_collision">MAC-Adressenkonflikt</string>
|
||||
<string name="multiplayer_console_id_collision">Konsole-ID-Konflikt</string>
|
||||
<string name="multiplayer_wrong_version">Falsche Version</string>
|
||||
<string name="multiplayer_wrong_password">Falsches Passwort</string>
|
||||
<string name="multiplayer_could_not_connect">Verbindung fehlgeschlagen</string>
|
||||
<string name="multiplayer_room_is_full">Raum voll</string>
|
||||
<string name="multiplayer_host_banned">Gebannt</string>
|
||||
<string name="multiplayer_room_is_full">Raum ist voll</string>
|
||||
<string name="multiplayer_host_banned">Host gebannt</string>
|
||||
<string name="multiplayer_permission_denied">Zugriff verweigert</string>
|
||||
<string name="multiplayer_no_such_user">Benutzer unbekannt</string>
|
||||
<string name="multiplayer_no_such_user">Benutzer existiert nicht</string>
|
||||
<string name="multiplayer_already_in_room">Bereits im Raum</string>
|
||||
<string name="multiplayer_create_room_error">Raumerstellungsfehler</string>
|
||||
<string name="multiplayer_host_kicked">Gekickt</string>
|
||||
<string name="multiplayer_create_room_error">Fehler beim Erstellen des Raums</string>
|
||||
<string name="multiplayer_host_kicked">Host wurde entfernt</string>
|
||||
<string name="multiplayer_unknown_error">Unbekannter Fehler</string>
|
||||
<string name="multiplayer_room_uninitialized">Raum nicht initialisiert</string>
|
||||
<string name="multiplayer_room_idle">Raum inaktiv</string>
|
||||
<string name="multiplayer_room_joining">Beitritt läuft</string>
|
||||
<string name="multiplayer_room_joined">Beigetreten</string>
|
||||
<string name="multiplayer_room_moderator">Moderator</string>
|
||||
<string name="multiplayer_member_join">%1$s beigetreten</string>
|
||||
<string name="multiplayer_member_leave">%1$s verlassen</string>
|
||||
<string name="multiplayer_member_kicked">%1$s gekickt</string>
|
||||
<string name="multiplayer_member_banned">%1$s gebannt</string>
|
||||
<string name="multiplayer_address_unbanned">Entbannt</string>
|
||||
<string name="multiplayer_kick_member">Kicken</string>
|
||||
<string name="multiplayer_room_joining">Beitritt läuft…</string>
|
||||
<string name="multiplayer_room_joined">Raum beigetreten</string>
|
||||
<string name="multiplayer_room_moderator">Raum-Moderator</string>
|
||||
<string name="multiplayer_member_join">%1$s ist beigetreten</string>
|
||||
<string name="multiplayer_member_leave">%1$s hat verlassen</string>
|
||||
<string name="multiplayer_member_kicked">%1$s wurde entfernt</string>
|
||||
<string name="multiplayer_member_banned">%1$s wurde gebannt</string>
|
||||
<string name="multiplayer_address_unbanned">Adresse entbannt</string>
|
||||
<string name="multiplayer_kick_member">Entfernen</string>
|
||||
<string name="multiplayer_chat_input_hint">Nachricht senden…</string>
|
||||
<string name="multiplayer_password">Passwort</string>
|
||||
<string name="original_button_text">Beitreten</string>
|
||||
<string name="disabled_button_text">Beitritt läuft…</string>
|
||||
<string name="multiplayer_joining">Beitritt läuft…</string>
|
||||
<string name="multiplayer_creating">Erstellung läuft…</string>
|
||||
<string name="multiplayer_room_name">Raumname</string>
|
||||
<string name="multiplayer_room_name_invalid">Name: 3-20 Zeichen</string>
|
||||
<string name="multiplayer_max_players">Max Spieler (16)</string>
|
||||
<string name="multiplayer_max_players_value">Max Spieler: %d</string>
|
||||
<string name="multiplayer_room_name_invalid">Raumname muss 3-20 Zeichen lang sein</string>
|
||||
<string name="multiplayer_max_players">Max. Spieler (16)</string>
|
||||
<string name="multiplayer_max_players_value">Max. Spieler: %d</string>
|
||||
<string name="multiplayer_chat">Chat</string>
|
||||
<string name="multiplayer_more_options">Mehr Optionen</string>
|
||||
<string name="multiplayer_ip_copied">IP kopiert</string>
|
||||
<string name="multiplayer_more_options">Weitere Optionen</string>
|
||||
<string name="multiplayer_ip_copied">IP-Adresse kopiert</string>
|
||||
<string name="multiplayer_server_address">Serveradresse</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Nachricht eingeben…</string>
|
||||
@@ -167,16 +210,38 @@
|
||||
<string name="send_message">Nachricht senden</string>
|
||||
<string name="multiplayer_moderation">Moderation</string>
|
||||
<string name="multiplayer_moderation_title">Bannliste</string>
|
||||
<string name="multiplayer_no_bans">Keine Banns</string>
|
||||
<string name="multiplayer_no_bans">Keine gebannten Benutzer</string>
|
||||
<string name="multiplayer_unban_title">Entbannen</string>
|
||||
<string name="multiplayer_unban">Entbannen</string>
|
||||
<string name="multiplayer_unban_message">%1$s entbannen?</string>
|
||||
<string name="multiplayer_ban">Bannen</string>
|
||||
<string name="emulation_multiplayer">Multiplayer</string>
|
||||
<string name="multiplayer_unban_message">%1$s wirklich entbannen?</string>
|
||||
<string name="multiplayer_ban">Benutzer bannen</string>
|
||||
<string name="multiplayer_room_browser">Öffentliche Räume</string>
|
||||
<string name="multiplayer_no_rooms_found">Keine öffentlichen Räume gefunden</string>
|
||||
<string name="multiplayer_password_required">Passwort erforderlich</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">Spiel</string>
|
||||
<string name="multiplayer_no_game_info">Beliebiges Spiel</string>
|
||||
<string name="multiplayer_password_protected">Passwortgeschützter Raum</string>
|
||||
<string name="multiplayer_hide_full_rooms">Volle Räume ausblenden</string>
|
||||
<string name="multiplayer_hide_empty_rooms">Leere Räume ausblenden</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">Zum Aktualisieren tippen</string>
|
||||
<string name="multiplayer_search_public_lobbies">Räume suchen…</string>
|
||||
<string name="emulation_multiplayer">Mehrspieler</string>
|
||||
<string name="multiplayer_game_name">Bevorzugte Spiele</string>
|
||||
<string name="multiplayer_preferred_game_name">Bevorzugtes Spiel</string>
|
||||
<string name="multiplayer_no_game">Keine Spiele gefunden</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">Zum Hosten muss ein bevorzugtes Spiel ausgewählt werden.</string>
|
||||
<string name="multiplayer_room_name_error">Muss 3-20 Zeichen lang sein</string>
|
||||
<string name="multiplayer_required">Erforderlich</string>
|
||||
<string name="multiplayer_ip_error">Ungültiges IP-Format</string>
|
||||
<string name="multiplayer_username_error">Mindestens 5 Zeichen</string>
|
||||
<string name="multiplayer_port_error">Muss zwischen 1-65535 liegen</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="refresh">Aktualisieren</string>
|
||||
<string name="room_list">Raumliste</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Designfarbe</string>
|
||||
<string name="violet">Violett (Standard)</string>
|
||||
<string name="blue">Blau</string>
|
||||
@@ -301,7 +366,26 @@ Wirklich fortfahren?</string>
|
||||
<string name="game_folders">Spiele-Ordner</string>
|
||||
<string name="add_game_folder">Spiele-Ordner hinzufügen</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Anwendungen vom Systemstartbildschirm aus starten</string>
|
||||
<string name="applets">Applet-Launcher</string>
|
||||
<string name="applets_description">System-Applets mit Firmware starten</string>
|
||||
<string name="applets_error_firmware">Firmware nicht installiert</string>
|
||||
<string name="applets_error_applet">Applet nicht verfügbar</string>
|
||||
<string name="applets_error_description"><![CDATA[Stellen Sie sicher, dass <a href="https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys">prod.keys</a> und <a href="https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware">Firmware</a> installiert sind.]]></string>
|
||||
<string name="album_applet">Album</string>
|
||||
<string name="album_applet_description">Bilder im Screenshot-Ordner anzeigen</string>
|
||||
<string name="mii_edit_applet">Mii-Editor</string>
|
||||
<string name="mii_edit_applet_description">Miis bearbeiten und anzeigen</string>
|
||||
<string name="cabinet_applet">Cabinet</string>
|
||||
<string name="cabinet_applet_description">Amiibo-Daten verwalten</string>
|
||||
<string name="cabinet_launcher">Cabinet-Launcher</string>
|
||||
<string name="cabinet_nickname_and_owner">Name und Besitzer</string>
|
||||
<string name="cabinet_game_data_eraser">Spieldaten löschen</string>
|
||||
<string name="cabinet_restorer">Wiederherstellen</string>
|
||||
<string name="cabinet_formatter">Formatieren</string>
|
||||
|
||||
<!-- About screen strings -->
|
||||
<string name="gaia_is_not_real">Gaia ist nicht real</string>
|
||||
<string name="copied_to_clipboard">In die Zwischenablage kopiert</string>
|
||||
@@ -317,23 +401,15 @@ Wirklich fortfahren?</string>
|
||||
<string name="user_data_import_success">Nutzerdaten erfolgreich importiert</string>
|
||||
<string name="user_data_export_cancelled">Export abgebrochen</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">Early Access</string>
|
||||
<string name="early_access_benefits">Early Access Vorteile</string>
|
||||
<string name="cutting_edge_features">Neueste Features</string>
|
||||
<string name="early_access_updates">Früherer Zugriff auf Updates</string>
|
||||
<string name="no_manual_installation">Keine manuelle Installation</string>
|
||||
<string name="prioritized_support">Priorisierte Unterstützung</string>
|
||||
<string name="helping_game_preservation">Beitrag zur Erhaltung der Spiele</string>
|
||||
<string name="our_eternal_gratitude">Unsere ewige Dankbarkeit</string>
|
||||
<string name="are_you_interested">Bist du interessiert?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">Limitierte Geschwindigkeit</string>
|
||||
<string name="frame_limit_enable_description">Limitiert die Geschwindigkeit auf einen von dir festgelegten Prozentsatz.</string>
|
||||
<string name="frame_limit_slider">Geschwindkeitsbegrenzung in Prozent</string>
|
||||
<string name="frame_limit_slider_description">Gibt die prozentuale Geschwindigkeit der Emulation an. 100% sind normal. Werte darüber oder drunter werden die Geschwindigkeit entsprechend verändern.</string>
|
||||
<string name="cpu_accuracy">CPU-Genauigkeit</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Gerätename</string>
|
||||
<string name="use_docked_mode">Gedockter Modus</string>
|
||||
<string name="use_docked_mode_description">Der Gedockte-Modus erhöht die Auflösung, verringert aber die Leistung.
|
||||
Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Leistung.</string>
|
||||
@@ -342,6 +418,12 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die
|
||||
<string name="select_rtc_date">RTC-Datum auswählen</string>
|
||||
<string name="select_rtc_time">RTC-Zeit auswählen</string>
|
||||
<string name="use_custom_rtc">Benutzerdefinierte Echtzeituhr</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">Web-Token</string>
|
||||
<string name="web_token_description">Web-Token zum Erstellen öffentlicher Räume. Es handelt sich um eine 48-stellige Zeichenfolge, die nur Kleinbuchstaben a-z enthält.</string>
|
||||
<string name="network">Netzwerk</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">Genauigkeitsstufe</string>
|
||||
<string name="renderer_resolution">Auflösung (Handheld/Gedockt)</string>
|
||||
@@ -362,15 +444,28 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die
|
||||
<string name="use_disk_shader_cache_description">Reduziert Ruckler durch Shader-Caching.</string>
|
||||
<string name="anisotropic_filtering">Anisotrope Filterung</string>
|
||||
<string name="anisotropic_filtering_description">Verbessert die Texturenqualität.</string>
|
||||
|
||||
<!-- Debug settings strings -->
|
||||
<string name="cpu">CPU</string>
|
||||
<string name="cpu_debug_mode">CPU Debugging</string>
|
||||
<string name="cpu_debug_mode">CPU-Debugging</string>
|
||||
<string name="cpu_debug_mode_description">Aktiviert den langsamen Debug-Modus.</string>
|
||||
<string name="gpu">GPU</string>
|
||||
<string name="renderer_api">API</string>
|
||||
<string name="renderer_debug">Graphik-Debugging</string>
|
||||
<string name="renderer_debug">Grafik-Debugging</string>
|
||||
<string name="renderer_debug_description">Aktiviert den langsamen Grafik-Debug-Modus.</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">Protokollierung</string>
|
||||
<string name="flush_by_line">Debug-Protokolle zeilenweise leeren</string>
|
||||
<string name="flush_by_line_description">Leert Debug-Protokolle bei jeder geschriebenen Zeile, was das Debuggen bei Abstürzen oder Einfrieren erleichtert.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">Ausgabe-Engine</string>
|
||||
<string name="audio_volume">Lautstärke</string>
|
||||
<string name="audio_volume_description">Legt die Lautstärke der Audioausgabe fest.</string>
|
||||
|
||||
<!-- Input strings -->
|
||||
<string name="buttons">Tasten</string>
|
||||
<string name="button_a">A</string>
|
||||
<string name="button_b">B</string>
|
||||
<string name="button_x">X</string>
|
||||
@@ -459,6 +554,33 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die
|
||||
<string name="system_gpu_driver">System GPU-Treiber</string>
|
||||
<string name="installing_driver">Treiber wird installiert...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">GPU-Treiber-Hersteller</string>
|
||||
<string name="fetch">Abrufen</string>
|
||||
<string name="fetch_error">Fehler beim Abrufen</string>
|
||||
<string name="check_connection">Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.</string>
|
||||
<string name="show_releases">Versionen anzeigen</string>
|
||||
<string name="view_full_release_notes">Versionshinweise</string>
|
||||
<string name="failed_to_fetch">Abruf fehlgeschlagen</string>
|
||||
<string name="error_during_fetch">Fehler beim Abrufen</string>
|
||||
<string name="toggle_release_notes">Versionshinweise umschalten</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="show_downloads">Downloads anzeigen</string>
|
||||
<string name="hide_downloads">Downloads ausblenden</string>
|
||||
<string name="failed_cache_dir">Cache-Verzeichnis nicht verfügbar</string>
|
||||
<string name="empty_response_body">Leere Antwort</string>
|
||||
<string name="successfully_installed">%1$s erfolgreich installiert</string>
|
||||
<string name="driver_failed_title">Treiberinstallation fehlgeschlagen</string>
|
||||
<string name="failed_install_driver">Installation des %1$s-Treibers fehlgeschlagen, unterstützt Ihr System ihn?</string>
|
||||
<string name="driver_empty">Heruntergeladener Treiber ist leer, überprüfen Sie Ihre Internetverbindung</string>
|
||||
<string name="downloading">Wird heruntergeladen…</string>
|
||||
<string name="installing">Wird installiert…</string>
|
||||
<string name="latest">Neueste</string>
|
||||
<string name="recommended_driver">Empfohlener Treiber:</string>
|
||||
<string name="gpu_model">GPU-Modell:</string>
|
||||
<string name="unsupported_gpu">Nicht unterstützte GPU</string>
|
||||
<string name="unsupported_gpu_warning">Ihre GPU unterstützt keine Treiberinjektion. Das Festlegen benutzerdefinierter Treiber wird nicht empfohlen.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">Einstellungen</string>
|
||||
<string name="preferences_general">Allgemein</string>
|
||||
@@ -507,7 +629,7 @@ Wirklich fortfahren?</string>
|
||||
<string name="verify_no_result">Integritätsüberprüfung konnte nicht durchgeführt werden</string>
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Das ROM ist verschlüsselt</string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Bitte stelle sicher dass die <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> Datei installiert ist, damit Spiele entschlüsselt werden können.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Bitte stelle sicher dass die <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> Datei installiert ist, damit Spiele entschlüsselt werden können.]]></string>
|
||||
<string name="loader_error_video_core">Bei der Initialisierung des Videokerns ist ein Fehler aufgetreten</string>
|
||||
<string name="loader_error_video_core_description">Dies wird normalerweise durch einen inkompatiblen GPU-Treiber verursacht. Die Installation eines passenden GPU-Treibers kann dieses Problem beheben.</string>
|
||||
<string name="loader_error_invalid_format">ROM konnte nicht geladen werden</string>
|
||||
@@ -657,6 +779,21 @@ Wirklich fortfahren?</string>
|
||||
<string name="mute">Stummschalten</string>
|
||||
<string name="unmute">Ton aktivieren</string>
|
||||
|
||||
<!-- Emulation vertical alignment -->
|
||||
<string name="vertical_alignment">Vertikale Ausrichtung</string>
|
||||
<string name="top">Oben</string>
|
||||
<string name="center">Mitte</string>
|
||||
<string name="bottom">Unten</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">Applets</string>
|
||||
<string name="applets_menu_description">(In Arbeit) Applet-Frontends und Einstellungen ändern</string>
|
||||
|
||||
<string name="applet_hle">Benutzerdefinierte Frontend</string>
|
||||
<string name="applet_lle">Echtes Applet</string>
|
||||
|
||||
<string name="swkbd_applet">Software-Tastatur</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">Lizenzen</string>
|
||||
<string name="license_fidelityfx_fsr_description">Hochwertiges Upscaling von AMD</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string>
|
||||
<string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Saber más</a>]]></string>
|
||||
<string name="notice_notification_channel_name">Avisos y errores</string>
|
||||
<string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string>
|
||||
<string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(Mejorado)</string>
|
||||
<string name="process_ram">RAM de proceso: %1$d MB</string>
|
||||
<string name="shaders_prefix">Compilando</string>
|
||||
<string name="shaders_suffix">shader(s)</string>
|
||||
<string name="system_info_label">Sistema:</string>
|
||||
<string name="show_stats_overlay">Mostrar superposición de estadísticas de rendimiento</string>
|
||||
<string name="stats_overlay_customization">Personalización</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">Inferior derecha</string>
|
||||
<string name="overlay_position_center_top">Centro superior</string>
|
||||
<string name="overlay_position_center_bottom">Centro inferior</string>
|
||||
<string name="overlay_background">Fondo de superposición</string>
|
||||
<string name="overlay_background_description">Añadir fondo para mejor legibilidad</string>
|
||||
<string name="perf_overlay_background">Fondo de superposición</string>
|
||||
<string name="perf_overlay_background_description">Añadir fondo para mejor legibilidad</string>
|
||||
<string name="show_shaders_building">Mostrar construcción de shaders</string>
|
||||
<string name="show_shaders_building_description">Muestra el número actual de shaders que se están construyendo</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Mostrar superposición de información del dispositivo</string>
|
||||
<string name="enable_soc_overlay">Habilitar superposición del dispositivo</string>
|
||||
<string name="soc_overlay_options">Superposición del dispositivo</string>
|
||||
<string name="soc_overlay_options_description">Configurar qué información se muestra en la superposición del dispositivo</string>
|
||||
|
||||
<string name="show_device_model">Mostrar modelo del dispositivo</string>
|
||||
<string name="show_device_model_description">Mostrar el modelo del dispositivo anfitrión</string>
|
||||
<string name="show_gpu_model">Mostrar modelo de GPU</string>
|
||||
<string name="show_gpu_model_description">Mostrar el modelo de GPU del anfitrión</string>
|
||||
<string name="show_soc_model">Mostrar modelo de SoC</string>
|
||||
<string name="show_soc_model_description">Mostrar el modelo de SoC del anfitrión</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">Extensiones de GPU</string>
|
||||
<string name="veil_renderer">Renderizador</string>
|
||||
<string name="veil_misc">Misceláneos</string>
|
||||
<string name="eden_veil">Velo de Edén</string>
|
||||
<string name="eden_veil_description">Más allá de lo predeterminado</string>
|
||||
<string name="eden_veil_description">Configuraciones experimentales para mejorar el rendimiento y la capacidad. Estas configuraciones pueden causar pantallas negras u otros problemas en el juego.</string>
|
||||
<string name="eden_veil_warning_title">Configuraciones experimentales</string>
|
||||
<string name="eden_veil_warning_description">Las configuraciones dentro de Eden\'s Veil son altamente experimentales y pueden causar problemas. Si tu juego no inicia, desactiva cualquier extensión y cambia Extended Dynamic State a 0.</string>
|
||||
<string name="frame_skipping">WIP: Salto de fotogramas</string>
|
||||
<string name="frame_skipping_description">Activa o desactiva el salto de fotogramas para mejorar el rendimiento reduciendo el número de fotogramas renderizados. Esta función está en desarrollo y se habilitará en futuras versiones.</string>
|
||||
<string name="frame_interpolation">Sincronización de fotogramas mejorada</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">Habilitar caché LRU</string>
|
||||
<string name="use_lru_cache_description">Activa o desactiva la caché LRU (menos usados recientemente), aumentando el rendimiento al ahorrar uso de CPU. Algunos juegos tienen problemas con ella, especialmente TotK 1.2.1, así que desactívala si el juego no arranca o se cierra aleatoriamente.</string>
|
||||
<string name="dyna_state">Estado dinámico extendido</string>
|
||||
<string name="dyna_state_description">Habilita funciones Vulkan para mejorar rendimiento, renderizado y ahorrar recursos en creación de pipelines manteniendo bajo uso de CPU/GPU. Estas extensiones pueden aumentar la temperatura del dispositivo y GPUs antiguas de serie A6XX podrían no responder correctamente. Establecer en 0 para usar formatos emulados de Yuzu.</string>
|
||||
<string name="dyna_state_description">Habilita funciones de Vulkan para mejorar el rendimiento, el renderizado y ahorrar recursos en la creación de pipelines manteniendo un uso reducido de CPU/GPU. Estas extensiones pueden aumentar la temperatura del dispositivo, y las GPU de la antigua serie A6XX podrían no funcionar correctamente. Establecer en 0 para usar formatos emulados heredados.</string>
|
||||
<string name="use_sync_core">Sincronizar velocidad del núcleo</string>
|
||||
<string name="use_sync_core_description">Sincroniza la velocidad del núcleo con el porcentaje máximo de velocidad para mejorar el rendimiento sin alterar la velocidad real del juego.</string>
|
||||
<string name="use_auto_stub">Usar Auto Stub</string>
|
||||
@@ -63,42 +86,60 @@
|
||||
<string name="descriptor_indexing_description">Mejora el manejo de texturas y buffers, así como la capa de traducción Maxwell. Compatible con algunas GPUs Vulkan 1.1 y todas Vulkan 1.2+.</string>
|
||||
<string name="use_fast_gpu_time">Usar tiempo rápido de GPU</string>
|
||||
<string name="use_fast_gpu_time_description">Fuerza a la mayoría de juegos a ejecutarse en su resolución nativa más alta. Esta opción es inestable y puede causar problemas.</string>
|
||||
<string name="fast_gpu_time">Factor de overclock de GPU</string>
|
||||
<string name="fast_gpu_time_description">Usa 128 para máximo rendimiento y 512 para máxima fidelidad gráfica.</string>
|
||||
<string name="gpu_low">Bajo (128)</string>
|
||||
<string name="gpu_medium">Medio (256)</string>
|
||||
<string name="gpu_high">Alto (512)</string>
|
||||
<string name="use_fast_cpu_time">Tiempo de CPU rápido</string>
|
||||
<string name="use_fast_cpu_time_description">Fuerza a la CPU emulada a funcionar a una velocidad de reloj más alta, reduciendo ciertos limitadores de FPS. Esta opción es inestable y puede causar problemas, y CPUs más débiles pueden ver un rendimiento reducido.</string>
|
||||
<string name="fast_cpu_time">Reloj de CPU</string>
|
||||
<string name="fast_cpu_time_description">Usa Boost (1700MHz) para funcionar a la velocidad nativa más alta de Switch, o Fast (2000MHz) para funcionar al doble de velocidad.</string>
|
||||
<string name="memory_layout">Distribución de memoria</string>
|
||||
<string name="memory_layout_description">(EXPERIMENTAL) Cambia la distribución de memoria emulada. Esta configuración no aumenta el rendimiento, pero puede ayudar en juegos que utilizan altas resoluciones mediante mods. No usar en teléfonos con 8GB de RAM o menos.</string>
|
||||
<string name="memory_4gb">4GB (Recomendado)</string>
|
||||
<string name="memory_6gb">6GB (Inseguro)</string>
|
||||
<string name="memory_8gb">8GB (Inseguro)</string>
|
||||
|
||||
<!-- Método de decodificación ASTC -->
|
||||
<string name="clock_base">Base (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">Rápido (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">Método de decodificación ASTC</string>
|
||||
<string name="accelerate_astc_description">Elige cómo se decodifican las texturas comprimidas ASTC para el renderizado: CPU (lento, seguro), GPU (rápido, recomendado) o CPU Async (sin tartamudeos, puede causar problemas)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPU asíncrono</string>
|
||||
|
||||
<!-- Método de recompresión ASTC -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">Método de recompresión ASTC</string>
|
||||
<string name="astc_recompression_description">Elige cómo se recomprimen las texturas ASTC para mejorar la compatibilidad y el rendimiento. Habilitar esta opción ahorra VRAM pero puede reducir la calidad de las texturas.</string>
|
||||
<string name="astc_recompression_uncompressed">Sin compresión</string>
|
||||
<string name="astc_recompression_bc1">BC1 (baja calidad)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (calidad media)</string>
|
||||
|
||||
<!-- Modo de uso de VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">Modo de uso de VRAM</string>
|
||||
<string name="vram_usage_mode_description">Controlar asignación de memoria GPU</string>
|
||||
<string name="vram_usage_conservative">Conservador</string>
|
||||
<string name="vram_usage_aggressive">Agresivo</string>
|
||||
|
||||
<!-- Backend de shaders -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">Backend de shaders</string>
|
||||
<string name="shader_backend_description">Elegir cómo se compilan shaders</string>
|
||||
<string name="shader_backend_glsl">Universal</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- Emulación NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">Emulación NVDEC</string>
|
||||
<string name="nvdec_emulation_description">Elegir cómo se maneja decodificación de video</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
<string name="nvdec_emulation_gpu">GPU</string>
|
||||
<string name="nvdec_emulation_none">Ninguno</string>
|
||||
|
||||
<!-- Optimizar salida SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">Optimizar salida SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">Optimiza el sombreador compilado para mejorar la eficiencia de la GPU.</string>
|
||||
<string name="never">Nunca</string>
|
||||
@@ -106,75 +147,99 @@
|
||||
<string name="always">Siempre</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">Multijugador</string>
|
||||
<string name="multiplayer_description">Crear o unirse a salas para jugar en línea</string>
|
||||
<string name="multiplayer_room_title">Sala: %1$s</string>
|
||||
<string name="multiplayer_console_id">ID de consola: %1$s</string>
|
||||
<string name="multiplayer_create_room">Crear</string>
|
||||
<string name="multiplayer_join_room">Unirse</string>
|
||||
<string name="multiplayer_username">Usuario</string>
|
||||
<string name="multiplayer_ip_address">Dirección IP</string>
|
||||
<string name="multiplayer_ip_port">Puerto</string>
|
||||
<string name="multiplayer_create_room_success">Sala creada</string>
|
||||
<string name="multiplayer_join_room_success">Unido a sala</string>
|
||||
<string name="multiplayer_create_room_failed">Error al crear sala</string>
|
||||
<string name="multiplayer_join_room_failed">Error al unirse</string>
|
||||
<string name="multiplayer_input_invalid">Dirección o nombre inválido</string>
|
||||
<string name="multiplayer_port_invalid">Puerto inválido</string>
|
||||
<string name="multiplayer_exit_room">Salir</string>
|
||||
<string name="multiplayer_network_error">Error de red</string>
|
||||
<string name="multiplayer_lost_connection">Conexión perdida</string>
|
||||
<string name="multiplayer_name_collision">Nombre duplicado</string>
|
||||
<string name="multiplayer_mac_collision">MAC duplicada</string>
|
||||
<string name="multiplayer_console_id_collision">ID de consola duplicada</string>
|
||||
<string name="multiplayer_wrong_version">Versión incorrecta</string>
|
||||
<string name="multiplayer_wrong_password">Contraseña incorrecta</string>
|
||||
<string name="multiplayer_could_not_connect">No se pudo conectar</string>
|
||||
<string name="multiplayer_room_is_full">Sala llena</string>
|
||||
<string name="multiplayer_host_banned">Host baneado</string>
|
||||
<string name="multiplayer_permission_denied">Permiso denegado</string>
|
||||
<string name="multiplayer_no_such_user">Usuario no existe</string>
|
||||
<string name="multiplayer_already_in_room">Ya en sala</string>
|
||||
<string name="multiplayer_create_room_error">Error al crear sala</string>
|
||||
<string name="multiplayer_host_kicked">Host expulsado</string>
|
||||
<string name="multiplayer_unknown_error">Error desconocido</string>
|
||||
<string name="multiplayer_room_uninitialized">Sala no inicializada</string>
|
||||
<string name="multiplayer_room_idle">Sala inactiva</string>
|
||||
<string name="multiplayer_room_joining">Uniéndose</string>
|
||||
<string name="multiplayer_room_joined">Unido</string>
|
||||
<string name="multiplayer_room_moderator">Moderador</string>
|
||||
<string name="multiplayer_member_join">%1$s se unió</string>
|
||||
<string name="multiplayer_member_leave">%1$s salió</string>
|
||||
<string name="multiplayer_member_kicked">%1$s expulsado</string>
|
||||
<string name="multiplayer_member_banned">%1$s baneado</string>
|
||||
<string name="multiplayer_address_unbanned">Dirección desbaneada</string>
|
||||
<string name="multiplayer_kick_member">Expulsar</string>
|
||||
<string name="multiplayer_chat_input_hint">Enviar mensaje...</string>
|
||||
<string name="multiplayer_password">Contraseña</string>
|
||||
<string name="original_button_text">Unirse</string>
|
||||
<string name="disabled_button_text">Uniéndose...</string>
|
||||
<string name="multiplayer_room_name">Nombre de sala</string>
|
||||
<string name="multiplayer_room_name_invalid">Nombre inválido (3-20 caracteres)</string>
|
||||
<string name="multiplayer_max_players">Máx. jugadores (16)</string>
|
||||
<string name="multiplayer_max_players_value">Máx. jugadores: %d</string>
|
||||
<string name="multiplayer_chat">Chat</string>
|
||||
<string name="multiplayer_more_options">Más opciones</string>
|
||||
<string name="multiplayer_ip_copied">IP copiada</string>
|
||||
<string name="multiplayer_server_address">Servidor</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Escribir mensaje...</string>
|
||||
<string name="send">Enviar</string>
|
||||
<string name="send_message">Enviar mensaje</string>
|
||||
<string name="multiplayer_moderation">Moderación</string>
|
||||
<string name="multiplayer_moderation_title">Lista de baneos</string>
|
||||
<string name="multiplayer_no_bans">Sin baneos</string>
|
||||
<string name="multiplayer_unban_title">Desbanear</string>
|
||||
<string name="multiplayer_unban">Desbanear</string>
|
||||
<string name="multiplayer_unban_message">¿Desbanear a %1$s?</string>
|
||||
<string name="multiplayer_ban">Banear</string>
|
||||
<string name="emulation_multiplayer">Multijugador</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="ok">Aceptar</string>
|
||||
<string name="multiplayer">چند نفره</string>
|
||||
<string name="multiplayer_description">اتاق بازی خود را میزبانی کنید یا به یک اتاق موجود بپیوندید</string>
|
||||
<string name="multiplayer_room_title">اتاق: %1$s</string>
|
||||
<string name="multiplayer_console_id">شناسه کنسول: %1$s</string>
|
||||
<string name="multiplayer_create_room">ایجاد</string>
|
||||
<string name="multiplayer_join_room">عضویت</string>
|
||||
<string name="multiplayer_public_room">مرور اتاقهای عمومی</string>
|
||||
<string name="multiplayer_username">نام کاربری</string>
|
||||
<string name="multiplayer_ip_address">آدرس IP</string>
|
||||
<string name="multiplayer_ip_port">پورت</string>
|
||||
<string name="multiplayer_create_room_success">اتاق با موفقیت ایجاد شد</string>
|
||||
<string name="multiplayer_join_room_success">با موفقیت به اتاق پیوستید</string>
|
||||
<string name="multiplayer_create_room_failed">خطا در ایجاد اتاق</string>
|
||||
<string name="multiplayer_join_room_failed">خطا در پیوستن به اتاق</string>
|
||||
<string name="multiplayer_name_invalid">نام خیلی کوتاه است</string>
|
||||
<string name="multiplayer_address_invalid">آدرس نامعتبر</string>
|
||||
<string name="multiplayer_port_invalid">پورت نامعتبر!</string>
|
||||
<string name="multiplayer_exit_room">خروج از اتاق</string>
|
||||
<string name="multiplayer_network_error">خطای شبکه</string>
|
||||
<string name="multiplayer_lost_connection">اتصال قطع شد</string>
|
||||
<string name="multiplayer_name_collision">تضاد نام</string>
|
||||
<string name="multiplayer_mac_collision">تضاد آدرس MAC</string>
|
||||
<string name="multiplayer_console_id_collision">تضاد شناسه کنسول</string>
|
||||
<string name="multiplayer_wrong_version">نسخه نادرست</string>
|
||||
<string name="multiplayer_wrong_password">رمز عبور نادرست</string>
|
||||
<string name="multiplayer_could_not_connect">اتصال برقرار نشد</string>
|
||||
<string name="multiplayer_room_is_full">اتاق پر است</string>
|
||||
<string name="multiplayer_host_banned">میزبان مسدود شده</string>
|
||||
<string name="multiplayer_permission_denied">دسترسی رد شد</string>
|
||||
<string name="multiplayer_no_such_user">کاربری وجود ندارد</string>
|
||||
<string name="multiplayer_already_in_room">قبلاً در اتاق هستید</string>
|
||||
<string name="multiplayer_create_room_error">خطا در ایجاد اتاق</string>
|
||||
<string name="multiplayer_host_kicked">میزبان اخراج شد</string>
|
||||
<string name="multiplayer_unknown_error">خطای ناشناخته</string>
|
||||
<string name="multiplayer_room_uninitialized">اتاق راهاندازی نشده</string>
|
||||
<string name="multiplayer_room_idle">اتاق بیکار</string>
|
||||
<string name="multiplayer_room_joining">در حال پیوستن...</string>
|
||||
<string name="multiplayer_room_joined">به اتاق پیوستید</string>
|
||||
<string name="multiplayer_room_moderator">ناظر اتاق</string>
|
||||
<string name="multiplayer_member_join">%1$s پیوست</string>
|
||||
<string name="multiplayer_member_leave">%1$s ترک کرد</string>
|
||||
<string name="multiplayer_member_kicked">%1$s اخراج شد</string>
|
||||
<string name="multiplayer_member_banned">%1$s مسدود شد</string>
|
||||
<string name="multiplayer_address_unbanned">آدرس آزاد شد</string>
|
||||
<string name="multiplayer_kick_member">اخراج</string>
|
||||
<string name="multiplayer_chat_input_hint">ارسال پیام...</string>
|
||||
<string name="multiplayer_password">رمز عبور</string>
|
||||
<string name="multiplayer_joining">در حال پیوستن...</string>
|
||||
<string name="multiplayer_creating">در حال ایجاد...</string>
|
||||
<string name="multiplayer_room_name">نام اتاق</string>
|
||||
<string name="multiplayer_room_name_invalid">نام اتاق باید بین 3 تا 20 کاراکتر باشد</string>
|
||||
<string name="multiplayer_max_players">حداکثر بازیکنان (16)</string>
|
||||
<string name="multiplayer_max_players_value">حداکثر بازیکنان: %d</string>
|
||||
<string name="multiplayer_chat">چت</string>
|
||||
<string name="multiplayer_more_options">گزینههای بیشتر</string>
|
||||
<string name="multiplayer_ip_copied">آدرس IP کپی شد</string>
|
||||
<string name="multiplayer_server_address">آدرس سرور</string>
|
||||
<string name="chat">چت</string>
|
||||
<string name="type_message">پیام بنویسید...</string>
|
||||
<string name="send">ارسال</string>
|
||||
<string name="send_message">ارسال پیام</string>
|
||||
<string name="multiplayer_moderation">مدیریت</string>
|
||||
<string name="multiplayer_moderation_title">لیست مسدودها</string>
|
||||
<string name="multiplayer_no_bans">کاربر مسدود شدهای وجود ندارد</string>
|
||||
<string name="multiplayer_unban_title">آزاد کردن کاربر</string>
|
||||
<string name="multiplayer_unban">آزاد کردن</string>
|
||||
<string name="multiplayer_unban_message">آیا میخواهید %1$s را آزاد کنید؟</string>
|
||||
<string name="multiplayer_ban">مسدود کردن کاربر</string>
|
||||
<string name="multiplayer_room_browser">اتاقهای عمومی</string>
|
||||
<string name="multiplayer_no_rooms_found">اتاق عمومی یافت نشد</string>
|
||||
<string name="multiplayer_password_required">رمز عبور لازم است</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">بازی</string>
|
||||
<string name="multiplayer_no_game_info">هر بازی</string>
|
||||
<string name="multiplayer_password_protected">اتاق با رمز عبور</string>
|
||||
<string name="multiplayer_hide_full_rooms">پنهان کردن اتاقهای پر</string>
|
||||
<string name="multiplayer_hide_empty_rooms">پنهان کردن اتاقهای خالی</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">برای بررسی مجدد لمس کنید</string>
|
||||
<string name="multiplayer_search_public_lobbies">جستجوی اتاقها...</string>
|
||||
<string name="emulation_multiplayer">چند نفره</string>
|
||||
<string name="multiplayer_game_name">بازیهای ترجیحی</string>
|
||||
<string name="multiplayer_preferred_game_name">بازی ترجیحی</string>
|
||||
<string name="multiplayer_no_game">بازی یافت نشد</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">برای میزبانی اتاق باید یک بازی ترجیحی انتخاب کنید</string>
|
||||
<string name="multiplayer_room_name_error">باید بین 3 تا 20 کاراکتر باشد</string>
|
||||
<string name="multiplayer_required">الزامی</string>
|
||||
<string name="multiplayer_ip_error">فرمت IP نامعتبر</string>
|
||||
<string name="multiplayer_username_error">حداقل 5 کاراکتر</string>
|
||||
<string name="multiplayer_port_error">باید بین 1 تا 65535 باشد</string>
|
||||
<string name="cancel">انصراف</string>
|
||||
<string name="ok">تایید</string>
|
||||
<string name="refresh">تازهسازی</string>
|
||||
<string name="room_list">لیست اتاقها</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Color del tema</string>
|
||||
@@ -330,11 +395,13 @@
|
||||
<string name="keys_missing_description">El firmware y los juegos no se pueden desencriptar</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Iniciar aplicaciones desde la pantalla de inicio del sistema</string>
|
||||
<string name="applets">Ejecutador de applet</string>
|
||||
<string name="applets_description">Ejecutar applets de sistema usando el firmware instalado</string>
|
||||
<string name="applets_error_firmware">Firmware no instalado</string>
|
||||
<string name="applets_error_applet">Applet no disponible</string>
|
||||
<string name="applets_error_description"><![CDATA[Asegúrese de que el archivo<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> y el <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">firmware</a> estén instalados e inténtelo de nuevo.]]></string>
|
||||
<string name="applets_error_description"><![CDATA[Asegúrese de que el archivo<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> y el <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">firmware</a> estén instalados e inténtelo de nuevo.]]></string>
|
||||
<string name="album_applet">Álbum</string>
|
||||
<string name="album_applet_description">Ver las imágenes que están en la carpeta \"screenshots\" del usuario con el visor de fotos del sistema</string>
|
||||
<string name="mii_edit_applet">Editor de Mii</string>
|
||||
@@ -366,17 +433,6 @@
|
||||
<string name="user_data_export_cancelled">Exportación cancelada</string>
|
||||
<string name="user_data_import_failed_description">Asegúrese de que las carpetas de datos de usuario estén en la raíz de la carpeta del zip y contengan un archivo config en config/config.ini e inténtelo de nuevo.</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">Early Access</string>
|
||||
<string name="early_access_benefits">Beneficios Early Access</string>
|
||||
<string name="cutting_edge_features">Características de vanguardia</string>
|
||||
<string name="early_access_updates">Acceso anticipado a las actualizaciones</string>
|
||||
<string name="no_manual_installation">Sin instalación manual</string>
|
||||
<string name="prioritized_support">Soporte prioritario</string>
|
||||
<string name="helping_game_preservation">Ayudarás a la preservación de juegos</string>
|
||||
<string name="our_eternal_gratitude">Nuestra eterna gratitud</string>
|
||||
<string name="are_you_interested">¿Estás interesado?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">Limitar velocidad</string>
|
||||
<string name="frame_limit_enable_description">Limita la velocidad de emulación a un porcentaje específico de la velocidad normal.</string>
|
||||
@@ -386,6 +442,8 @@
|
||||
<string name="cpu_accuracy">Precisión de CPU</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Nombre del dispositivo</string>
|
||||
<string name="use_docked_mode">Modo Sobremesa</string>
|
||||
<string name="use_docked_mode_description">Incrementa la resolución al coste de reducir el rendimiento. El Modo Portátil es usado cuando está desactivado, reduciendo la resolución y mejorando así el rendimiento.</string>
|
||||
<string name="emulated_region">Región emulada</string>
|
||||
@@ -396,6 +454,11 @@
|
||||
<string name="use_custom_rtc_description">Te permite tener un reloj personalizado en tiempo real diferente del tiempo del propio sistema.</string>
|
||||
<string name="set_custom_rtc">Configurar RTC personalizado</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">Token web</string>
|
||||
<string name="web_token_description">Token web utilizado para crear salas públicas. Es una cadena de 48 caracteres que solo contiene letras minúsculas a-z.</string>
|
||||
<string name="network">Red</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">Nivel de precisión</string>
|
||||
<string name="renderer_resolution">Resolución (Portátil/Sobremesa)</string>
|
||||
@@ -427,6 +490,10 @@
|
||||
<string name="renderer_debug_description">Configura la API gráfica a un modo de depuración lento.</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">Registro</string>
|
||||
<string name="flush_by_line">Vaciar registros de depuración por línea</string>
|
||||
<string name="flush_by_line_description">Vacía los registros de depuración en cada línea escrita, facilitando la depuración en casos de bloqueos o congelamientos.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">Motor de salida</string>
|
||||
<string name="audio_volume">Volumen</string>
|
||||
@@ -525,6 +592,33 @@
|
||||
<string name="system_gpu_driver">Driver GPU del sistema</string>
|
||||
<string name="installing_driver">Instalando driver...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">Obtenedor de controladores GPU</string>
|
||||
<string name="fetch">Obtener</string>
|
||||
<string name="fetch_error">Error al obtener</string>
|
||||
<string name="check_connection">Comprueba tu conexión e inténtalo de nuevo.</string>
|
||||
<string name="show_releases">Mostrar versiones</string>
|
||||
<string name="view_full_release_notes">Notas de la versión</string>
|
||||
<string name="failed_to_fetch">Error al obtener</string>
|
||||
<string name="error_during_fetch">Error durante la obtención</string>
|
||||
<string name="toggle_release_notes">Alternar notas de la versión</string>
|
||||
<string name="downloads">Descargas</string>
|
||||
<string name="show_downloads">Mostrar descargas</string>
|
||||
<string name="hide_downloads">Ocultar descargas</string>
|
||||
<string name="failed_cache_dir">Directorio de caché no disponible</string>
|
||||
<string name="empty_response_body">Respuesta vacía</string>
|
||||
<string name="successfully_installed">%1$s instalado correctamente</string>
|
||||
<string name="driver_failed_title">Error al instalar el controlador</string>
|
||||
<string name="failed_install_driver">Error al instalar el controlador %1$s, ¿tu sistema lo soporta?</string>
|
||||
<string name="driver_empty">El controlador descargado está vacío, comprueba tu conexión a Internet</string>
|
||||
<string name="downloading">Descargando…</string>
|
||||
<string name="installing">Instalando…</string>
|
||||
<string name="latest">Última</string>
|
||||
<string name="recommended_driver">Controlador recomendado:</string>
|
||||
<string name="gpu_model">Modelo de GPU:</string>
|
||||
<string name="unsupported_gpu">GPU no soportada</string>
|
||||
<string name="unsupported_gpu_warning">Tu GPU no soporta la inyección de controladores. No se recomienda configurar controladores personalizados.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">Ajustes</string>
|
||||
<string name="preferences_general">General</string>
|
||||
@@ -589,8 +683,8 @@
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Su ROM está encriptada</string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga las guías para redumpear<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">cartuchos de juegos</a> o <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">títulos instalados</a>.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Por favor, compruebe que su archivo <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> está instalado, para que los juegos sean descifrados.]]></string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga las guías para redumpear<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">cartuchos de juegos</a> o <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">títulos instalados</a>.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Por favor, compruebe que su archivo <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> está instalado, para que los juegos sean descifrados.]]></string>
|
||||
<string name="loader_error_video_core">Ocurrió un error al inicializar el núcleo de video, posiblemente debido a una incompatibilidad con el driver seleccionado</string>
|
||||
<string name="loader_error_video_core_description">Esto suele deberse a un driver de GPU incompatible. La instalación de un controlador de GPU personalizado puede resolver este problema.</string>
|
||||
<string name="loader_error_invalid_format">No se pudo cargar la ROM</string>
|
||||
@@ -769,6 +863,15 @@
|
||||
<string name="center">Centro</string>
|
||||
<string name="bottom">Abajo</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">Applets</string>
|
||||
<string name="applets_menu_description">(En desarrollo) Cambiar frontends y configuraciones de applets</string>
|
||||
|
||||
<string name="applet_hle">Frontend personalizado</string>
|
||||
<string name="applet_lle">Applet real</string>
|
||||
|
||||
<string name="swkbd_applet">Teclado de software</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">Licencias</string>
|
||||
<string name="license_fidelityfx_fsr_description">Upscaling de alta calidad de AMD</string>
|
||||
|
@@ -8,6 +8,9 @@
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(بهبودیافته)</string>
|
||||
<string name="process_ram">حافظه فرآیند: %1$d مگابایت</string>
|
||||
<string name="shaders_prefix">در حال ساخت</string>
|
||||
<string name="shaders_suffix">شیدر(ها)</string>
|
||||
<string name="system_info_label">سیستم:</string>
|
||||
<string name="show_stats_overlay">نمایش آمار عملکرد</string>
|
||||
<string name="stats_overlay_customization">سفارشیسازی</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">پایین راست</string>
|
||||
<string name="overlay_position_center_top">مرکز بالا</string>
|
||||
<string name="overlay_position_center_bottom">مرکز پایین</string>
|
||||
<string name="overlay_background">پسزمینه اورلی</string>
|
||||
<string name="overlay_background_description">افزودن پسزمینه برای خوانایی بهتر</string>
|
||||
<string name="perf_overlay_background">پسزمینه اورلی</string>
|
||||
<string name="perf_overlay_background_description">افزودن پسزمینه برای خوانایی بهتر</string>
|
||||
<string name="show_shaders_building">نمایش ساخت شیدرها</string>
|
||||
<string name="show_shaders_building_description">تعداد فعلی شیدرهای در حال ساخت را نمایش میدهد</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">نمایش اطلاعات دستگاه</string>
|
||||
<string name="enable_soc_overlay">فعالسازی نمایش اطلاعات دستگاه</string>
|
||||
<string name="soc_overlay_options">نمایش اطلاعات دستگاه</string>
|
||||
<string name="soc_overlay_options_description">تنظیم اطلاعات نمایش داده شده در نمایشگر دستگاه</string>
|
||||
|
||||
<string name="show_device_model">نمایش مدل دستگاه</string>
|
||||
<string name="show_device_model_description">نمایش مدل دستگاه میزبان</string>
|
||||
<string name="show_gpu_model">نمایش مدل GPU</string>
|
||||
<string name="show_gpu_model_description">نمایش مدل GPU میزبان</string>
|
||||
<string name="show_soc_model">نمایش مدل SoC</string>
|
||||
<string name="show_soc_model_description">نمایش مدل SoC میزبان</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">افزونههای GPU</string>
|
||||
<string name="veil_renderer">رندرر</string>
|
||||
<string name="veil_misc">متفرقه</string>
|
||||
<string name="eden_veil">پرده عدن</string>
|
||||
<string name="eden_veil_description">فراتر از پیشفرض</string>
|
||||
<string name="eden_veil_description">تنظیمات آزمایشی برای بهبود عملکرد و قابلیت. این تنظیمات ممکن است باعث نمایش صفحه سیاه یا سایر مشکلات بازی شود.</string>
|
||||
<string name="eden_veil_warning_title">تنظیمات آزمایشی</string>
|
||||
<string name="eden_veil_warning_description">تنظیمات موجود در Eden\'s Veil بسیار آزمایشی هستند و ممکن است باعث مشکلات شوند. اگر بازی شما بوت نمیشود، همه افزونهها را غیرفعال کنید و Extended Dynamic State را روی 0 تنظیم کنید.</string>
|
||||
<string name="frame_skipping">در حال توسعه: رد کردن فریمها</string>
|
||||
<string name="frame_skipping_description">با فعال کردن رد کردن فریمها، عملکرد را با کاهش تعداد فریمهای رندر شده بهبود دهید. این قابلیت در حال توسعه است و در نسخههای آینده فعال خواهد شد.</string>
|
||||
<string name="frame_interpolation">زمانبندی پیشرفته فریمها</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">فعالسازی حافظه نهان LRU</string>
|
||||
<string name="use_lru_cache_description">فعال یا غیرفعال کردن کش LRU (کمترین اخیراً استفاده شده)، که با کاهش استفاده از CPU عملکرد را افزایش میدهد. برخی بازیها با آن مشکل دارند، به ویژه TotK 1.2.1، بنابراین اگر بازی اجرا نشد یا به صورت تصادفی کرش کرد، آن را غیرفعال کنید.</string>
|
||||
<string name="dyna_state">حالت پویای گسترده</string>
|
||||
<string name="dyna_state_description">قابلیتهای ولکان را برای بهبود عملکرد، رندرینگ و صرفهجویی در منابع هنگام ایجاد خط لوله فعال میکند در حالی که مصرف CPU/GPU پایین حفظ میشود. این افزونهها ممکن است دمای دستگاه را افزایش دهند و کارتهای گرافیک سری قدیمی A6XX ممکن است واکنش مناسبی نشان ندهند. برای استفاده از فرمتهای شبیهسازی شده یوزو روی 0 تنظیم کنید</string>
|
||||
<string name="dyna_state_description">قابلیتهای ولکان را برای بهبود عملکرد، رندرینگ و صرفهجویی در منابع هنگام ایجاد خط لوله فعال میکند، در حالی که استفاده از CPU/GPU پایین نگه داشته میشود. این افزونهها ممکن است دمای دستگاه را افزایش دهند و کارتهای گرافیک سری قدیمی A6XX ممکن است به درستی کار نکنند. برای استفاده از فرمتهای شبیهسازی شده قدیمی، مقدار را روی 0 تنظیم کنید.</string>
|
||||
<string name="use_sync_core">همگامسازی سرعت هسته</string>
|
||||
<string name="use_sync_core_description">همگامسازی سرعت هسته با حداکثر درصد سرعت برای بهبود عملکرد بدون تغییر سرعت واقعی بازی.</string>
|
||||
<string name="use_auto_stub">استفاده از استاب خودکار</string>
|
||||
@@ -63,42 +86,60 @@
|
||||
<string name="descriptor_indexing_description">مدیریت بافتها و بافرها و همچنین لایه ترجمه ماکسول را بهبود میبخشد. توسط برخی کارتهای گرافیک ولکان 1.1 و تمام کارتهای گرافیک ولکان 1.2+ پشتیبانی میشود</string>
|
||||
<string name="use_fast_gpu_time">استفاده از زمان سریع GPU</string>
|
||||
<string name="use_fast_gpu_time_description">باعث میشود بیشتر بازیها با بالاترین رزولوشن اصلی اجرا شوند. این گزینه ممکن است مشکلاتی ایجاد کند.</string>
|
||||
<string name="fast_gpu_time">فاکتور اورکلاک GPU</string>
|
||||
<string name="fast_gpu_time_description">برای حداکثر عملکرد از 128 و برای حداکثر وفاداری گرافیکی از 512 استفاده کنید.</string>
|
||||
<string name="gpu_low">پایین (128)</string>
|
||||
<string name="gpu_medium">متوسط (256)</string>
|
||||
<string name="gpu_high">بالا (512)</string>
|
||||
<string name="use_fast_cpu_time">زمان CPU سریع</string>
|
||||
<string name="use_fast_cpu_time_description">CPU شبیهسازی شده را مجبور میکند با سرعت کلاک بالاتر کار کند، که برخی محدودکنندههای FPS را کاهش میدهد. این گزینه ناپایدار است و ممکن است باعث مشکلات شود و CPUهای ضعیفتر ممکن است کاهش عملکرد را تجربه کنند.</string>
|
||||
<string name="fast_cpu_time">سرعت کلاک CPU</string>
|
||||
<string name="fast_cpu_time_description">از Boost (1700MHz) برای کار با بالاترین سرعت کلاک بومی سوئیچ یا Fast (2000MHz) برای کار با دو برابر سرعت استفاده کنید.</string>
|
||||
<string name="memory_layout">چیدمان حافظه</string>
|
||||
<string name="memory_layout_description">(آزمایشی) چیدمان حافظه شبیهسازی شده را تغییر میدهد. این تنظیم عملکرد را افزایش نمیدهد، اما ممکن است به بازیهایی که از رزولوشن بالا با استفاده از مادها استفاده میکنند کمک کند. در تلفنهای با 8 گیگابایت رم یا کمتر استفاده نشود.</string>
|
||||
<string name="memory_4gb">4 گیگابایت (توصیه شده)</string>
|
||||
<string name="memory_6gb">6 گیگابایت (ناامن)</string>
|
||||
<string name="memory_8gb">8 گیگابایت (ناامن)</string>
|
||||
|
||||
<!-- روش رمزگشایی ASTC -->
|
||||
<string name="clock_base">پایه (1000MHz)</string>
|
||||
<string name="clock_boost">تقویت (1700MHz)</string>
|
||||
<string name="clock_fast">سریع (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">روش رمزگشایی ASTC</string>
|
||||
<string name="accelerate_astc_description">انتخاب کنید که بافتهای فشردهشده با ASTC چگونه برای رندرینگ رمزگشایی شوند: CPU (کند، ایمن)، GPU (سریع، توصیهشده) یا CPU Async (بدون مکث، ممکن است مشکلاتی ایجاد کند)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPU ناهمگام</string>
|
||||
|
||||
<!-- روش فشردهسازی مجدد ASTC -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">روش فشردهسازی مجدد ASTC</string>
|
||||
<string name="astc_recompression_description">انتخاب کنید که بافتهای ASTC چگونه فشردهسازی مجدد شوند تا سازگاری و عملکرد بهبود یابد. فعال کردن این گزینه VRAM را ذخیره میکند اما ممکن است کیفیت بافت را کاهش دهد.</string>
|
||||
<string name="astc_recompression_uncompressed">فشردهنشده</string>
|
||||
<string name="astc_recompression_bc1">BC1 (کیفیت پایین)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (کیفیت متوسط)</string>
|
||||
|
||||
<!-- حالت استفاده از VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">حالت استفاده از VRAM</string>
|
||||
<string name="vram_usage_mode_description">کنترل نحوه تخصیص و آزادسازی حافظه GPU</string>
|
||||
<string name="vram_usage_conservative">محافظهکارانه</string>
|
||||
<string name="vram_usage_aggressive">تهاجمی</string>
|
||||
|
||||
<!-- بکاند شیدر -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">بکاند شیدر</string>
|
||||
<string name="shader_backend_description">انتخاب روش کامپایل و ترجمه شیدرها</string>
|
||||
<string name="shader_backend_glsl">همهکاره</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- شبیهسازی NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">شبیهسازی NVDEC</string>
|
||||
<string name="nvdec_emulation_description">انتخاب روش پردازش ویدیو (NVDEC)</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
<string name="nvdec_emulation_gpu">GPU</string>
|
||||
<string name="nvdec_emulation_none">هیچکدام</string>
|
||||
|
||||
<!-- بهینهسازی خروجی SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">بهینهسازی خروجی SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">شیدر کامپایل شده را برای بهبود کارایی GPU بهینهسازی میکند.</string>
|
||||
<string name="never">هرگز</string>
|
||||
@@ -107,11 +148,12 @@
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">چندنفره</string>
|
||||
<string name="multiplayer_description">اتاق بازی بسازید یا به یکی بپیوندید</string>
|
||||
<string name="multiplayer_description">اتاق بازی خود را بسازید یا به یک اتاق موجود بپیوندید تا با دیگران بازی کنید</string>
|
||||
<string name="multiplayer_room_title">اتاق: %1$s</string>
|
||||
<string name="multiplayer_console_id">شناسه کنسول: %1$s</string>
|
||||
<string name="multiplayer_create_room">ایجاد</string>
|
||||
<string name="multiplayer_join_room">پیوستن</string>
|
||||
<string name="multiplayer_join_room">عضویت</string>
|
||||
<string name="multiplayer_public_room">مرور اتاقهای عمومی</string>
|
||||
<string name="multiplayer_username">نام کاربری</string>
|
||||
<string name="multiplayer_ip_address">آدرس IP</string>
|
||||
<string name="multiplayer_ip_port">پورت</string>
|
||||
@@ -119,62 +161,77 @@
|
||||
<string name="multiplayer_join_room_success">با موفقیت به اتاق پیوستید!</string>
|
||||
<string name="multiplayer_create_room_failed">ایجاد اتاق ناموفق بود!</string>
|
||||
<string name="multiplayer_join_room_failed">پیوستن به اتاق ناموفق بود!</string>
|
||||
<string name="multiplayer_input_invalid">آدرس نامعتبر یا نام کوتاه است!</string>
|
||||
<string name="multiplayer_port_invalid">پورت نامعتبر است!</string>
|
||||
<string name="multiplayer_exit_room">خروج از اتاق</string>
|
||||
<string name="multiplayer_network_error">خطای شبکه</string>
|
||||
<string name="multiplayer_lost_connection">اتصال قطع شد</string>
|
||||
<string name="multiplayer_name_collision">تکراری بودن نام</string>
|
||||
<string name="multiplayer_mac_collision">تکراری بودن MAC</string>
|
||||
<string name="multiplayer_console_id_collision">تکراری بودن شناسه کنسول</string>
|
||||
<string name="multiplayer_name_collision">تداخل نام</string>
|
||||
<string name="multiplayer_mac_collision">تداخل MAC</string>
|
||||
<string name="multiplayer_console_id_collision">تداخل شناسه کنسول</string>
|
||||
<string name="multiplayer_wrong_version">نسخه نادرست</string>
|
||||
<string name="multiplayer_wrong_password">رمز نادرست</string>
|
||||
<string name="multiplayer_could_not_connect">اتصال ناموفق</string>
|
||||
<string name="multiplayer_wrong_password">رمز عبور نادرست</string>
|
||||
<string name="multiplayer_could_not_connect">اتصال برقرار نشد</string>
|
||||
<string name="multiplayer_room_is_full">اتاق پر است</string>
|
||||
<string name="multiplayer_host_banned">میزبان مسدود شده</string>
|
||||
<string name="multiplayer_permission_denied">دسترسی رد شد</string>
|
||||
<string name="multiplayer_no_such_user">کاربر یافت نشد</string>
|
||||
<string name="multiplayer_no_such_user">چنین کاربری وجود ندارد</string>
|
||||
<string name="multiplayer_already_in_room">قبلاً در اتاق هستید</string>
|
||||
<string name="multiplayer_create_room_error">خطا در ایجاد اتاق</string>
|
||||
<string name="multiplayer_host_kicked">میزبان اخراج شد</string>
|
||||
<string name="multiplayer_unknown_error">خطای ناشناخته</string>
|
||||
<string name="multiplayer_room_uninitialized">اتاق راهاندازی نشده</string>
|
||||
<string name="multiplayer_room_idle">اتاق غیرفعال</string>
|
||||
<string name="multiplayer_room_joining">در حال پیوستن</string>
|
||||
<string name="multiplayer_room_joined">اتاق پیوسته</string>
|
||||
<string name="multiplayer_room_moderator">مدیر اتاق</string>
|
||||
<string name="multiplayer_member_join">%1$s پیوست</string>
|
||||
<string name="multiplayer_room_idle">اتاق بیکار</string>
|
||||
<string name="multiplayer_room_joining">در حال عضویت</string>
|
||||
<string name="multiplayer_room_joined">عضو شد</string>
|
||||
<string name="multiplayer_room_moderator">ناظر اتاق</string>
|
||||
<string name="multiplayer_member_join">%1$s عضو شد</string>
|
||||
<string name="multiplayer_member_leave">%1$s خارج شد</string>
|
||||
<string name="multiplayer_member_kicked">%1$s اخراج شد</string>
|
||||
<string name="multiplayer_member_banned">%1$s مسدود شد</string>
|
||||
<string name="multiplayer_address_unbanned">آدرس آزاد شد</string>
|
||||
<string name="multiplayer_kick_member">اخراج</string>
|
||||
<string name="multiplayer_chat_input_hint">ارسال پیام...</string>
|
||||
<string name="multiplayer_chat_input_hint">ارسال پیام…</string>
|
||||
<string name="multiplayer_password">رمز عبور</string>
|
||||
<string name="original_button_text">پیوستن</string>
|
||||
<string name="disabled_button_text">در حال پیوستن...</string>
|
||||
<string name="multiplayer_joining">در حال پیوستن...</string>
|
||||
<string name="multiplayer_room_name">نام اتاق</string>
|
||||
<string name="multiplayer_room_name_invalid">نام اتاق باید بین 3 تا 20 کاراکتر باشد</string>
|
||||
<string name="multiplayer_max_players">حداکثر بازیکنان (16)</string>
|
||||
<string name="multiplayer_max_players_value">حداکثر بازیکنان: %d</string>
|
||||
<string name="multiplayer_chat">چت</string>
|
||||
<string name="multiplayer_more_options">گزینههای بیشتر</string>
|
||||
<string name="multiplayer_ip_copied">آدرس IP کپی شد</string>
|
||||
<string name="multiplayer_ip_copied">آدرس IP در حافظه موقت کپی شد</string>
|
||||
<string name="multiplayer_server_address">آدرس سرور</string>
|
||||
<string name="chat">چت</string>
|
||||
<string name="type_message">نوشتن پیام...</string>
|
||||
<string name="type_message">پیام بنویسید…</string>
|
||||
<string name="send">ارسال</string>
|
||||
<string name="send_message">ارسال پیام</string>
|
||||
<string name="multiplayer_moderation">مدیریت</string>
|
||||
<string name="multiplayer_moderation_title">لیست مسدودها</string>
|
||||
<string name="multiplayer_no_bans">هیچ کاربر مسدود شدهای وجود ندارد</string>
|
||||
<string name="multiplayer_unban_title">آزادسازی کاربر</string>
|
||||
<string name="multiplayer_unban_title">آزاد کردن کاربر</string>
|
||||
<string name="multiplayer_unban">آزاد کردن</string>
|
||||
<string name="multiplayer_unban_message">آیا از آزاد کردن %1$s مطمئن هستید؟</string>
|
||||
<string name="multiplayer_unban_message">آیا مطمئنید که میخواهید %1$s را آزاد کنید؟</string>
|
||||
<string name="multiplayer_ban">مسدود کردن کاربر</string>
|
||||
<string name="multiplayer_room_browser">اتاقهای عمومی</string>
|
||||
<string name="multiplayer_no_rooms_found">هیچ اتاق عمومی یافت نشد</string>
|
||||
<string name="multiplayer_password_required">رمز عبور مورد نیاز است</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">بازی</string>
|
||||
<string name="multiplayer_no_game_info">هر بازی</string>
|
||||
<string name="multiplayer_password_protected">اتاق با رمز عبور محافظت شده</string>
|
||||
<string name="multiplayer_hide_full_rooms">مخفی کردن اتاقهای پر</string>
|
||||
<string name="multiplayer_hide_empty_rooms">مخفی کردن اتاقهای خالی</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">برای بررسی مجدد، تازهسازی را لمس کنید</string>
|
||||
<string name="multiplayer_search_public_lobbies">جستجوی اتاقها…</string>
|
||||
<string name="emulation_multiplayer">چندنفره</string>
|
||||
<string name="multiplayer_game_name">بازیهای ترجیحی</string>
|
||||
<string name="multiplayer_preferred_game_name">بازی ترجیحی</string>
|
||||
<string name="multiplayer_no_game">هیچ بازی یافت نشد</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">برای میزبانی اتاق باید یک بازی ترجیحی انتخاب کنید.</string>
|
||||
<string name="cancel">انصراف</string>
|
||||
<string name="ok">تایید</string>
|
||||
<string name="ok">تأیید</string>
|
||||
<string name="refresh">تازهسازی</string>
|
||||
<string name="room_list">لیست اتاقها</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">رنگ تم</string>
|
||||
@@ -328,11 +385,13 @@
|
||||
<string name="keys_missing_description">ثابتافزار و بازیهای فروشگاهی قابل رمزگشایی نیستند</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">راهاندازی برنامهها از صفحه اصلی سیستم</string>
|
||||
<string name="applets">اجراکننده برنامک</string>
|
||||
<string name="applets_description">برنامکهای سیستم را با استفاده از ثابتافزار نصب شده راه اندازی کنید</string>
|
||||
<string name="applets_error_firmware">ثابتافزار نصب نیست</string>
|
||||
<string name="applets_error_applet">برنامک در دسترس نیست</string>
|
||||
<string name="applets_error_description"><![CDATA[لطفاً مطمئن شوید که فایل <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> و <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">ثابتافزار</a> شما نصب شده است و دوباره امتحان کنید.]]></string>
|
||||
<string name="applets_error_description"><![CDATA[لطفاً مطمئن شوید که فایل <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> و <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">ثابتافزار</a> شما نصب شده است و دوباره امتحان کنید.]]></string>
|
||||
<string name="album_applet">آلبوم</string>
|
||||
<string name="album_applet_description">تصاویر ذخیره شده در پوشه اسکرین شاتهای کاربر را با نمایشگر عکس سیستم مشاهده کنید</string>
|
||||
<string name="mii_edit_applet">ویرایش Mii</string>
|
||||
@@ -364,17 +423,6 @@
|
||||
<string name="user_data_export_cancelled">صدور لغو شد</string>
|
||||
<string name="user_data_import_failed_description">مطمئن شوید که پوشههای داده کاربر در ریشه پوشه zip و حاوی یک فایل پیکربندی در config/config.ini هستند سپس دوباره امتحان کنید.</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">دسترسی زودهنگام</string>
|
||||
<string name="early_access_benefits">مزایای دسترسی زودهنگام</string>
|
||||
<string name="cutting_edge_features">ویژگیهای پیشرفته</string>
|
||||
<string name="early_access_updates">دسترسی زودهنگام به بروزرسانیها</string>
|
||||
<string name="no_manual_installation">بدون نصب دستی</string>
|
||||
<string name="prioritized_support">پشتیبانی اولویت بندی شده</string>
|
||||
<string name="helping_game_preservation">کمک به حفظ بازی</string>
|
||||
<string name="our_eternal_gratitude">سپاس ابدی ما</string>
|
||||
<string name="are_you_interested">مشتاق هستید؟</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">محدودیت سرعت</string>
|
||||
<string name="frame_limit_enable_description">سرعت شبیهسازی را به درصد مشخصی از سرعت عادی محدود میکند.</string>
|
||||
@@ -396,6 +444,11 @@
|
||||
<string name="use_custom_rtc_description">به شما امکان میدهد یک ساعت سفارشی جدا از زمان فعلی سیستم خود تنظیم کنید.</string>
|
||||
<string name="set_custom_rtc">تنظیم زمان سفارشی</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">توکن وب</string>
|
||||
<string name="web_token_description">توکن وب برای ایجاد اتاقهای عمومی استفاده میشود. این یک رشته 48 کاراکتری است که فقط شامل حروف کوچک a-z میشود.</string>
|
||||
<string name="network">شبکه</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">سطح دقت</string>
|
||||
<string name="renderer_resolution">وضوح تصویر (دستی/متصل)</string>
|
||||
@@ -427,6 +480,10 @@
|
||||
<string name="renderer_debug_description">رابط گرافیکی را روی حالت اشکالزدایی کندتر تنظیم میکند.</string>
|
||||
<string name="fastmem">دسترسی سریع حافظه</string>
|
||||
|
||||
<string name="log">ثبت وقایع</string>
|
||||
<string name="flush_by_line">خالی کردن گزارشهای اشکالزدایی خط به خط</string>
|
||||
<string name="flush_by_line_description">گزارشهای اشکالزدایی را در هر خط نوشته شده خالی میکند، که اشکالزدایی را در صورت کرش یا یخزدن آسانتر میکند.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">موتور خروجی</string>
|
||||
<string name="audio_volume">میزان</string>
|
||||
@@ -515,6 +572,7 @@
|
||||
<string name="more_options">گزینههای بیشتر</string>
|
||||
<string name="use_global_setting">استفاده از تنظیمات سراسری</string>
|
||||
<string name="operation_completed_successfully">عملیات با موفقیت به پایان رسید</string>
|
||||
|
||||
<!-- GPU driver installation -->
|
||||
<string name="select_gpu_driver">انتخاب درایور پردازنده گرافیکی</string>
|
||||
<string name="select_gpu_driver_title">آیا می خواهید درایور فعلی پردازنده گرافیکی خود را جایگزین کنید؟</string>
|
||||
@@ -526,6 +584,33 @@
|
||||
<string name="system_gpu_driver">درایور سیستم پردازنده گرافیکی</string>
|
||||
<string name="installing_driver">در حال نصب درایور...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">دریافتکننده درایور GPU</string>
|
||||
<string name="fetch">دریافت</string>
|
||||
<string name="fetch_error">خطا در دریافت</string>
|
||||
<string name="check_connection">اتصال خود را بررسی کرده و دوباره امتحان کنید.</string>
|
||||
<string name="show_releases">نمایش نسخهها</string>
|
||||
<string name="view_full_release_notes">یادداشتهای انتشار</string>
|
||||
<string name="failed_to_fetch">دریافت ناموفق</string>
|
||||
<string name="error_during_fetch">خطا در حین دریافت</string>
|
||||
<string name="toggle_release_notes">تغییر یادداشتهای انتشار</string>
|
||||
<string name="downloads">دانلودها</string>
|
||||
<string name="show_downloads">نمایش دانلودها</string>
|
||||
<string name="hide_downloads">مخفی کردن دانلودها</string>
|
||||
<string name="failed_cache_dir">پوشه کش در دسترس نیست</string>
|
||||
<string name="empty_response_body">بدنه پاسخ خالی است</string>
|
||||
<string name="successfully_installed">%1$s با موفقیت نصب شد</string>
|
||||
<string name="driver_failed_title">خطا در نصب درایور</string>
|
||||
<string name="failed_install_driver">خطا در نصب درایور %1$s، آیا سیستم شما از آن پشتیبانی میکند؟</string>
|
||||
<string name="driver_empty">درایور دانلود شده خالی است، اتصال اینترنت خود را بررسی کنید</string>
|
||||
<string name="downloading">در حال دانلود…</string>
|
||||
<string name="installing">در حال نصب…</string>
|
||||
<string name="latest">آخرین</string>
|
||||
<string name="recommended_driver">درایور توصیه شده:</string>
|
||||
<string name="gpu_model">مدل GPU:</string>
|
||||
<string name="unsupported_gpu">GPU پشتیبانی نشده</string>
|
||||
<string name="unsupported_gpu_warning">GPU شما از تزریق درایور پشتیبانی نمیکند. تنظیم درایورهای سفارشی توصیه نمیشود.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">تنظیمات</string>
|
||||
<string name="preferences_general">عمومی</string>
|
||||
@@ -589,7 +674,7 @@
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">رام شما رمزگذاری شده است</string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[لطفاً راهنماها را دنبال کنید تا <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">کارتیجهای بازی</a> یا <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">عناوین نصب شده</a> خود را استخراج کنید.]]></string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[لطفاً راهنماها را دنبال کنید تا <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">کارتیجهای بازی</a> یا <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">عناوین نصب شده</a> خود را استخراج کنید.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[لطفاً مطمئن شوید که فایل prod.keys شما نصب شده است تا بازیها رمزگشایی شوند.]]></string>
|
||||
<string name="loader_error_video_core">در راهاندازی اولیه هسته ویدیو خطایی رخ داد</string>
|
||||
<string name="loader_error_video_core_description">این مورد معمولاً توسط یک درایور گرافیکی ناسازگار ایجاد میشود. نصب درایور گرافیکی سفارشی ممکن است این مشکل را حل کند.</string>
|
||||
@@ -769,6 +854,15 @@
|
||||
<string name="center">وسط</string>
|
||||
<string name="bottom">پایین</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">برنامهکها</string>
|
||||
<string name="applets_menu_description">(در حال توسعه) تغییر فرانتاندها و تنظیمات برنامهکها</string>
|
||||
|
||||
<string name="applet_hle">فرانتاند سفارشی</string>
|
||||
<string name="applet_lle">برنامهک واقعی</string>
|
||||
|
||||
<string name="swkbd_applet">صفحه کلید نرمافزاری</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">مجوزها</string>
|
||||
<string name="license_fidelityfx_fsr_description">High-quality upscaling from AMD</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier <![CDATA[<b> prod.keys </b>]]> sur le stockage de votre appareil.<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">En savoir plus</a>]]></string>
|
||||
<string name="app_disclaimer">Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier <![CDATA[<b> prod.keys </b>]]> sur le stockage de votre appareil.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">En savoir plus</a>]]></string>
|
||||
<string name="notice_notification_channel_name">Avis et erreurs</string>
|
||||
<string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string>
|
||||
<string name="notification_permission_not_granted">Permission de notification non accordée !</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(Amélioré)</string>
|
||||
<string name="process_ram">RAM processus: %1$d Mo</string>
|
||||
<string name="shaders_prefix">Compilation</string>
|
||||
<string name="shaders_suffix">des shaders</string>
|
||||
<string name="system_info_label">Système:</string>
|
||||
<string name="show_stats_overlay">Afficher les stats de performance</string>
|
||||
<string name="stats_overlay_customization">Personnalisation</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">Bas droit</string>
|
||||
<string name="overlay_position_center_top">Centre haut</string>
|
||||
<string name="overlay_position_center_bottom">Centre bas</string>
|
||||
<string name="overlay_background">Fond overlay</string>
|
||||
<string name="overlay_background_description">Ajouter un fond pour meilleure lisibilité</string>
|
||||
<string name="perf_overlay_background">Fond overlay</string>
|
||||
<string name="perf_overlay_background_description">Ajouter un fond pour meilleure lisibilité</string>
|
||||
<string name="show_shaders_building">Afficher la construction des shaders</string>
|
||||
<string name="show_shaders_building_description">Affiche le nombre actuel de shaders en cours de construction</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Afficher l\'overlay d\'informations sur l\'appareil</string>
|
||||
<string name="enable_soc_overlay">Activer l\'overlay de l\'appareil</string>
|
||||
<string name="soc_overlay_options">Overlay de l\'appareil</string>
|
||||
<string name="soc_overlay_options_description">Configurer les informations affichées dans l\'overlay de l\'appareil</string>
|
||||
|
||||
<string name="show_device_model">Afficher le modèle de l\'appareil</string>
|
||||
<string name="show_device_model_description">Afficher le modèle de l\'appareil hôte</string>
|
||||
<string name="show_gpu_model">Afficher le modèle du GPU</string>
|
||||
<string name="show_gpu_model_description">Afficher le modèle du GPU hôte</string>
|
||||
<string name="show_soc_model">Afficher le modèle du SoC</string>
|
||||
<string name="show_soc_model_description">Afficher le modèle du SoC hôte</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">Extensions GPU</string>
|
||||
<string name="veil_renderer">Rendu</string>
|
||||
<string name="veil_misc">Divers</string>
|
||||
<string name="eden_veil">Voile d`Éden</string>
|
||||
<string name="eden_veil_description">Au-delà des paramètres par défaut</string>
|
||||
<string name="eden_veil_description">Paramètres expérimentaux pour améliorer les performances et les capacités. Ces paramètres peuvent causer des écrans noirs ou d\'autres problèmes de jeu.</string>
|
||||
<string name="eden_veil_warning_title">Paramètres expérimentaux</string>
|
||||
<string name="eden_veil_warning_description">Les paramètres contenus dans Eden\'s Veil sont hautement expérimentaux et peuvent causer des problèmes. Si votre jeu ne démarre pas, désactivez toutes les extensions et réglez Extended Dynamic State sur 0.</string>
|
||||
<string name="frame_skipping">WIP: Saut de frames</string>
|
||||
<string name="frame_skipping_description">Activez ou désactivez le saut d\'images pour améliorer les performances en réduisant le nombre d\'images affichées. Cette fonctionnalité est en cours de développement et sera activée dans les futures versions.</string>
|
||||
<string name="frame_interpolation">Synchronisation avancée des frames</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">Activer le cache LRU</string>
|
||||
<string name="use_lru_cache_description">Activez ou désactivez le cache LRU (Least Recently Used), ce qui améliore les performances en réduisant l\'utilisation du CPU. Certains jeux ont des problèmes avec, notamment TotK 1.2.1, désactivez-le donc si le jeu ne démarre pas ou plante aléatoirement.</string>
|
||||
<string name="dyna_state">État dynamique étendu</string>
|
||||
<string name="dyna_state_description">Active les fonctionnalités Vulkan pour améliorer les performances, le rendu et économiser les ressources lors de la création de pipelines tout en maintenant une faible utilisation CPU/GPU. Ces extensions peuvent augmenter la température de l`appareil, et les GPU plus anciens de la série A6XX peuvent ne pas réagir correctement. Réglez sur 0 pour utiliser les formats émulés de Yuzu.</string>
|
||||
<string name="dyna_state_description">Active les fonctionnalités Vulkan pour améliorer les performances, le rendu et économiser les ressources lors de la création du pipeline tout en maintenant une faible utilisation du CPU/GPU. Ces extensions peuvent augmenter la température de l\'appareil, et les GPU de l\'ancienne série A6XX peuvent ne pas fonctionner correctement. Réglez sur 0 pour utiliser les formats émulés hérités.</string>
|
||||
<string name="use_sync_core">Synchroniser la vitesse du cœur</string>
|
||||
<string name="use_sync_core_description">Synchronise la vitesse du cœur avec le pourcentage de vitesse maximal pour améliorer les performances sans modifier la vitesse réelle du jeu.</string>
|
||||
<string name="use_auto_stub">Utiliser le stub automatique</string>
|
||||
@@ -63,22 +86,40 @@
|
||||
<string name="descriptor_indexing_description">Améliore la gestion des textures et des tampons, ainsi que la couche de traduction Maxwell. Pris en charge par certains GPU Vulkan 1.1 et tous les GPU Vulkan 1.2+.</string>
|
||||
<string name="use_fast_gpu_time">Utiliser le temps GPU rapide</string>
|
||||
<string name="use_fast_gpu_time_description">Force la plupart des jeux à utiliser leur résolution native maximale. Cette option est expérimentale et peut causer des problèmes.</string>
|
||||
<string name="fast_gpu_time">Facteur d\'overclocking GPU</string>
|
||||
<string name="fast_gpu_time_description">Utilisez 128 pour des performances maximales et 512 pour une fidélité graphique maximale.</string>
|
||||
<string name="gpu_low">Faible (128)</string>
|
||||
<string name="gpu_medium">Moyen (256)</string>
|
||||
<string name="gpu_high">Élevé (512)</string>
|
||||
<string name="use_fast_cpu_time">Temps CPU rapide</string>
|
||||
<string name="use_fast_cpu_time_description">Force le CPU émulé à fonctionner à une fréquence plus élevée, réduisant certains limiteurs de FPS. Cette option est instable et peut causer des problèmes, et les CPU plus faibles peuvent voir une baisse de performance.</string>
|
||||
<string name="fast_cpu_time">Fréquence CPU</string>
|
||||
<string name="fast_cpu_time_description">Utilisez Boost (1700MHz) pour fonctionner à la fréquence native la plus élevée de la Switch, ou Fast (2000MHz) pour fonctionner à double fréquence.</string>
|
||||
<string name="memory_layout">Disposition de la mémoire</string>
|
||||
<string name="memory_layout_description">(EXPÉRIMENTAL) Change la disposition de la mémoire émulée. Ce paramètre n\'augmente pas les performances, mais peut aider les jeux utilisant des résolutions élevées via des mods. Ne pas utiliser sur les téléphones avec 8 Go de RAM ou moins.</string>
|
||||
<string name="memory_4gb">4 Go (Recommandé)</string>
|
||||
<string name="memory_6gb">6 Go (Dangereux)</string>
|
||||
<string name="memory_8gb">8 Go (Dangereux)</string>
|
||||
|
||||
<!-- ASTC -->
|
||||
<string name="clock_base">Base (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">Rapide (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">Méthode ASTC</string>
|
||||
<string name="accelerate_astc_description">Choisissez comment les textures compressées ASTC sont décodées pour le rendu : CPU (lent, sûr), GPU (rapide, recommandé) ou CPU Async (pas de saccades, peut causer des problèmes)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPU async</string>
|
||||
|
||||
<!-- ASTC Recompression -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">Recompression ASTC</string>
|
||||
<string name="astc_recompression_description">Choisissez comment les textures ASTC sont recompressées pour améliorer la compatibilité et les performances. Activer cette option économise la VRAM mais peut réduire la qualité des textures.</string>
|
||||
<string name="astc_recompression_uncompressed">Non compressé</string>
|
||||
<string name="astc_recompression_bc1">BC1 (basse qualité)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (qualité moyenne)</string>
|
||||
|
||||
<!-- VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">Mode VRAM</string>
|
||||
<string name="vram_usage_mode_description">Gestion de la mémoire GPU</string>
|
||||
<string name="vram_usage_conservative">Conservateur</string>
|
||||
@@ -91,14 +132,14 @@
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">Émulation NVDEC</string>
|
||||
<string name="nvdec_emulation_description">Gestion du décodage vidéo</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
<string name="nvdec_emulation_gpu">GPU</string>
|
||||
<string name="nvdec_emulation_none">Aucun</string>
|
||||
|
||||
<!-- SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">Optimiser SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">Optimise le shader compilé pour améliorer l\'efficacité du GPU.</string>
|
||||
<string name="never">Jamais</string>
|
||||
@@ -107,74 +148,98 @@
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">Multijoueur</string>
|
||||
<string name="multiplayer_description">Jouer en réseau</string>
|
||||
<string name="multiplayer_room_title">Salon: %1$s</string>
|
||||
<string name="multiplayer_console_id">ID: %1$s</string>
|
||||
<string name="multiplayer_description">Créez votre propre salon ou rejoignez-en un existant pour jouer avec d\'autres</string>
|
||||
<string name="multiplayer_room_title">Salon : %1$s</string>
|
||||
<string name="multiplayer_console_id">ID console : %1$s</string>
|
||||
<string name="multiplayer_create_room">Créer</string>
|
||||
<string name="multiplayer_join_room">Rejoindre</string>
|
||||
<string name="multiplayer_username">Pseudonyme</string>
|
||||
<string name="multiplayer_ip_address">IP</string>
|
||||
<string name="multiplayer_public_room">Parcourir les salons publics</string>
|
||||
<string name="multiplayer_username">Nom d\'utilisateur</string>
|
||||
<string name="multiplayer_ip_address">Adresse IP</string>
|
||||
<string name="multiplayer_ip_port">Port</string>
|
||||
<string name="multiplayer_create_room_success">Salon créé</string>
|
||||
<string name="multiplayer_join_room_success">Rejoint</string>
|
||||
<string name="multiplayer_create_room_failed">Échec création</string>
|
||||
<string name="multiplayer_join_room_failed">Échec connexion</string>
|
||||
<string name="multiplayer_input_invalid">IP/nom invalide</string>
|
||||
<string name="multiplayer_port_invalid">Port invalide</string>
|
||||
<string name="multiplayer_exit_room">Quitter</string>
|
||||
<string name="multiplayer_create_room_success">Salon créé avec succès</string>
|
||||
<string name="multiplayer_join_room_success">Salon rejoint avec succès</string>
|
||||
<string name="multiplayer_create_room_failed">Échec de la création du salon</string>
|
||||
<string name="multiplayer_join_room_failed">Échec de la connexion au salon</string>
|
||||
<string name="multiplayer_name_invalid">Nom trop court</string>
|
||||
<string name="multiplayer_address_invalid">Adresse invalide</string>
|
||||
<string name="multiplayer_port_invalid">Port invalide !</string>
|
||||
<string name="multiplayer_exit_room">Quitter le salon</string>
|
||||
<string name="multiplayer_network_error">Erreur réseau</string>
|
||||
<string name="multiplayer_lost_connection">Connexion perdue</string>
|
||||
<string name="multiplayer_name_collision">Nom existant</string>
|
||||
<string name="multiplayer_mac_collision">MAC existante</string>
|
||||
<string name="multiplayer_console_id_collision">ID existante</string>
|
||||
<string name="multiplayer_wrong_version">Version incorrecte</string>
|
||||
<string name="multiplayer_wrong_password">Mot de passe incorrect</string>
|
||||
<string name="multiplayer_name_collision">Conflit de noms</string>
|
||||
<string name="multiplayer_mac_collision">Conflit d\'adresse MAC</string>
|
||||
<string name="multiplayer_console_id_collision">Conflit d\'ID console</string>
|
||||
<string name="multiplayer_wrong_version">Mauvaise version</string>
|
||||
<string name="multiplayer_wrong_password">Mauvais mot de passe</string>
|
||||
<string name="multiplayer_could_not_connect">Connexion impossible</string>
|
||||
<string name="multiplayer_room_is_full">Salon plein</string>
|
||||
<string name="multiplayer_host_banned">Banni</string>
|
||||
<string name="multiplayer_host_banned">Hôte banni</string>
|
||||
<string name="multiplayer_permission_denied">Permission refusée</string>
|
||||
<string name="multiplayer_no_such_user">Utilisateur inconnu</string>
|
||||
<string name="multiplayer_already_in_room">Déjà dans salon</string>
|
||||
<string name="multiplayer_create_room_error">Erreur création</string>
|
||||
<string name="multiplayer_host_kicked">Expulsé</string>
|
||||
<string name="multiplayer_no_such_user">Utilisateur introuvable</string>
|
||||
<string name="multiplayer_already_in_room">Déjà dans le salon</string>
|
||||
<string name="multiplayer_create_room_error">Erreur de création de salon</string>
|
||||
<string name="multiplayer_host_kicked">Hôte expulsé</string>
|
||||
<string name="multiplayer_unknown_error">Erreur inconnue</string>
|
||||
<string name="multiplayer_room_uninitialized">Salon non initialisé</string>
|
||||
<string name="multiplayer_room_idle">Salon inactif</string>
|
||||
<string name="multiplayer_room_joining">Connexion...</string>
|
||||
<string name="multiplayer_room_joined">Connecté</string>
|
||||
<string name="multiplayer_room_moderator">Modérateur</string>
|
||||
<string name="multiplayer_room_joining">Connexion au salon…</string>
|
||||
<string name="multiplayer_room_joined">Salon rejoint</string>
|
||||
<string name="multiplayer_room_moderator">Modérateur du salon</string>
|
||||
<string name="multiplayer_member_join">%1$s a rejoint</string>
|
||||
<string name="multiplayer_member_leave">%1$s a quitté</string>
|
||||
<string name="multiplayer_member_kicked">%1$s expulsé</string>
|
||||
<string name="multiplayer_member_banned">%1$s banni</string>
|
||||
<string name="multiplayer_address_unbanned">Débanni</string>
|
||||
<string name="multiplayer_member_kicked">%1$s a été expulsé</string>
|
||||
<string name="multiplayer_member_banned">%1$s a été banni</string>
|
||||
<string name="multiplayer_address_unbanned">Adresse débannie</string>
|
||||
<string name="multiplayer_kick_member">Expulser</string>
|
||||
<string name="multiplayer_chat_input_hint">Message...</string>
|
||||
<string name="multiplayer_chat_input_hint">Envoyer un message…</string>
|
||||
<string name="multiplayer_password">Mot de passe</string>
|
||||
<string name="original_button_text">Rejoindre</string>
|
||||
<string name="disabled_button_text">Connexion...</string>
|
||||
<string name="multiplayer_room_name">Nom salon</string>
|
||||
<string name="multiplayer_room_name_invalid">Nom invalide (3-20 caractères)</string>
|
||||
<string name="multiplayer_joining">Connexion…</string>
|
||||
<string name="multiplayer_creating">Création…</string>
|
||||
<string name="multiplayer_room_name">Nom du salon</string>
|
||||
<string name="multiplayer_room_name_invalid">Le nom doit contenir entre 3 et 20 caractères</string>
|
||||
<string name="multiplayer_max_players">Joueurs max (16)</string>
|
||||
<string name="multiplayer_max_players_value">Joueurs max: %d</string>
|
||||
<string name="multiplayer_max_players_value">Joueurs max : %d</string>
|
||||
<string name="multiplayer_chat">Chat</string>
|
||||
<string name="multiplayer_more_options">Options</string>
|
||||
<string name="multiplayer_ip_copied">IP copiée</string>
|
||||
<string name="multiplayer_server_address">Serveur</string>
|
||||
<string name="multiplayer_more_options">Plus d\'options</string>
|
||||
<string name="multiplayer_ip_copied">Adresse IP copiée</string>
|
||||
<string name="multiplayer_server_address">Adresse du serveur</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Message...</string>
|
||||
<string name="type_message">Écrire un message…</string>
|
||||
<string name="send">Envoyer</string>
|
||||
<string name="send_message">Envoyer</string>
|
||||
<string name="send_message">Envoyer un message</string>
|
||||
<string name="multiplayer_moderation">Modération</string>
|
||||
<string name="multiplayer_moderation_title">Bannis</string>
|
||||
<string name="multiplayer_no_bans">Aucun banni</string>
|
||||
<string name="multiplayer_unban_title">Débannir</string>
|
||||
<string name="multiplayer_moderation_title">Liste des bannis</string>
|
||||
<string name="multiplayer_no_bans">Aucun utilisateur banni</string>
|
||||
<string name="multiplayer_unban_title">Débannir un utilisateur</string>
|
||||
<string name="multiplayer_unban">Débannir</string>
|
||||
<string name="multiplayer_unban_message">Débannir %1$s?</string>
|
||||
<string name="multiplayer_ban">Bannir</string>
|
||||
<string name="multiplayer_unban_message">Débannir %1$s ?</string>
|
||||
<string name="multiplayer_ban">Bannir un utilisateur</string>
|
||||
<string name="multiplayer_room_browser">Salons publics</string>
|
||||
<string name="multiplayer_no_rooms_found">Aucun salon public trouvé</string>
|
||||
<string name="multiplayer_password_required">Mot de passe requis</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">Jeu</string>
|
||||
<string name="multiplayer_no_game_info">N\'importe quel jeu</string>
|
||||
<string name="multiplayer_password_protected">Salon protégé par mot de passe</string>
|
||||
<string name="multiplayer_hide_full_rooms">Masquer les salons pleins</string>
|
||||
<string name="multiplayer_hide_empty_rooms">Masquer les salons vides</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">Toucher pour actualiser</string>
|
||||
<string name="multiplayer_search_public_lobbies">Rechercher des salons…</string>
|
||||
<string name="emulation_multiplayer">Multijoueur</string>
|
||||
<string name="multiplayer_game_name">Jeux préférés</string>
|
||||
<string name="multiplayer_preferred_game_name">Jeu préféré</string>
|
||||
<string name="multiplayer_no_game">Aucun jeu trouvé</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">Vous devez choisir un jeu préféré pour héberger un salon.</string>
|
||||
<string name="multiplayer_room_name_error">Doit contenir entre 3 et 20 caractères</string>
|
||||
<string name="multiplayer_required">Requis</string>
|
||||
<string name="multiplayer_ip_error">Format IP invalide</string>
|
||||
<string name="multiplayer_username_error">Doit contenir au moins 5 caractères</string>
|
||||
<string name="multiplayer_port_error">Doit être entre 1 et 65535</string>
|
||||
<string name="cancel">Annuler</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="refresh">Actualiser</string>
|
||||
<string name="room_list">Liste des salons</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Couleur du thème</string>
|
||||
@@ -330,11 +395,13 @@
|
||||
<string name="keys_missing_description">Le firmware et les jeux commerciaux ne peuvent pas être déchiffrés</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Lancer des applications depuis l\'écran d\'accueil du système</string>
|
||||
<string name="applets">Lanceur d\'applets</string>
|
||||
<string name="applets_description">Lancer des applets système en utilisant le firmware installé</string>
|
||||
<string name="applets_error_firmware">Firmware non installé</string>
|
||||
<string name="applets_error_applet">Applet non disponible</string>
|
||||
<string name="applets_error_description"><![CDATA[Veuillez vous assurer que le fichier <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> et le <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">firmware</a> sont installés et essayez à nouveau.]]></string>
|
||||
<string name="applets_error_description"><![CDATA[Veuillez vous assurer que le fichier <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> et le <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">firmware</a> sont installés et essayez à nouveau.]]></string>
|
||||
<string name="album_applet">Album</string>
|
||||
<string name="album_applet_description">Afficher les images stockées dans le dossier de captures d\'écran de l\'utilisateur avec le visualiseur de photos système.</string>
|
||||
<string name="mii_edit_applet">Éditeur Mii</string>
|
||||
@@ -366,17 +433,6 @@
|
||||
<string name="user_data_export_cancelled">Exportation annulée</string>
|
||||
<string name="user_data_import_failed_description">Assurez-vous que les dossiers de données utilisateur se trouvent à la racine du dossier ZIP et contiennent un fichier de configuration à config/config.ini, puis réessayez.</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">Early Access</string>
|
||||
<string name="early_access_benefits">Avantages de l\'Early Access</string>
|
||||
<string name="cutting_edge_features">Fonctionnalités de pointe</string>
|
||||
<string name="early_access_updates">Accès anticipé aux mises à jour</string>
|
||||
<string name="no_manual_installation">Pas d\'installation manuelle</string>
|
||||
<string name="prioritized_support">Assistance prioritaire</string>
|
||||
<string name="helping_game_preservation">Contribuer à la préservation des jeux</string>
|
||||
<string name="our_eternal_gratitude">Notre gratitude éternelle</string>
|
||||
<string name="are_you_interested">Es tu intéressé ?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">Limiter la vitesse</string>
|
||||
<string name="frame_limit_enable_description">Limiter la vitesse d\'émulation à un pourcentage spécifié de la vitesse normale</string>
|
||||
@@ -398,6 +454,11 @@
|
||||
<string name="use_custom_rtc_description">Vous permet de définir une horloge en temps réel personnalisée distincte de l\'heure actuelle de votre système.</string>
|
||||
<string name="set_custom_rtc">Définir l\'horloge RTC personnalisée</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">Jeton Web</string>
|
||||
<string name="web_token_description">Jeton Web utilisé pour créer des salles publiques. Il s\'agit d\'une chaîne de 48 caractères ne contenant que des lettres minuscules a-z.</string>
|
||||
<string name="network">Réseau</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">Niveau de précision</string>
|
||||
<string name="renderer_resolution">Résolution (Mode Portable/Mode TV)</string>
|
||||
@@ -429,6 +490,10 @@
|
||||
<string name="renderer_debug_description">Définit l\'API graphique en mode de débogage lent.</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">Journalisation</string>
|
||||
<string name="flush_by_line">Vider les journaux de débogage ligne par ligne</string>
|
||||
<string name="flush_by_line_description">Vide les journaux de débogage à chaque ligne écrite, facilitant le débogage en cas de plantage ou de gel.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">Moteur de sortie</string>
|
||||
<string name="audio_volume">Volume</string>
|
||||
@@ -573,7 +638,34 @@
|
||||
<string name="system_gpu_driver">Pilote du GPU du système</string>
|
||||
<string name="installing_driver">Installation du pilote...</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">Récupérateur de pilotes GPU</string>
|
||||
<string name="fetch">Récupérer</string>
|
||||
<string name="fetch_error">Erreur lors de la récupération</string>
|
||||
<string name="check_connection">Vérifiez votre connexion et réessayez.</string>
|
||||
<string name="show_releases">Afficher les versions</string>
|
||||
<string name="view_full_release_notes">Notes de version</string>
|
||||
<string name="failed_to_fetch">Échec de la récupération</string>
|
||||
<string name="error_during_fetch">Erreur lors de la récupération</string>
|
||||
<string name="toggle_release_notes">Basculer les notes de version</string>
|
||||
<string name="downloads">Téléchargements</string>
|
||||
<string name="show_downloads">Afficher les téléchargements</string>
|
||||
<string name="hide_downloads">Masquer les téléchargements</string>
|
||||
<string name="failed_cache_dir">Répertoire de cache indisponible</string>
|
||||
<string name="empty_response_body">Réponse vide</string>
|
||||
<string name="successfully_installed">%1$s installé avec succès</string>
|
||||
<string name="driver_failed_title">Échec de l\'installation du pilote</string>
|
||||
<string name="failed_install_driver">Échec de l\'installation du pilote %1$s, votre système le prend-il en charge ?</string>
|
||||
<string name="driver_empty">Le pilote téléchargé est vide, vérifiez votre connexion Internet</string>
|
||||
<string name="downloading">Téléchargement en cours…</string>
|
||||
<string name="installing">Installation en cours…</string>
|
||||
<string name="latest">Dernière</string>
|
||||
<string name="recommended_driver">Pilote recommandé :</string>
|
||||
<string name="gpu_model">Modèle GPU :</string>
|
||||
<string name="unsupported_gpu">GPU non pris en charge</string>
|
||||
<string name="unsupported_gpu_warning">Votre GPU ne prend pas en charge l\'injection de pilotes. Il n\'est pas recommandé de définir des pilotes personnalisés.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">Paramètres</string>
|
||||
<string name="preferences_general">Général</string>
|
||||
<string name="preferences_system">Système</string>
|
||||
@@ -639,8 +731,8 @@
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Votre ROM est cryptée</string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Veuillez suivre les guides pour refaire un dump de vos <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">cartouches de jeu</a> ou de vos <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">titres installés</a>.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Veuillez vous assurer que votre fichier <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> est installé pour que les jeux puissent être déchiffrés.]]></string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Veuillez suivre les guides pour refaire un dump de vos <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">cartouches de jeu</a> ou de vos <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">titres installés</a>.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Veuillez vous assurer que votre fichier <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> est installé pour que les jeux puissent être déchiffrés.]]></string>
|
||||
<string name="loader_error_video_core">Une erreur s\'est produite lors de l\'initialisation du noyau vidéo</string>
|
||||
<string name="loader_error_video_core_description">Cela est généralement dû à un pilote GPU incompatible. L\'installation d\'un pilote GPU personnalisé peut résoudre ce problème.</string>
|
||||
<string name="loader_error_invalid_format">Impossible de charger la ROM</string>
|
||||
@@ -819,6 +911,15 @@
|
||||
<string name="center">Centre</string>
|
||||
<string name="bottom">Bas</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">Applets</string>
|
||||
<string name="applets_menu_description">(En cours) Modifier les frontends et paramètres des applets</string>
|
||||
|
||||
<string name="applet_hle">Frontend personnalisé</string>
|
||||
<string name="applet_lle">Applet réel</string>
|
||||
|
||||
<string name="swkbd_applet">Clavier logiciel</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">Licences</string>
|
||||
<string name="license_fidelityfx_fsr_description">Mise à l\'échelle de haute qualité par AMD.</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.<br /><br /> לפני שאת/ה מתחיל בבקשה מצא את קובץ <![CDATA[<b>prod.keys</b>]]> על המכשיר.<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">קרא עוד</a>]]></string>
|
||||
<string name="app_disclaimer">התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.<br /><br /> לפני שאת/ה מתחיל בבקשה מצא את קובץ <![CDATA[<b>prod.keys</b>]]> על המכשיר.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">קרא עוד</a>]]></string>
|
||||
<string name="notice_notification_channel_name">התראות ותקלות</string>
|
||||
<string name="notice_notification_channel_description">מציג התראות כאשר משהו הולך לא כשורה.</string>
|
||||
<string name="notification_permission_not_granted">הרשאות התראות לא ניתנה!</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(משופר)</string>
|
||||
<string name="process_ram">זיכרון תהליך: %1$d MB</string>
|
||||
<string name="shaders_prefix">בונה</string>
|
||||
<string name="shaders_suffix">שיידר(ים)</string>
|
||||
<string name="system_info_label">מערכת:</string>
|
||||
<string name="show_stats_overlay">הצג סטטיסטיקות ביצועים</string>
|
||||
<string name="stats_overlay_customization">התאמה אישית</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">פינה תחתונה ימנית</string>
|
||||
<string name="overlay_position_center_top">מרכז עליון</string>
|
||||
<string name="overlay_position_center_bottom">מרכז תחתון</string>
|
||||
<string name="overlay_background">רקע שכבה</string>
|
||||
<string name="overlay_background_description">מוסיף רקע לשכבה לקריאה נוחה יותר</string>
|
||||
<string name="perf_overlay_background">רקע שכבה</string>
|
||||
<string name="perf_overlay_background_description">מוסיף רקע לשכבה לקריאה נוחה יותר</string>
|
||||
<string name="show_shaders_building">הצג בניית שיידרים</string>
|
||||
<string name="show_shaders_building_description">מציג את מספר השיידרים שנבנים כרגע</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">הצג מידע על המכשיר</string>
|
||||
<string name="enable_soc_overlay">הפעל הצגת מידע על המכשיר</string>
|
||||
<string name="soc_overlay_options">הצגת מידע על המכשיר</string>
|
||||
<string name="soc_overlay_options_description">הגדר אילו פרטים יוצגו בהצגת המידע על המכשיר</string>
|
||||
|
||||
<string name="show_device_model">הצג דגם מכשיר</string>
|
||||
<string name="show_device_model_description">הצג את דגם המכשיר המארח</string>
|
||||
<string name="show_gpu_model">הצג דגם GPU</string>
|
||||
<string name="show_gpu_model_description">הצג את דגם ה-GPU המארח</string>
|
||||
<string name="show_soc_model">הצג דגם SoC</string>
|
||||
<string name="show_soc_model_description">הצג את דגם ה-SoC המארח</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">הרחבות GPU</string>
|
||||
<string name="veil_renderer">רנדרר</string>
|
||||
<string name="veil_misc">שונות</string>
|
||||
<string name="eden_veil">עדן וייל</string>
|
||||
<string name="eden_veil_description">מעבר לברירת המחדל</string>
|
||||
<string name="eden_veil_description">הגדרות ניסיוניות לשיפור ביצועים ויכולות. הגדרות אלו עלולות לגרום למסכים שחורים או לבעיות אחרות במשחק.</string>
|
||||
<string name="eden_veil_warning_title">הגדרות ניסיוניות</string>
|
||||
<string name="eden_veil_warning_description">ההגדרות הכלולות ב-Eden\'s Veil הן ניסיוניות מאוד ועלולות לגרום לבעיות. אם המשחק שלך לא נטען, השבת כל הרחבות ושנה את Extended Dynamic State ל-0.</string>
|
||||
<string name="frame_skipping">בעבודה: דילוג פריימים</string>
|
||||
<string name="frame_skipping_description">החלף דילוג על פריימים כדי לשפר ביצועים על ידי הפחתת מספר הפריימים המוצגים. תכונה זו עדיין בפיתוח ותופעל בגרסאות עתידיות.</string>
|
||||
<string name="frame_interpolation">סנכרון פריימים מתקדם</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">הפעלת מטמון LRU</string>
|
||||
<string name="use_lru_cache_description">הפעל או השבת את מטמון LRU (Least Recently Used), המשפר ביצועים על ידי חיסכון בשימוש במעבד. חלק מהמשחקים נתקלים בבעיות עם זה, במיוחד TotK 1.2.1, אז השבת אם המשחק לא נטען או קורס אקראית.</string>
|
||||
<string name="dyna_state">מצב דינמי מורחב</string>
|
||||
<string name="dyna_state_description">מאפשר תכונות Vulkan לשיפור ביצועים, רינדור וחיסכון במשאבים תוך שמירה על שימוש נמוך ב-CPU/GPU. הרחבות אלו עשויות להעלות את טמפ` המכשיר, וכרטיסי מסך מסדרת A6XX הישנים יותר עשויים לא להגיב כראוי. הגדר ל-0 כדי להשתמש בפורמטים המדומים של Yuzu.</string>
|
||||
<string name="dyna_state_description">מאפשר תכונות Vulkan לשיפור ביצועים, רינדור וחיסכון במשאבים בעת יצירת צינור עיבוד תוך שמירה על שימוש נמוך ב-CPU/GPU. הרחבות אלו עשויות להעלות את טמפרטורת המכשיר, וייתכן שכרטיסי מסך מסדרת A6XX הישנה לא יגיבו כראוי. הגדר ל-0 כדי להשתמש בפורמטים מדומים מיושנים.</string>
|
||||
<string name="use_sync_core">סנכרון מהירות ליבה</string>
|
||||
<string name="use_sync_core_description">סנכרן את מהירות הליבה לאחוז המהירות המרבי כדי לשפר ביצועים מבלי לשנות את מהירות המשחק בפועל.</string>
|
||||
<string name="use_auto_stub">שימוש ב-Auto Stub</string>
|
||||
@@ -64,41 +87,60 @@
|
||||
<string name="use_fast_gpu_time">השתמש בזמן GPU מהיר</string>
|
||||
<string name="use_fast_gpu_time_description">מאלץ את רוב המשחקים לרוץ ברזולוציה המקורית הגבוהה ביותר שלהם. אפשרות זו עלולה לגרום לבעיות.</string>
|
||||
|
||||
<!-- שיטת פענוח ASTC -->
|
||||
<string name="fast_gpu_time">גורם אובר-קלוק ל-GPU</string>
|
||||
<string name="fast_gpu_time_description">השתמש ב-128 לביצועים מקסימליים וב-512 לנאמנות גרפית מקסימלית.</string>
|
||||
<string name="gpu_low">נמוך (128)</string>
|
||||
<string name="gpu_medium">בינוני (256)</string>
|
||||
<string name="gpu_high">גבוה (512)</string>
|
||||
<string name="use_fast_cpu_time">זמן CPU מהיר</string>
|
||||
<string name="use_fast_cpu_time_description">מכריח את ה-CPU המדומה לפעול במהירות שעון גבוהה יותר, מה שמפחית חלק ממגבילי ה-FPS. אפשרות זו אינה יציבה ועלולה לגרום לבעיות, ומעבדים חלשים יותר עשויים לראות ירידה בביצועים.</string>
|
||||
<string name="fast_cpu_time">מהירות שעון CPU</string>
|
||||
<string name="fast_cpu_time_description">השתמש ב-Boost (1700MHz) כדי לפעול במהירות השעון הגבוהה ביותר של ה-Switch, או Fast (2000MHz) כדי לפעול במהירות כפולה.</string>
|
||||
<string name="memory_layout">מבנה זיכרון</string>
|
||||
<string name="memory_layout_description">(ניסיוני) שנה את מבנה הזיכרון המדומה. הגדרה זו לא תגדיל את הביצועים, אך עשויה לעזור במשחקים המשתמשים ברזולוציות גבוהות באמצעות מודים. אל תשתמש בטלפונים עם 8GB זיכרון RAM או פחות.</string>
|
||||
<string name="memory_4gb">4GB (מומלץ)</string>
|
||||
<string name="memory_6gb">6GB (לא בטוח)</string>
|
||||
<string name="memory_8gb">8GB (לא בטוח)</string>
|
||||
|
||||
<string name="clock_base">בסיס (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">מהיר (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">שיטת פענוח ASTC</string>
|
||||
<string name="accelerate_astc_description">בחר כיצד לפרק את הטקסטורות הדחוסות ב-ASTC עבור רינדור: CPU (איטי, בטוח), GPU (מהיר, מומלץ) או CPU Async (ללא קפיצות, עלול לגרום לבעיות)</string>
|
||||
<string name="accelerate_astc_cpu">מעבד</string>
|
||||
<string name="accelerate_astc_gpu">כרטיס מסך</string>
|
||||
<string name="accelerate_astc_async">מעבד (א-סינכרוני)</string>
|
||||
|
||||
<!-- שיטת דחיסת ASTC מחדש -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">שיטת דחיסת ASTC</string>
|
||||
<string name="astc_recompression_description">בחר כיצד דחיסה מחדש של טקסטורות ASTC משפרת תאימות וביצועים. הפעלת אפשרות זו חוסכת VRAM אך עלולה להוריד את איכות הטקסטורה.</string>
|
||||
<string name="astc_recompression_uncompressed">לא דחוס</string>
|
||||
<string name="astc_recompression_bc1">BC1 (איכות נמוכה)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (איכות בינונית)</string>
|
||||
|
||||
<!-- מצב שימוש ב-VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">מצב שימוש ב-VRAM</string>
|
||||
<string name="vram_usage_mode_description">שליטה בקצב הקצאת ושחרור זיכרון GPU</string>
|
||||
<string name="vram_usage_conservative">שמרני</string>
|
||||
<string name="vram_usage_aggressive">אגרסיבי</string>
|
||||
|
||||
<!-- מנוע שיידרים -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">מנוע שיידרים</string>
|
||||
<string name="shader_backend_description">בחר כיצד לקמפל שיידרים</string>
|
||||
<string name="shader_backend_glsl">אוניברסלי</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- אמולציית NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">אמולציית NVDEC</string>
|
||||
<string name="nvdec_emulation_description">בחר כיצד לטפל בפענוח וידאו</string>
|
||||
<string name="nvdec_emulation_cpu">מעבד</string>
|
||||
<string name="nvdec_emulation_gpu">כרטיס מסך</string>
|
||||
<string name="nvdec_emulation_none">ללא</string>
|
||||
|
||||
<!-- אופטימיזציית SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">אופטימיזציית SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">משפר את השאדר המהודר כדי להגביר את יעילות ה-GPU.</string>
|
||||
<string name="never">לעולם לא</string>
|
||||
@@ -106,75 +148,99 @@
|
||||
<string name="always">תמיד</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">מרובה משתתפים</string>
|
||||
<string name="multiplayer_description">ארח או הצטרף לחדר משחק</string>
|
||||
<string name="multiplayer">רב־משתתפים</string>
|
||||
<string name="multiplayer_description">ארח חדר משחק משלך או הצטרף לחדר קיים כדי לשחק עם אנשים</string>
|
||||
<string name="multiplayer_room_title">חדר: %1$s</string>
|
||||
<string name="multiplayer_console_id">מזהה קונסולה: %1$s</string>
|
||||
<string name="multiplayer_create_room">צור</string>
|
||||
<string name="multiplayer_join_room">הצטרף</string>
|
||||
<string name="multiplayer_public_room">עיין בחדרים ציבוריים</string>
|
||||
<string name="multiplayer_username">שם משתמש</string>
|
||||
<string name="multiplayer_ip_address">כתובת IP</string>
|
||||
<string name="multiplayer_ip_port">פורט</string>
|
||||
<string name="multiplayer_create_room_success">החדר נוצר בהצלחה!</string>
|
||||
<string name="multiplayer_join_room_success">הצטרפת לחדר בהצלחה!</string>
|
||||
<string name="multiplayer_create_room_failed">יצירת חדר נכשלה!</string>
|
||||
<string name="multiplayer_join_room_failed">הצטרפות לחדר נכשלה!</string>
|
||||
<string name="multiplayer_input_invalid">כתובת לא תקינה או שם קצר מדי!</string>
|
||||
<string name="multiplayer_create_room_success">החדר נוצר בהצלחה</string>
|
||||
<string name="multiplayer_join_room_success">הצטרפת לחדר בהצלחה</string>
|
||||
<string name="multiplayer_create_room_failed">יצירת חדר נכשלה</string>
|
||||
<string name="multiplayer_join_room_failed">הצטרפות לחדר נכשלה</string>
|
||||
<string name="multiplayer_name_invalid">השם קצר מדי</string>
|
||||
<string name="multiplayer_address_invalid">כתובת לא תקינה</string>
|
||||
<string name="multiplayer_port_invalid">פורט לא תקין!</string>
|
||||
<string name="multiplayer_exit_room">צא מהחדר</string>
|
||||
<string name="multiplayer_network_error">שגיאת רשת</string>
|
||||
<string name="multiplayer_lost_connection">החיבור אבד</string>
|
||||
<string name="multiplayer_name_collision">שם תפוס</string>
|
||||
<string name="multiplayer_mac_collision">MAC תפוס</string>
|
||||
<string name="multiplayer_console_id_collision">מזהה קונסולה תפוס</string>
|
||||
<string name="multiplayer_wrong_version">גרסה לא תואמת</string>
|
||||
<string name="multiplayer_wrong_password">סיסמה שגויה</string>
|
||||
<string name="multiplayer_name_collision">שם כבר קיים</string>
|
||||
<string name="multiplayer_mac_collision">כתובת MAC כבר קיימת</string>
|
||||
<string name="multiplayer_console_id_collision">מזהה קונסולה כבר קיים</string>
|
||||
<string name="multiplayer_wrong_version">גרסה לא נכונה</string>
|
||||
<string name="multiplayer_wrong_password">סיסמה לא נכונה</string>
|
||||
<string name="multiplayer_could_not_connect">לא ניתן להתחבר</string>
|
||||
<string name="multiplayer_room_is_full">החדר מלא</string>
|
||||
<string name="multiplayer_host_banned">מארח חסום</string>
|
||||
<string name="multiplayer_permission_denied">הרשאה נדחתה</string>
|
||||
<string name="multiplayer_no_such_user">משתמש לא קיים</string>
|
||||
<string name="multiplayer_no_such_user">אין משתמש כזה</string>
|
||||
<string name="multiplayer_already_in_room">כבר בחדר</string>
|
||||
<string name="multiplayer_create_room_error">שגיאה ביצירת חדר</string>
|
||||
<string name="multiplayer_host_kicked">מארח הוסר</string>
|
||||
<string name="multiplayer_unknown_error">שגיאה לא ידועה</string>
|
||||
<string name="multiplayer_room_uninitialized">חדר לא מאותחל</string>
|
||||
<string name="multiplayer_room_idle">חדר במצב המתנה</string>
|
||||
<string name="multiplayer_room_joining">מצטרף לחדר</string>
|
||||
<string name="multiplayer_room_joined">הצטרף לחדר</string>
|
||||
<string name="multiplayer_room_idle">חדר לא פעיל</string>
|
||||
<string name="multiplayer_room_joining">מצטרף לחדר...</string>
|
||||
<string name="multiplayer_room_joined">הצטרפת לחדר</string>
|
||||
<string name="multiplayer_room_moderator">מנהל חדר</string>
|
||||
<string name="multiplayer_member_join">%1$s הצטרף</string>
|
||||
<string name="multiplayer_member_leave">%1$s עזב</string>
|
||||
<string name="multiplayer_member_kicked">%1$s הוסר</string>
|
||||
<string name="multiplayer_member_banned">%1$s חסום</string>
|
||||
<string name="multiplayer_address_unbanned">כתובת שוחררה מחסימה</string>
|
||||
<string name="multiplayer_kick_member">הסר משתמש</string>
|
||||
<string name="multiplayer_member_banned">%1$s נחסם</string>
|
||||
<string name="multiplayer_address_unbanned">כתובת שוחררה</string>
|
||||
<string name="multiplayer_kick_member">הסר</string>
|
||||
<string name="multiplayer_chat_input_hint">שלח הודעה...</string>
|
||||
<string name="multiplayer_password">סיסמה</string>
|
||||
<string name="original_button_text">הצטרף</string>
|
||||
<string name="disabled_button_text">מצטרף...</string>
|
||||
<string name="multiplayer_joining">מצטרף...</string>
|
||||
<string name="multiplayer_creating">יוצר...</string>
|
||||
<string name="multiplayer_room_name">שם חדר</string>
|
||||
<string name="multiplayer_room_name_invalid">שם חדר חייב להיות בין 3-20 תווים</string>
|
||||
<string name="multiplayer_max_players">משתמשים מרביים (16)</string>
|
||||
<string name="multiplayer_max_players_value">משתמשים מרביים: %d</string>
|
||||
<string name="multiplayer_max_players">מקסימום שחקנים (16)</string>
|
||||
<string name="multiplayer_max_players_value">מקסימום שחקנים: %d</string>
|
||||
<string name="multiplayer_chat">צ\'אט</string>
|
||||
<string name="multiplayer_more_options">אפשרויות נוספות</string>
|
||||
<string name="multiplayer_ip_copied">כתובת IP הועתקה</string>
|
||||
<string name="multiplayer_server_address">כתובת שרת</string>
|
||||
<string name="multiplayer_ip_copied">כתובת IP הועתקה ללוח</string>
|
||||
<string name="multiplayer_server_address">כתובת השרת</string>
|
||||
<string name="chat">צ\'אט</string>
|
||||
<string name="type_message">הקלד הודעה...</string>
|
||||
<string name="type_message">הקלד הודעה…</string>
|
||||
<string name="send">שלח</string>
|
||||
<string name="send_message">שלח הודעה</string>
|
||||
<string name="multiplayer_moderation">ניהול</string>
|
||||
<string name="multiplayer_moderation_title">רשימת חסומים</string>
|
||||
<string name="multiplayer_no_bans">אין משתמשים חסומים</string>
|
||||
<string name="multiplayer_unban_title">שחרור חסימה</string>
|
||||
<string name="multiplayer_unban_title">שחרור משתמש</string>
|
||||
<string name="multiplayer_unban">שחרר</string>
|
||||
<string name="multiplayer_unban_message">לשחרר את %1$s מחסימה?</string>
|
||||
<string name="multiplayer_unban_message">האם לשחרר את %1$s?</string>
|
||||
<string name="multiplayer_ban">חסום משתמש</string>
|
||||
<string name="emulation_multiplayer">מרובה משתתפים</string>
|
||||
<string name="multiplayer_room_browser">חדרים ציבוריים</string>
|
||||
<string name="multiplayer_no_rooms_found">לא נמצאו חדרים ציבוריים</string>
|
||||
<string name="multiplayer_password_required">נדרשת סיסמה</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">משחק</string>
|
||||
<string name="multiplayer_no_game_info">כל משחק</string>
|
||||
<string name="multiplayer_password_protected">חדר עם סיסמה</string>
|
||||
<string name="multiplayer_hide_full_rooms">הסתר חדרים מלאים</string>
|
||||
<string name="multiplayer_hide_empty_rooms">הסתר חדרים ריקים</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">הקש לרענון לבדיקה מחדש</string>
|
||||
<string name="multiplayer_search_public_lobbies">חפש חדרים...</string>
|
||||
<string name="emulation_multiplayer">רב־משתתפים</string>
|
||||
<string name="multiplayer_game_name">משחקים מועדפים</string>
|
||||
<string name="multiplayer_preferred_game_name">משחק מועדף</string>
|
||||
<string name="multiplayer_no_game">לא נמצאו משחקים</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">עליך לבחור משחק מועדף לאירוח חדר</string>
|
||||
<string name="multiplayer_room_name_error">חייב להיות בין 3-20 תווים</string>
|
||||
<string name="multiplayer_required">נדרש</string>
|
||||
<string name="multiplayer_ip_error">פורמט IP לא תקין</string>
|
||||
<string name="multiplayer_username_error">לפחות 5 תווים</string>
|
||||
<string name="multiplayer_port_error">חייב להיות בין 1-65535</string>
|
||||
<string name="cancel">ביטול</string>
|
||||
<string name="ok">אישור</string>
|
||||
<string name="refresh">רענון</string>
|
||||
<string name="room_list">רשימת חדרים</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">צבע ערכת עיצוב</string>
|
||||
@@ -315,11 +381,13 @@
|
||||
<string name="game_folder_properties">מאפייני תיקיית משחקים</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">הפעלת יישומים ממסך הבית של המערכת</string>
|
||||
<string name="applets">משגר Applet</string>
|
||||
<string name="applets_description">מערכת שיגור Applet משתמשת בתוכנה המותקנת</string>
|
||||
<string name="applets_error_firmware">ה Firmware לא מותקן</string>
|
||||
<string name="applets_error_applet">Applet לא זמין</string>
|
||||
<string name="applets_error_description"><![CDATA[בבקשה וודא שקבצי ה - <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a>ו <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">firmware</a>שלך מותקנים ונסה שוב.]]></string>
|
||||
<string name="applets_error_description"><![CDATA[בבקשה וודא שקבצי ה - <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a>ו <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">firmware</a>שלך מותקנים ונסה שוב.]]></string>
|
||||
<string name="album_applet">אלבום</string>
|
||||
<string name="album_applet_description">צפה בתמונות השמורות בתיקיית צילומי המסך של המשתמש בעזרת מציג התמונות של המערכת</string>
|
||||
<string name="mii_edit_applet">עורך Mii</string>
|
||||
@@ -351,17 +419,6 @@
|
||||
<string name="user_data_export_cancelled">ייצוא בוטל</string>
|
||||
<string name="user_data_import_failed_description">ודא שנתוני המשתמש נמצאים בשורש קובץ ה zip ושהוא מכיל קובץ סידור ב config/config.ini ונסה שוב.</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">גישה מוקדמת</string>
|
||||
<string name="early_access_benefits">יתרונות של גישה מקודמת</string>
|
||||
<string name="cutting_edge_features">תכונות חותכות קצה</string>
|
||||
<string name="early_access_updates">גישה מוקדמת לעדכונים</string>
|
||||
<string name="no_manual_installation">ללא התקנה ידנית</string>
|
||||
<string name="prioritized_support">תמיכה בעדיפות</string>
|
||||
<string name="helping_game_preservation">עוזר בשמירת משחקים</string>
|
||||
<string name="our_eternal_gratitude">התודה האינסופית שלנו</string>
|
||||
<string name="are_you_interested">אתה מעוניין?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">הגבל מהירות</string>
|
||||
<string name="frame_limit_enable_description">מגביל את מהירות האמולציה לאחוז מהירות המבוקש מהמהירות הרגילה.</string>
|
||||
@@ -371,6 +428,8 @@
|
||||
<string name="cpu_accuracy">דיוק המעבד</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">שם מכשיר</string>
|
||||
<string name="use_docked_mode">מצב עגינה</string>
|
||||
<string name="use_docked_mode_description">מעלה את הרזולוציה, פוגע בביצועים. משתמש במצב נייד כאשר מנוטרל, מפחית את הרזולוציה ומעלה את הביצועים.</string>
|
||||
<string name="emulated_region">אזור אמולציה</string>
|
||||
@@ -381,6 +440,11 @@
|
||||
<string name="use_custom_rtc_description">מאפשר לך לקבוע שעון זמן אמת נפרד משעון המערכת שלך.</string>
|
||||
<string name="set_custom_rtc">קבע RTC מותאם אישית</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">אסימון אינטרנט</string>
|
||||
<string name="web_token_description">אסימון אינטרנט המשמש ליצירת חדרים ציבוריים. זהו מחרוזת של 48 תווים המכילה רק אותיות קטנות a-z.</string>
|
||||
<string name="network">רשת</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">רמת דיוק</string>
|
||||
<string name="renderer_resolution">רזולוציה (מעוגן/נייד)</string>
|
||||
@@ -407,6 +471,10 @@
|
||||
<string name="renderer_debug_description">קובע את ממשק התוכנה של הגרפיקות למצב דיבאגינג איטי.</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">רישום</string>
|
||||
<string name="flush_by_line">רוקן יומני ניפוי שגיאות לפי שורה</string>
|
||||
<string name="flush_by_line_description">מרוקן יומני ניפוי שגיאות בכל שורה שנכתבת, מה שמקל על ניפוי שגיאות במקרים של קריסה או קיפאון.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">מנוע פלט</string>
|
||||
<string name="audio_volume">עוצמת שמע</string>
|
||||
@@ -482,6 +550,33 @@
|
||||
<string name="system_gpu_driver">דרייבר של המעבד הגרפי של המערכת</string>
|
||||
<string name="installing_driver">מתקין דרייבר...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">מאחזר מנהלי התקן GPU</string>
|
||||
<string name="fetch">אחזר</string>
|
||||
<string name="fetch_error">שגיאה במהלך האחזור</string>
|
||||
<string name="check_connection">בדוק את החיבור שלך ונסה שוב.</string>
|
||||
<string name="show_releases">הצג גרסאות</string>
|
||||
<string name="view_full_release_notes">הערות גרסה</string>
|
||||
<string name="failed_to_fetch">אחזור נכשל</string>
|
||||
<string name="error_during_fetch">שגיאה במהלך האחזור</string>
|
||||
<string name="toggle_release_notes">החלף הערות גרסה</string>
|
||||
<string name="downloads">הורדות</string>
|
||||
<string name="show_downloads">הצג הורדות</string>
|
||||
<string name="hide_downloads">הסתר הורדות</string>
|
||||
<string name="failed_cache_dir">תיקיית מטמון לא זמינה</string>
|
||||
<string name="empty_response_body">גוף תגובה ריק</string>
|
||||
<string name="successfully_installed">%1$s הותקן בהצלחה</string>
|
||||
<string name="driver_failed_title">התקנת מנהל התקן נכשלה</string>
|
||||
<string name="failed_install_driver">התקנת מנהל התקן %1$s נכשלה, האם המערכת שלך תומכת בו?</string>
|
||||
<string name="driver_empty">מנהל ההתקן שהורד ריק, בדוק את החיבור לאינטרנט</string>
|
||||
<string name="downloading">מוריד…</string>
|
||||
<string name="installing">מתקין…</string>
|
||||
<string name="latest">האחרון</string>
|
||||
<string name="recommended_driver">מנהל התקן מומלץ:</string>
|
||||
<string name="gpu_model">דגם GPU:</string>
|
||||
<string name="unsupported_gpu">GPU לא נתמך</string>
|
||||
<string name="unsupported_gpu_warning">ה-GPU שלך אינו תומך בהזרקת מנהל התקן. לא מומלץ להגדיר מנהלי התקן מותאמים אישית.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">הגדרות</string>
|
||||
<string name="preferences_general">כללי</string>
|
||||
@@ -504,8 +599,8 @@
|
||||
<string name="verify_success">אימות התקינות הצליח!</string>
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">המשחק שלך מוצפן</string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[אנא עקוב אחרי המדריכים כדי לבצע redump של <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">כרטיסי המשחק</a>או <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">הכותרות המותקנות</a> שלך.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[אנא וודא שקובץ ה-<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> מותקן כך שניתן יהיה לפענח משחקים.]]></string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[אנא עקוב אחרי המדריכים כדי לבצע redump של <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">כרטיסי המשחק</a>או <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">הכותרות המותקנות</a> שלך.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[אנא וודא שקובץ ה-<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> מותקן כך שניתן יהיה לפענח משחקים.]]></string>
|
||||
<string name="loader_error_video_core">התרחשה בעיה באתחול של ליבת הווידאו</string>
|
||||
<string name="loader_error_video_core_description">זה בדרך כלל נגרם על ידי דרייבר לא מתאים עבור המעבד הגרפי. התקנת דרייבר אשר מתאים למעבד הגרפי יכול לפתור את הבעיה הזו.</string>
|
||||
<string name="loader_error_invalid_format">אין אפשרות לטעון את המשחק</string>
|
||||
@@ -667,6 +762,15 @@
|
||||
<string name="mute">השתק</string>
|
||||
<string name="unmute">בטל השתקה</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">אפלטים</string>
|
||||
<string name="applets_menu_description">(בעבודה) שנה את ממשקי המשתמש וההגדרות של האפלטים</string>
|
||||
|
||||
<string name="applet_hle">ממשק מותאם אישית</string>
|
||||
<string name="applet_lle">אפלט אמיתי</string>
|
||||
|
||||
<string name="swkbd_applet">מקלדת תוכנה</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">רישיונות</string>
|
||||
<string name="license_fidelityfx_fsr_description">אפסקיילינג באיכות גבוהה מ AMD</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .<br /><br />Mielőtt hozzákezdenél, kérjük, válaszd ki a <![CDATA[<b>prod.keys</b>]]> fájl helyét a készülék tárhelyén<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Tudj meg többet</a>]]></string>
|
||||
<string name="app_disclaimer">Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .<br /><br />Mielőtt hozzákezdenél, kérjük, válaszd ki a <![CDATA[<b>prod.keys</b>]]> fájl helyét a készülék tárhelyén<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Tudj meg többet</a>]]></string>
|
||||
<string name="notice_notification_channel_name">Megjegyzések és hibák</string>
|
||||
<string name="notice_notification_channel_description">Értesítések megjelenítése, ha valami rosszul sül el.</string>
|
||||
<string name="notification_permission_not_granted">Nincs engedély az értesítés megjelenítéséhez!</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(Továbbfejlesztett)</string>
|
||||
<string name="process_ram">Processz RAM: %1$d MB</string>
|
||||
<string name="shaders_prefix">Shader(ek)</string>
|
||||
<string name="shaders_suffix">fordítása</string>
|
||||
<string name="system_info_label">Rendszer:</string>
|
||||
<string name="show_stats_overlay">Teljesítmény statisztikák megjelenítése</string>
|
||||
<string name="stats_overlay_customization">Testreszabás</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">Jobb lent</string>
|
||||
<string name="overlay_position_center_top">Középen fent</string>
|
||||
<string name="overlay_position_center_bottom">Középen lent</string>
|
||||
<string name="overlay_background">Overlay háttér</string>
|
||||
<string name="overlay_background_description">Háttér hozzáadása az overlayhez</string>
|
||||
<string name="perf_overlay_background">Overlay háttér</string>
|
||||
<string name="perf_overlay_background_description">Háttér hozzáadása az overlayhez</string>
|
||||
<string name="show_shaders_building">Shader-építés megjelenítése</string>
|
||||
<string name="show_shaders_building_description">Megjeleníti az éppen épülő shaderek aktuális számát</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Eszköz információk megjelenítése</string>
|
||||
<string name="enable_soc_overlay">Eszköz információk bekapcsolása</string>
|
||||
<string name="soc_overlay_options">Eszköz információk</string>
|
||||
<string name="soc_overlay_options_description">Állítsd be, milyen információk jelenjenek meg az eszköz információiban</string>
|
||||
|
||||
<string name="show_device_model">Eszköz modell megjelenítése</string>
|
||||
<string name="show_device_model_description">A gazdaeszköz modelljének megjelenítése</string>
|
||||
<string name="show_gpu_model">GPU modell megjelenítése</string>
|
||||
<string name="show_gpu_model_description">A gazda GPU modelljének megjelenítése</string>
|
||||
<string name="show_soc_model">SoC modell megjelenítése</string>
|
||||
<string name="show_soc_model_description">A gazda SoC modelljének megjelenítése</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">GPU kiterjesztések</string>
|
||||
<string name="veil_renderer">Megjelenítő</string>
|
||||
<string name="veil_misc">Egyéb</string>
|
||||
<string name="eden_veil">Eden Fátyla</string>
|
||||
<string name="eden_veil_description">Az alapértelmezett túl</string>
|
||||
<string name="eden_veil_description">Kísérleti beállítások a teljesítmény és képesség javításához. Ezek a beállítások fekete képernyőket vagy más játékproblémákat okozhatnak.</string>
|
||||
<string name="eden_veil_warning_title">Kísérleti beállítások</string>
|
||||
<string name="eden_veil_warning_description">Az Eden\'s Veil-ben található beállítások nagyon kísérletiek és problémákat okozhatnak. Ha a játékod nem indul, tiltsd le az összes kiterjesztést és állítsd az Extended Dynamic State értékét 0-ra.</string>
|
||||
<string name="frame_skipping">Folyamatban: Képkihagyás</string>
|
||||
<string name="frame_skipping_description">Kapcsolja be a képkihagyást a teljesítmény javításához a renderelt képkockák számának csökkentésével. Ez a funkció még fejlesztés alatt áll, és a jövőbeli kiadásokban lesz elérhető.</string>
|
||||
<string name="frame_interpolation">Továbbfejlesztett Képkocka-időzítés</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">LRU gyorsítótár engedélyezése</string>
|
||||
<string name="use_lru_cache_description">Engedélyezze vagy tiltsa le az LRU gyorsítótárat (Least Recently Used), amely a CPU használatának csökkentésével növeli a teljesítményt. Néhány játékkal problémák adódhatnak, különösen a TotK 1.2.1 esetében, ezért tiltsa le, ha a játék nem indul el vagy véletlenszerűen összeomlik.</string>
|
||||
<string name="dyna_state">Kiterjesztett Dinamikus Állapot</string>
|
||||
<string name="dyna_state_description">Engedélyezi a Vulkan funkciókat a teljesítmény, a renderelés javításához és erőforrások megtakarításához a pipeline létrehozásánál, miközben alacsony CPU/GPU használatot tart fenn. Ezek a kiterjesztések növelhetik az eszköz hőmérsékletét, és a régebbi A6XX sorozatú GPU-k nem feltétlenül reagálnak megfelelően. Állítsa 0-ra a Yuzu által emulált formátumok használatához.</string>
|
||||
<string name="dyna_state_description">Engedélyezi a Vulkan funkciókat a teljesítmény javításához, a rendereléshez és az erőforrások megtakarításához a pipeline létrehozása során, miközben alacsony CPU/GPU kihasználtságot tart fenn. Ezek a kiterjesztések növelhetik az eszköz hőmérsékletét, és a régebbi A6XX sorozatú GPU-k nem feltétlenül működnek megfelelően. Állítsd 0-ra a régi emulált formátumok használatához.</string>
|
||||
<string name="use_sync_core">Magsebesség szinkronizálása</string>
|
||||
<string name="use_sync_core_description">A mag sebességének szinkronizálása a maximális sebesség százalékával a teljesítmény javítása érdekében a játék tényleges sebességének megváltoztatása nélkül.</string>
|
||||
<string name="use_auto_stub">Automatikus Stub használata</string>
|
||||
@@ -63,22 +86,40 @@
|
||||
<string name="descriptor_indexing_description">Javítja a textúrák és pufferek kezelését, valamint a Maxwell fordítási réteget. Néhány Vulkan 1.1 GPU és minden Vulkan 1.2+ GPU támogatja.</string>
|
||||
<string name="use_fast_gpu_time">Gyors GPU idő használata</string>
|
||||
<string name="use_fast_gpu_time_description">A legtöbb játékot a natív felbontásukon futtatja. Ez az opció instabil és problémákat okozhat.</string>
|
||||
<string name="fast_gpu_time">GPU túlóra faktor</string>
|
||||
<string name="fast_gpu_time_description">Használj 128-at a maximális teljesítményért és 512-t a maximális grafikai minőségért.</string>
|
||||
<string name="gpu_low">Alacsony (128)</string>
|
||||
<string name="gpu_medium">Közepes (256)</string>
|
||||
<string name="gpu_high">Magas (512)</string>
|
||||
<string name="use_fast_cpu_time">Gyors CPU idő</string>
|
||||
<string name="use_fast_cpu_time_description">Kényszeríti az emulált CPU-t, hogy magasabb órajelen fusson, csökkentve bizonyos FPS korlátozókat. Ez az opció instabil és problémákat okozhat, és gyengébb CPU-k csökkentett teljesítményt tapasztalhatnak.</string>
|
||||
<string name="fast_cpu_time">CPU órajel</string>
|
||||
<string name="fast_cpu_time_description">Használd a Boost (1700MHz) opciót a Switch legmagasabb natív órajelén való futáshoz, vagy a Fast (2000MHz) opciót a dupla órajelen való futáshoz.</string>
|
||||
<string name="memory_layout">Memórialayout</string>
|
||||
<string name="memory_layout_description">(KÍSÉRLETI) Megváltoztatja az emulált memórialayoutot. Ez a beállítás nem növeli a teljesítményt, de segíthet a magas felbontást használó játékokban modok segítségével. Ne használd 8GB RAM vagy kevesebb rendelkező telefonokon.</string>
|
||||
<string name="memory_4gb">4GB (Ajánlott)</string>
|
||||
<string name="memory_6gb">6GB (Nem biztonságos)</string>
|
||||
<string name="memory_8gb">8GB (Nem biztonságos)</string>
|
||||
|
||||
<!-- ASTC Dekódolási Módszer -->
|
||||
<string name="clock_base">Alap (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">Gyors (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">ASTC dekódolási módszer</string>
|
||||
<string name="accelerate_astc_description">Válassza ki, hogyan legyenek dekódolva az ASTC tömörített textúrák a rendereléshez: CPU (lassú, biztonságos), GPU (gyors, ajánlott) vagy CPU Async (nincs megakadás, de problémákat okozhat)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPU aszinkron</string>
|
||||
|
||||
<!-- ASTC Újratömörítési Módszer -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">ASTC újratömörítési módszer</string>
|
||||
<string name="astc_recompression_description">Válassza ki, hogyan történik az ASTC textúrák újratömörítése a kompatibilitás és a teljesítmény javításáért. Ez az opció VRAM-ot takarít meg, de csökkentheti a textúra minőségét.</string>
|
||||
<string name="astc_recompression_uncompressed">Tömörítetlen</string>
|
||||
<string name="astc_recompression_bc1">BC1 (alacsony minőség)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (közepes minőség)</string>
|
||||
|
||||
<!-- VRAM Használati Mód -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">VRAM használati mód</string>
|
||||
<string name="vram_usage_mode_description">GPU memória kezelésének módja</string>
|
||||
<string name="vram_usage_conservative">Konzervatív</string>
|
||||
@@ -91,14 +132,14 @@
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- NVDEC Emuláció -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">NVDEC emuláció</string>
|
||||
<string name="nvdec_emulation_description">Videódekódolás kezelése</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
<string name="nvdec_emulation_gpu">GPU</string>
|
||||
<string name="nvdec_emulation_none">Nincs</string>
|
||||
|
||||
<!-- SPIRV optimalizálás -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">SPIRV optimalizálás</string>
|
||||
<string name="renderer_optimize_spirv_output_description">Optimalizálja a lefordított shadert a GPU hatékonyságának javításáért.</string>
|
||||
<string name="never">Soha</string>
|
||||
@@ -107,74 +148,98 @@
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">Többjátékos</string>
|
||||
<string name="multiplayer_description">Szoba létrehozása vagy csatlakozás</string>
|
||||
<string name="multiplayer_description">Hozz létre saját játéktermet vagy csatlakozz egy meglévőhöz</string>
|
||||
<string name="multiplayer_room_title">Szoba: %1$s</string>
|
||||
<string name="multiplayer_console_id">Konzol ID:%1$s</string>
|
||||
<string name="multiplayer_console_id">Konzol azonosító: %1$s</string>
|
||||
<string name="multiplayer_create_room">Létrehozás</string>
|
||||
<string name="multiplayer_join_room">Csatlakozás</string>
|
||||
<string name="multiplayer_public_room">Nyilvános szobák böngészése</string>
|
||||
<string name="multiplayer_username">Felhasználónév</string>
|
||||
<string name="multiplayer_ip_address">IP cím</string>
|
||||
<string name="multiplayer_ip_address">IP-cím</string>
|
||||
<string name="multiplayer_ip_port">Port</string>
|
||||
<string name="multiplayer_create_room_success">Szoba létrehozva</string>
|
||||
<string name="multiplayer_join_room_success">Sikeres csatlakozás</string>
|
||||
<string name="multiplayer_create_room_failed">Szoba létrehozása sikertelen</string>
|
||||
<string name="multiplayer_join_room_failed">Csatlakozás sikertelen</string>
|
||||
<string name="multiplayer_input_invalid">Érvénytelen cím vagy név</string>
|
||||
<string name="multiplayer_port_invalid">Érvénytelen port</string>
|
||||
<string name="multiplayer_exit_room">Kilépés</string>
|
||||
<string name="multiplayer_name_invalid">Túl rövid név</string>
|
||||
<string name="multiplayer_address_invalid">Érvénytelen cím</string>
|
||||
<string name="multiplayer_port_invalid">Érvénytelen port!</string>
|
||||
<string name="multiplayer_exit_room">Kilépés a szobából</string>
|
||||
<string name="multiplayer_network_error">Hálózati hiba</string>
|
||||
<string name="multiplayer_lost_connection">Kapcsolat megszakadt</string>
|
||||
<string name="multiplayer_name_collision">Név ütközés</string>
|
||||
<string name="multiplayer_mac_collision">MAC ütközés</string>
|
||||
<string name="multiplayer_console_id_collision">Konzol ID ütközés</string>
|
||||
<string name="multiplayer_name_collision">Névütközés</string>
|
||||
<string name="multiplayer_mac_collision">MAC-cím ütközés</string>
|
||||
<string name="multiplayer_console_id_collision">Konzol azonosító ütközés</string>
|
||||
<string name="multiplayer_wrong_version">Hibás verzió</string>
|
||||
<string name="multiplayer_wrong_password">Hibás jelszó</string>
|
||||
<string name="multiplayer_could_not_connect">Sikertelen csatlakozás</string>
|
||||
<string name="multiplayer_could_not_connect">Nem sikerült csatlakozni</string>
|
||||
<string name="multiplayer_room_is_full">A szoba tele van</string>
|
||||
<string name="multiplayer_host_banned">Hoszt kitiltva</string>
|
||||
<string name="multiplayer_host_banned">Gazda kitiltva</string>
|
||||
<string name="multiplayer_permission_denied">Engedély megtagadva</string>
|
||||
<string name="multiplayer_no_such_user">Nincs ilyen felhasználó</string>
|
||||
<string name="multiplayer_already_in_room">Már a szobában van</string>
|
||||
<string name="multiplayer_create_room_error">Szoba létrehozási hiba</string>
|
||||
<string name="multiplayer_host_kicked">Hoszt kirúgva</string>
|
||||
<string name="multiplayer_create_room_error">Hiba a szoba létrehozásakor</string>
|
||||
<string name="multiplayer_host_kicked">Gazda kirúgva</string>
|
||||
<string name="multiplayer_unknown_error">Ismeretlen hiba</string>
|
||||
<string name="multiplayer_room_uninitialized">Szoba nincs inicializálva</string>
|
||||
<string name="multiplayer_room_idle">Szoba tétlen</string>
|
||||
<string name="multiplayer_room_joining">Csatlakozás folyamatban</string>
|
||||
<string name="multiplayer_room_joining">Csatlakozás...</string>
|
||||
<string name="multiplayer_room_joined">Csatlakozva</string>
|
||||
<string name="multiplayer_room_moderator">Moderátor</string>
|
||||
<string name="multiplayer_room_moderator">Szoba moderátor</string>
|
||||
<string name="multiplayer_member_join">%1$s csatlakozott</string>
|
||||
<string name="multiplayer_member_leave">%1$s kilépett</string>
|
||||
<string name="multiplayer_member_leave">%1$s elhagyta</string>
|
||||
<string name="multiplayer_member_kicked">%1$s kirúgva</string>
|
||||
<string name="multiplayer_member_banned">%1$s kitiltva</string>
|
||||
<string name="multiplayer_address_unbanned">Cím feloldva</string>
|
||||
<string name="multiplayer_kick_member">Kirúgás</string>
|
||||
<string name="multiplayer_chat_input_hint">Üzenet küldése…</string>
|
||||
<string name="multiplayer_chat_input_hint">Üzenet küldése...</string>
|
||||
<string name="multiplayer_password">Jelszó</string>
|
||||
<string name="original_button_text">Csatlakozás</string>
|
||||
<string name="disabled_button_text">Csatlakozás…</string>
|
||||
<string name="multiplayer_room_name">Szoba név</string>
|
||||
<string name="multiplayer_room_name_invalid">A szoba neve 3-20 karakter hosszú legyen</string>
|
||||
<string name="multiplayer_max_players">Max játékosok (16)</string>
|
||||
<string name="multiplayer_max_players_value">Max játékosok: %d</string>
|
||||
<string name="multiplayer_joining">Csatlakozás...</string>
|
||||
<string name="multiplayer_creating">Létrehozás...</string>
|
||||
<string name="multiplayer_room_name">Szoba neve</string>
|
||||
<string name="multiplayer_room_name_invalid">A szobanév 3-20 karakter hosszú legyen</string>
|
||||
<string name="multiplayer_max_players">Max játékos (16)</string>
|
||||
<string name="multiplayer_max_players_value">Max játékos: %d</string>
|
||||
<string name="multiplayer_chat">Csevegés</string>
|
||||
<string name="multiplayer_more_options">További opciók</string>
|
||||
<string name="multiplayer_ip_copied">IP cím másolva</string>
|
||||
<string name="multiplayer_server_address">Szerver cím</string>
|
||||
<string name="multiplayer_more_options">További lehetőségek</string>
|
||||
<string name="multiplayer_ip_copied">IP-cím másolva</string>
|
||||
<string name="multiplayer_server_address">Szerver címe</string>
|
||||
<string name="chat">Csevegés</string>
|
||||
<string name="type_message">Üzenet írása…</string>
|
||||
<string name="type_message">Üzenet írása...</string>
|
||||
<string name="send">Küldés</string>
|
||||
<string name="send_message">Üzenet küldése</string>
|
||||
<string name="multiplayer_moderation">Moderálás</string>
|
||||
<string name="multiplayer_moderation_title">Kitiltottak listája</string>
|
||||
<string name="multiplayer_no_bans">Nincs kitiltott felhasználó</string>
|
||||
<string name="multiplayer_unban_title">Felhasználó feloldása</string>
|
||||
<string name="multiplayer_no_bans">Nincsenek kitiltottak</string>
|
||||
<string name="multiplayer_unban_title">Feloldás</string>
|
||||
<string name="multiplayer_unban">Feloldás</string>
|
||||
<string name="multiplayer_unban_message">Feloldja %1$s-t?</string>
|
||||
<string name="multiplayer_unban_message">Feloldod %1$s kitiltását?</string>
|
||||
<string name="multiplayer_ban">Kitiltás</string>
|
||||
<string name="multiplayer_room_browser">Nyilvános szobák</string>
|
||||
<string name="multiplayer_no_rooms_found">Nincs nyilvános szoba</string>
|
||||
<string name="multiplayer_password_required">Jelszó szükséges</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">Játék</string>
|
||||
<string name="multiplayer_no_game_info">Bármely játék</string>
|
||||
<string name="multiplayer_password_protected">Jelszóval védett szoba</string>
|
||||
<string name="multiplayer_hide_full_rooms">Tele szobák elrejtése</string>
|
||||
<string name="multiplayer_hide_empty_rooms">Üres szobák elrejtése</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">Frissítés újraellenőrzéshez</string>
|
||||
<string name="multiplayer_search_public_lobbies">Szobák keresése...</string>
|
||||
<string name="emulation_multiplayer">Többjátékos</string>
|
||||
<string name="multiplayer_game_name">Kedvenc játékok</string>
|
||||
<string name="multiplayer_preferred_game_name">Kedvenc játék</string>
|
||||
<string name="multiplayer_no_game">Nincs játék</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">Válassz kedvenc játékot a szoba létrehozásához</string>
|
||||
<string name="multiplayer_room_name_error">3-20 karakter kell</string>
|
||||
<string name="multiplayer_required">Kötelező</string>
|
||||
<string name="multiplayer_ip_error">Érvénytelen IP formátum</string>
|
||||
<string name="multiplayer_username_error">Legalább 5 karakter</string>
|
||||
<string name="multiplayer_port_error">1-65535 között legyen</string>
|
||||
<string name="cancel">Mégse</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="refresh">Frissítés</string>
|
||||
<string name="room_list">Szobalista</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Téma színe</string>
|
||||
@@ -326,11 +391,13 @@
|
||||
<string name="keys_missing_description">A Firmware és a kiskereskedelmi (retail) játékok nem dekódolhatók</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Alkalmazások indítása a rendszer kezdőképernyőjéről</string>
|
||||
<string name="applets">Applet indító</string>
|
||||
<string name="applets_description">Rendszer appletek indítása a telepített firmware-rel</string>
|
||||
<string name="applets_error_firmware">Firmware nincs telepítve</string>
|
||||
<string name="applets_error_applet">Applet nem elérhető</string>
|
||||
<string name="applets_error_description"><![CDATA[Kérjük, győződj meg róla, hogy a <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> fájl és a <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">firmware</a> telepítve van, majd próbáld újra.]]></string>
|
||||
<string name="applets_error_description"><![CDATA[Kérjük, győződj meg róla, hogy a <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> fájl és a <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">firmware</a> telepítve van, majd próbáld újra.]]></string>
|
||||
<string name="album_applet">Album</string>
|
||||
<string name="album_applet_description">Képernyőképek megtekintése a rendszer fényképnézegetőjével</string>
|
||||
<string name="mii_edit_applet">Mii szerkesztés</string>
|
||||
@@ -361,16 +428,6 @@
|
||||
<string name="user_data_export_cancelled">Exportálás megszakítva</string>
|
||||
<string name="user_data_import_failed_description">Ellenőrizd, hogy a felhasználói adatok mappái a zip mappa gyökerében vannak, és tartalmaznak egy konfig fájlt a config/config.ini címen, majd próbáld meg újra.</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">Korai hozzáférés</string>
|
||||
<string name="early_access_benefits">Korai hozzáférés előnyei</string>
|
||||
<string name="cutting_edge_features">Legújabb funkciók</string>
|
||||
<string name="early_access_updates">Korai hozzáférés a frissítésekhez</string>
|
||||
<string name="no_manual_installation">Automatikus telepítések</string>
|
||||
<string name="prioritized_support">Priorizált támogatás</string>
|
||||
<string name="our_eternal_gratitude">Valamint az örök hálánk</string>
|
||||
<string name="are_you_interested">Érdekel a dolog?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">Sebességkorlát</string>
|
||||
<string name="frame_limit_enable_description">Korlátozza az emuláció sebességét a normál sebesség adott százalékára.</string>
|
||||
@@ -392,6 +449,11 @@
|
||||
<string name="use_custom_rtc_description">Megadhatsz egy valós idejű órát, amely eltér a rendszer által használt órától.</string>
|
||||
<string name="set_custom_rtc">Egyéni RTC beállítása</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">Web token</string>
|
||||
<string name="web_token_description">Web token nyilvános termek létrehozásához. Ez egy 48 karakter hosszú sztring, amely csak kisbetűket (a-z) tartalmaz.</string>
|
||||
<string name="network">Hálózat</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">Pontosság szintje</string>
|
||||
<string name="renderer_resolution">Felbontás (Kézi/Dockolt)</string>
|
||||
@@ -421,6 +483,11 @@
|
||||
<string name="renderer_api">API</string>
|
||||
<string name="renderer_debug">Grafikai hibakeresés</string>
|
||||
<string name="renderer_debug_description">Lassú hibakereső módba állítja a grafikus API-t .</string>
|
||||
|
||||
<string name="log">Naplózás</string>
|
||||
<string name="flush_by_line">Hibakeresési naplók soronkénti kiürítése</string>
|
||||
<string name="flush_by_line_description">Kiüríti a hibakeresési naplókat minden írt sor után, megkönnyítve a hibakeresést összeomlás vagy fagyás esetén.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">Kimeneti motor</string>
|
||||
<string name="audio_volume">Hangerő</string>
|
||||
@@ -562,6 +629,33 @@
|
||||
<string name="system_gpu_driver">Rendszer GPU illesztőprogram</string>
|
||||
<string name="installing_driver">Illesztőprogram telepítése...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">GPU illesztőprogram letöltő</string>
|
||||
<string name="fetch">Letöltés</string>
|
||||
<string name="fetch_error">Hiba a letöltés közben</string>
|
||||
<string name="check_connection">Ellenőrizd az internetkapcsolatod és próbáld újra.</string>
|
||||
<string name="show_releases">Verziók megjelenítése</string>
|
||||
<string name="view_full_release_notes">Kiadási megjegyzések</string>
|
||||
<string name="failed_to_fetch">Letöltés sikertelen</string>
|
||||
<string name="error_during_fetch">Hiba a letöltés közben</string>
|
||||
<string name="toggle_release_notes">Kiadási megjegyzések váltása</string>
|
||||
<string name="downloads">Letöltések</string>
|
||||
<string name="show_downloads">Letöltések megjelenítése</string>
|
||||
<string name="hide_downloads">Letöltések elrejtése</string>
|
||||
<string name="failed_cache_dir">Gyorsítótár könyvtár nem elérhető</string>
|
||||
<string name="empty_response_body">Üres választörzs</string>
|
||||
<string name="successfully_installed">%1$s sikeresen telepítve</string>
|
||||
<string name="driver_failed_title">Illesztőprogram telepítése sikertelen</string>
|
||||
<string name="failed_install_driver">A(z) %1$s illesztőprogram telepítése sikertelen, támogatja a rendszered?</string>
|
||||
<string name="driver_empty">A letöltött illesztőprogram üres, ellenőrizd az internetkapcsolatod</string>
|
||||
<string name="downloading">Letöltés…</string>
|
||||
<string name="installing">Telepítés…</string>
|
||||
<string name="latest">Legújabb</string>
|
||||
<string name="recommended_driver">Ajánlott illesztőprogram:</string>
|
||||
<string name="gpu_model">GPU modell:</string>
|
||||
<string name="unsupported_gpu">Nem támogatott GPU</string>
|
||||
<string name="unsupported_gpu_warning">A GPU-d nem támogatja az illesztőprogramok befecskendezését. Nem ajánlott egyéni illesztőprogramok beállítása.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">Beállítások</string>
|
||||
<string name="preferences_general">Általános</string>
|
||||
@@ -627,7 +721,7 @@
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">ROM titkosítva</string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Győződj meg róla, hogy a <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Győződj meg róla, hogy a <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]></string>
|
||||
<string name="loader_error_video_core">Hiba lépett fel a videómag inicializása során</string>
|
||||
<string name="loader_error_video_core_description">Ezt általában egy nem kompatibilis GPU illesztő okozza. Egyéni GPU illesztőprogram telepítése megoldhatja a problémát.</string>
|
||||
<string name="loader_error_invalid_format">Nem sikerült betölteni a ROM-ot</string>
|
||||
@@ -801,6 +895,15 @@
|
||||
<string name="center">Középen</string>
|
||||
<string name="bottom">Alul</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">Appletek</string>
|
||||
<string name="applets_menu_description">(Folyamatban) Applet frontendek és beállítások módosítása</string>
|
||||
|
||||
<string name="applet_hle">Egyéni frontend</string>
|
||||
<string name="applet_lle">Valódi applet</string>
|
||||
|
||||
<string name="swkbd_applet">Szoftveres billentyűzet</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">Licenszek</string>
|
||||
<string name="license_fidelityfx_fsr_description">Magas minőségű felskálázás az AMD-től</string>
|
||||
|
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">Perangkat lunak ini akan menjalankan game untuk konsol game Nintendo Switch. Tidak ada judul game atau kunci yang disertakan.<br /><br />Sebelum memulai, harap cari file <![CDATA[<b> prod.keys </b>]]> di penyimpanan perangkat anda. <br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\"> Selengkapnya </a>]]></string>
|
||||
<string name="app_disclaimer">Perangkat lunak ini akan menjalankan game untuk konsol game Nintendo Switch. Tidak ada judul game atau kunci yang disertakan.<br /><br />Sebelum memulai, harap cari file <![CDATA[<b> prod.keys </b>]]> di penyimpanan perangkat anda. <br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\"> Selengkapnya </a>]]></string>
|
||||
<string name="notice_notification_channel_name">Pemberitahuan dan error</string>
|
||||
<string name="notice_notification_channel_description">Menampilkan pemberitahuan ketika terjadi kesalahan.</string>
|
||||
<string name="notification_permission_not_granted">Izin notifikasi tidak diberikan!</string>
|
||||
|
||||
<!-- Stats Overlay settings -->
|
||||
<string name="enhanced_fps_suffix">(Ditingkatkan)</string>
|
||||
<string name="process_ram">RAM Proses: %1$d MB</string>
|
||||
<string name="shaders_prefix">Membangun</string>
|
||||
<string name="shaders_suffix">Shader</string>
|
||||
<string name="system_info_label">Sistem:</string>
|
||||
<string name="show_stats_overlay">Tampilkan Overlay Statistik Performa</string>
|
||||
<string name="stats_overlay_customization">Kustomisasi</string>
|
||||
@@ -35,12 +38,32 @@
|
||||
<string name="overlay_position_bottom_right">Kanan Bawah</string>
|
||||
<string name="overlay_position_center_top">Tengah Atas</string>
|
||||
<string name="overlay_position_center_bottom">Tengah Bawah</string>
|
||||
<string name="overlay_background">Latar Belakang Overlay</string>
|
||||
<string name="overlay_background_description">Tambahkan latar belakang di belakang overlay untuk memudahkan pembacaan</string>
|
||||
<string name="perf_overlay_background">Latar Belakang Overlay</string>
|
||||
<string name="perf_overlay_background_description">Tambahkan latar belakang di belakang overlay untuk memudahkan pembacaan</string>
|
||||
<string name="show_shaders_building">Tampilkan Pembuatan Shader</string>
|
||||
<string name="show_shaders_building_description">Menampilkan jumlah shader yang sedang dibuat saat ini</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Tampilkan Overlay Info Perangkat</string>
|
||||
<string name="enable_soc_overlay">Aktifkan Overlay Perangkat</string>
|
||||
<string name="soc_overlay_options">Overlay Perangkat</string>
|
||||
<string name="soc_overlay_options_description">Konfigurasi informasi yang ditampilkan di overlay perangkat</string>
|
||||
|
||||
<string name="show_device_model">Tampilkan Model Perangkat</string>
|
||||
<string name="show_device_model_description">Tampilkan model perangkat host</string>
|
||||
<string name="show_gpu_model">Tampilkan Model GPU</string>
|
||||
<string name="show_gpu_model_description">Tampilkan model GPU host</string>
|
||||
<string name="show_soc_model">Tampilkan Model SoC</string>
|
||||
<string name="show_soc_model_description">Tampilkan model SoC host</string>
|
||||
|
||||
<!-- Eden`s Veil -->
|
||||
<string name="veil_extensions">Ekstensi GPU</string>
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="veil_misc">Lain-lain</string>
|
||||
<string name="eden_veil">Eden`s Veil</string>
|
||||
<string name="eden_veil_description">Melampaui default</string>
|
||||
<string name="eden_veil_description">Pengaturan eksperimental untuk meningkatkan kinerja dan kemampuan. Pengaturan ini dapat menyebabkan layar hitam atau masalah game lainnya.</string>
|
||||
<string name="eden_veil_warning_title">Pengaturan Eksperimental</string>
|
||||
<string name="eden_veil_warning_description">Pengaturan dalam Eden\'s Veil sangat eksperimental dan dapat menyebabkan masalah. Jika game Anda tidak boot, nonaktifkan semua ekstensi dan ubah Extended Dynamic State ke 0.</string>
|
||||
<string name="frame_skipping">WIP: Loncatan Frame</string>
|
||||
<string name="frame_skipping_description">Aktifkan atau nonaktifkan frame skipping untuk meningkatkan performa dengan mengurangi jumlah frame yang dirender. Fitur ini masih dalam pengembangan dan akan diaktifkan di rilis mendatang.</string>
|
||||
<string name="frame_interpolation">Penyelarasan Frame Tingkat Lanjut</string>
|
||||
@@ -48,7 +71,7 @@
|
||||
<string name="use_lru_cache">Aktifkan LRU Cache</string>
|
||||
<string name="use_lru_cache_description">Aktifkan atau nonaktifkan cache LRU (Least Recently Used), meningkatkan performa dengan menghemat penggunaan CPU. Beberapa game memiliki masalah dengannya, terutama TotK 1.2.1, jadi nonaktifkan jika game tidak mau boot atau sering crash.</string>
|
||||
<string name="dyna_state">Status Dinamis Ekstensi</string>
|
||||
<string name="dyna_state_description">Mengaktifkan fitur Vulkan untuk meningkatkan performa, rendering, dan menghemat sumber daya saat pembuatan pipeline sambil mempertahankan penggunaan CPU/GPU yang rendah. Ekstensi ini dapat meningkatkan suhu perangkat, dan GPU seri A6XX lama mungkin tidak merespons dengan benar. Setel ke 0 untuk menggunakan format emulasi Yuzu.</string>
|
||||
<string name="dyna_state_description">Mengaktifkan fitur Vulkan untuk meningkatkan kinerja, rendering, dan menghemat sumber daya saat pembuatan pipeline dengan tetap mempertahankan penggunaan CPU/GPU yang rendah. Ekstensi ini dapat meningkatkan suhu perangkat, dan GPU dari seri A6XX lama mungkin tidak berfungsi dengan baik. Setel ke 0 untuk menggunakan format emulasi lama.</string>
|
||||
<string name="use_sync_core">Sinkronisasi Kecepatan Inti</string>
|
||||
<string name="use_sync_core_description">Sinkronkan kecepatan inti dengan persentase kecepatan maksimum untuk meningkatkan performa tanpa mengubah kecepatan sebenarnya dari permainan.</string>
|
||||
<string name="use_auto_stub">Gunakan Auto Stub</string>
|
||||
@@ -63,42 +86,60 @@
|
||||
<string name="descriptor_indexing_description">Meningkatkan penanganan tekstur dan buffer, serta lapisan terjemahan Maxwell. Didukung oleh beberapa GPU Vulkan 1.1 dan semua GPU Vulkan 1.2+.</string>
|
||||
<string name="use_fast_gpu_time">Gunakan Waktu GPU Cepat</string>
|
||||
<string name="use_fast_gpu_time_description">Memaksa sebagian besar game berjalan pada resolusi asli tertinggi. Opsi ini mungkin menyebabkan masalah.</string>
|
||||
<string name="fast_gpu_time">Faktor Overclock GPU</string>
|
||||
<string name="fast_gpu_time_description">Gunakan 128 untuk kinerja maksimal dan 512 untuk kesetiaan grafis maksimal.</string>
|
||||
<string name="gpu_low">Rendah (128)</string>
|
||||
<string name="gpu_medium">Sedang (256)</string>
|
||||
<string name="gpu_high">Tinggi (512)</string>
|
||||
<string name="use_fast_cpu_time">Waktu CPU Cepat</string>
|
||||
<string name="use_fast_cpu_time_description">Memaksa CPU emulasi berjalan pada kecepatan clock yang lebih tinggi, mengurangi beberapa pembatas FPS. Opsi ini tidak stabil dan dapat menyebabkan masalah, dan CPU yang lebih lemah mungkin mengalami penurunan kinerja.</string>
|
||||
<string name="fast_cpu_time">Kecepatan Clock CPU</string>
|
||||
<string name="fast_cpu_time_description">Gunakan Boost (1700MHz) untuk berjalan pada kecepatan clock asli tertinggi Switch, atau Fast (2000MHz) untuk berjalan pada kecepatan ganda.</string>
|
||||
<string name="memory_layout">Tata Letak Memori</string>
|
||||
<string name="memory_layout_description">(EKSPERIMENTAL) Ubah tata letak memori emulasi. Pengaturan ini tidak meningkatkan kinerja, tetapi dapat membantu game yang menggunakan resolusi tinggi melalui mod. Jangan gunakan pada ponsel dengan RAM 8GB atau kurang.</string>
|
||||
<string name="memory_4gb">4GB (Direkomendasikan)</string>
|
||||
<string name="memory_6gb">6GB (Tidak Aman)</string>
|
||||
<string name="memory_8gb">8GB (Tidak Aman)</string>
|
||||
|
||||
<!-- Metode Dekoding ASTC -->
|
||||
<string name="clock_base">Dasar (1000MHz)</string>
|
||||
<string name="clock_boost">Boost (1700MHz)</string>
|
||||
<string name="clock_fast">Cepat (2000MHz)</string>
|
||||
|
||||
<!-- ASTC Decoding Method -->
|
||||
<string name="accelerate_astc">Metode Dekoding ASTC</string>
|
||||
<string name="accelerate_astc_description">Pilih cara tekstur terkompresi ASTC didekode untuk rendering: CPU (lambat, aman), GPU (cepat, direkomendasikan), atau CPU Async (tanpa lag, mungkin menyebabkan masalah)</string>
|
||||
<string name="accelerate_astc_cpu">CPU</string>
|
||||
<string name="accelerate_astc_gpu">GPU</string>
|
||||
<string name="accelerate_astc_async">CPU Secara Asinkron</string>
|
||||
|
||||
<!-- Metode Rekompresi ASTC -->
|
||||
<!-- ASTC Recompression Method -->
|
||||
<string name="astc_recompression">Metode Rekompresi ASTC</string>
|
||||
<string name="astc_recompression_description">Pilih cara tekstur ASTC dikompresi ulang untuk meningkatkan kompatibilitas dan performa. Mengaktifkan opsi ini menghemat VRAM tetapi dapat menurunkan kualitas tekstur.</string>
|
||||
<string name="astc_recompression_uncompressed">Tidak Dikompresi</string>
|
||||
<string name="astc_recompression_bc1">BC1 (Kualitas Rendah)</string>
|
||||
<string name="astc_recompression_bc3">BC3 (Kualitas Menengah)</string>
|
||||
|
||||
<!-- Mode Penggunaan VRAM -->
|
||||
<!-- VRAM Usage Mode -->
|
||||
<string name="vram_usage_mode">Mode Penggunaan VRAM</string>
|
||||
<string name="vram_usage_mode_description">Kontrol seberapa agresif emulator mengalokasikan dan membebaskan memori GPU.</string>
|
||||
<string name="vram_usage_conservative">Konservatif</string>
|
||||
<string name="vram_usage_aggressive">Agresif</string>
|
||||
|
||||
<!-- Backend Shader -->
|
||||
<!-- Shader Backend -->
|
||||
<string name="shader_backend">Backend Shader</string>
|
||||
<string name="shader_backend_description">Pilih cara shader dikompilasi dan diterjemahkan untuk GPU Anda.</string>
|
||||
<string name="shader_backend_glsl">Universal</string>
|
||||
<string name="shader_backend_glasm">Mali</string>
|
||||
<string name="shader_backend_spirv">Adreno/Xclipse</string>
|
||||
|
||||
<!-- Emulasi NVDEC -->
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">Emulasi NVDEC</string>
|
||||
<string name="nvdec_emulation_description">Pilih cara decoding video (NVDEC) ditangani selama cutscene dan intro.</string>
|
||||
<string name="nvdec_emulation_cpu">CPU</string>
|
||||
<string name="nvdec_emulation_gpu">GPU</string>
|
||||
<string name="nvdec_emulation_none">Tidak Ada</string>
|
||||
|
||||
<!-- Optimalkan Output SPIRV -->
|
||||
<!-- Optimize SPIRV output -->
|
||||
<string name="renderer_optimize_spirv_output">Optimalkan Output SPIRV</string>
|
||||
<string name="renderer_optimize_spirv_output_description">Mengoptimalkan shader yang dikompilasi untuk meningkatkan efisiensi GPU.</string>
|
||||
<string name="never">Tidak Pernah</string>
|
||||
@@ -106,12 +147,13 @@
|
||||
<string name="always">Selalu</string>
|
||||
|
||||
<!-- Multiplayer -->
|
||||
<string name="multiplayer">Multiplayer</string>
|
||||
<string name="multiplayer_description">Host ruang game Anda sendiri atau bergabung dengan yang sudah ada untuk bermain dengan orang lain</string>
|
||||
<string name="multiplayer">Multipemain</string>
|
||||
<string name="multiplayer_description">Buat ruang permainan sendiri atau bergabung dengan yang sudah ada untuk bermain dengan orang lain</string>
|
||||
<string name="multiplayer_room_title">Ruang: %1$s</string>
|
||||
<string name="multiplayer_console_id">ID Konsol: %1$s</string>
|
||||
<string name="multiplayer_create_room">Buat</string>
|
||||
<string name="multiplayer_join_room">Gabung</string>
|
||||
<string name="multiplayer_public_room">Jelajahi Ruang Publik</string>
|
||||
<string name="multiplayer_username">Nama Pengguna</string>
|
||||
<string name="multiplayer_ip_address">Alamat IP</string>
|
||||
<string name="multiplayer_ip_port">Port</string>
|
||||
@@ -119,25 +161,24 @@
|
||||
<string name="multiplayer_join_room_success">Berhasil bergabung dengan ruang!</string>
|
||||
<string name="multiplayer_create_room_failed">Gagal membuat ruang!</string>
|
||||
<string name="multiplayer_join_room_failed">Gagal bergabung dengan ruang!</string>
|
||||
<string name="multiplayer_input_invalid">Alamat tidak valid atau nama terlalu pendek!</string>
|
||||
<string name="multiplayer_port_invalid">Port tidak valid!</string>
|
||||
<string name="multiplayer_exit_room">Keluar Ruang</string>
|
||||
<string name="multiplayer_network_error">Error jaringan</string>
|
||||
<string name="multiplayer_exit_room">Keluar dari Ruang</string>
|
||||
<string name="multiplayer_network_error">Kesalahan jaringan</string>
|
||||
<string name="multiplayer_lost_connection">Koneksi terputus</string>
|
||||
<string name="multiplayer_name_collision">Nama sudah digunakan</string>
|
||||
<string name="multiplayer_mac_collision">MAC sudah digunakan</string>
|
||||
<string name="multiplayer_console_id_collision">ID Konsol sudah digunakan</string>
|
||||
<string name="multiplayer_name_collision">Tabrakan nama</string>
|
||||
<string name="multiplayer_mac_collision">Tabrakan MAC</string>
|
||||
<string name="multiplayer_console_id_collision">Tabrakan ID Konsol</string>
|
||||
<string name="multiplayer_wrong_version">Versi salah</string>
|
||||
<string name="multiplayer_wrong_password">Password salah</string>
|
||||
<string name="multiplayer_wrong_password">Kata sandi salah</string>
|
||||
<string name="multiplayer_could_not_connect">Tidak dapat terhubung</string>
|
||||
<string name="multiplayer_room_is_full">Ruang penuh</string>
|
||||
<string name="multiplayer_host_banned">Host dilarang</string>
|
||||
<string name="multiplayer_room_is_full">Ruang sudah penuh</string>
|
||||
<string name="multiplayer_host_banned">Host diblokir</string>
|
||||
<string name="multiplayer_permission_denied">Izin ditolak</string>
|
||||
<string name="multiplayer_no_such_user">Pengguna tidak ditemukan</string>
|
||||
<string name="multiplayer_already_in_room">Sudah dalam ruang</string>
|
||||
<string name="multiplayer_create_room_error">Error membuat ruang</string>
|
||||
<string name="multiplayer_host_kicked">Host di-kick</string>
|
||||
<string name="multiplayer_unknown_error">Error tidak diketahui</string>
|
||||
<string name="multiplayer_no_such_user">Tidak ada pengguna tersebut</string>
|
||||
<string name="multiplayer_already_in_room">Sudah berada di ruang</string>
|
||||
<string name="multiplayer_create_room_error">Kesalahan membuat ruang</string>
|
||||
<string name="multiplayer_host_kicked">Host dikeluarkan</string>
|
||||
<string name="multiplayer_unknown_error">Kesalahan tidak diketahui</string>
|
||||
<string name="multiplayer_room_uninitialized">Ruang tidak diinisialisasi</string>
|
||||
<string name="multiplayer_room_idle">Ruang menganggur</string>
|
||||
<string name="multiplayer_room_joining">Bergabung dengan ruang</string>
|
||||
@@ -149,32 +190,48 @@
|
||||
<string name="multiplayer_member_banned">%1$s dilarang</string>
|
||||
<string name="multiplayer_address_unbanned">Alamat diizinkan</string>
|
||||
<string name="multiplayer_kick_member">Kick Anggota</string>
|
||||
<string name="multiplayer_chat_input_hint">Kirim pesan……</string>
|
||||
<string name="multiplayer_chat_input_hint">Kirim pesan…</string>
|
||||
<string name="multiplayer_password">Password</string>
|
||||
<string name="original_button_text">Gabung</string>
|
||||
<string name="disabled_button_text">Bergabung...</string>
|
||||
<string name="multiplayer_joining">Bergabung...</string>
|
||||
<string name="multiplayer_room_name">Nama Ruang</string>
|
||||
<string name="multiplayer_room_name_invalid">Nama ruang harus antara 3 dan 20 karakter</string>
|
||||
<string name="multiplayer_max_players">Maks Pemain (16)</string>
|
||||
<string name="multiplayer_max_players_value">Maks Pemain: %d</string>
|
||||
<string name="multiplayer_chat">Chat</string>
|
||||
<string name="multiplayer_room_name_invalid">Nama ruang harus antara 3 hingga 20 karakter</string>
|
||||
<string name="multiplayer_max_players">Pemain Maks (16)</string>
|
||||
<string name="multiplayer_max_players_value">Pemain Maks: %d</string>
|
||||
<string name="multiplayer_chat">Obrolan</string>
|
||||
<string name="multiplayer_more_options">Opsi Lainnya</string>
|
||||
<string name="multiplayer_ip_copied">Alamat IP disalin ke clipboard</string>
|
||||
<string name="multiplayer_server_address">Alamat Server</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Ketik pesan……</string>
|
||||
<string name="type_message">Ketik pesan…</string>
|
||||
<string name="send">Kirim</string>
|
||||
<string name="send_message">Kirim Pesan</string>
|
||||
<string name="multiplayer_moderation">Moderasi</string>
|
||||
<string name="multiplayer_moderation_title">Daftar Larangan</string>
|
||||
<string name="multiplayer_no_bans">Tidak ada pengguna yang dilarang</string>
|
||||
<string name="multiplayer_unban_title">Izinkan Pengguna</string>
|
||||
<string name="multiplayer_unban">Izinkan</string>
|
||||
<string name="multiplayer_unban_message">Anda yakin ingin mengizinkan %1$s?</string>
|
||||
<string name="multiplayer_ban">Larang Pengguna</string>
|
||||
<string name="emulation_multiplayer">Multiplayer</string>
|
||||
<string name="multiplayer_moderation_title">Daftar Blokir</string>
|
||||
<string name="multiplayer_no_bans">Tidak ada pengguna yang diblokir</string>
|
||||
<string name="multiplayer_unban_title">Buka Blokir Pengguna</string>
|
||||
<string name="multiplayer_unban">Buka Blokir</string>
|
||||
<string name="multiplayer_unban_message">Apakah Anda yakin ingin membuka blokir %1$s?</string>
|
||||
<string name="multiplayer_ban">Blokir Pengguna</string>
|
||||
<string name="multiplayer_room_browser">Ruang Publik</string>
|
||||
<string name="multiplayer_no_rooms_found">Tidak ada ruang publik yang ditemukan</string>
|
||||
<string name="multiplayer_password_required">Kata sandi diperlukan</string>
|
||||
<string name="multiplayer_player_count">: %1$d/%2$d</string>
|
||||
<string name="multiplayer_game">Game</string>
|
||||
<string name="multiplayer_no_game_info">Game Apa Saja</string>
|
||||
<string name="multiplayer_password_protected">Ruang dilindungi kata sandi</string>
|
||||
<string name="multiplayer_hide_full_rooms">Sembunyikan Ruang Penuh</string>
|
||||
<string name="multiplayer_hide_empty_rooms">Sembunyikan Ruang Kosong</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">Ketuk segarkan untuk memeriksa lagi</string>
|
||||
<string name="multiplayer_search_public_lobbies">Cari Ruang…</string>
|
||||
<string name="emulation_multiplayer">Multipemain</string>
|
||||
<string name="multiplayer_game_name">Game Favorit</string>
|
||||
<string name="multiplayer_preferred_game_name">Game Pilihan</string>
|
||||
<string name="multiplayer_no_game">Tidak ada game yang ditemukan</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">Anda harus memilih Game Pilihan untuk membuat ruang.</string>
|
||||
<string name="cancel">Batal</string>
|
||||
<string name="ok">Ok</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="refresh">Segarkan</string>
|
||||
<string name="room_list">Daftar Ruang</string>
|
||||
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Warna Tema</string>
|
||||
@@ -326,6 +383,8 @@
|
||||
<string name="keys_missing_description">Firmware dan game retail tidak dapat didekripsi</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Luncurkan aplikasi dari layar beranda sistem</string>
|
||||
<string name="applets">Luncurkan applet</string>
|
||||
<string name="applets_description">Meluncurkan sistem applet menggunakan firmware yang diinstal</string>
|
||||
<string name="applets_error_firmware">Firmware tidak terinstal</string>
|
||||
@@ -362,17 +421,6 @@
|
||||
<string name="user_data_export_cancelled">Ekspor Dibatalkan</string>
|
||||
<string name="user_data_import_failed_description">Pastikan folder data pengguna berada di akar folder zip dan berisi file konfigurasi di config/config.ini dan coba lagi.</string>
|
||||
|
||||
<!-- Early access upgrade strings -->
|
||||
<string name="early_access">Akses lebih awal</string>
|
||||
<string name="early_access_benefits">Manfaat Akses Awal</string>
|
||||
<string name="cutting_edge_features">Fitur-fitur yang paling baru</string>
|
||||
<string name="early_access_updates">Akses lebih awal untuk pembaruan</string>
|
||||
<string name="no_manual_installation">Tidak ada instalasi manual</string>
|
||||
<string name="prioritized_support">Dukungan yang diprioritaskan</string>
|
||||
<string name="helping_game_preservation">Membantu pemeliharaan game</string>
|
||||
<string name="our_eternal_gratitude">Ucapan terima kasih kami yang tak terhingga</string>
|
||||
<string name="are_you_interested">Apa kamu tertarik?</string>
|
||||
|
||||
<!-- General settings strings -->
|
||||
<string name="frame_limit_enable">Batas kecepatan</string>
|
||||
<string name="frame_limit_enable_description">Membatasi kecepatan emulasi ke persentase tertentu dari kecepatan normal</string>
|
||||
@@ -382,6 +430,8 @@
|
||||
<string name="cpu_accuracy">Akurasi CPU</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Nama perangkat</string>
|
||||
<string name="use_docked_mode">Mode Docked</string>
|
||||
<string name="use_docked_mode_description">Meningkatkan resolusi, menurunkan performa. Mode Handled digunakan saat dinonaktifkan, menurunkan resolusi dan meningkatkan performa</string>
|
||||
<string name="emulated_region">Wilayah yang diemulasikan</string>
|
||||
@@ -392,6 +442,11 @@
|
||||
<string name="use_custom_rtc_description">Memungkinkan Anda untuk mengatur jam waktu nyata kustom yang terpisah dari waktu sistem saat ini Anda.</string>
|
||||
<string name="set_custom_rtc">Setel RTC Kustom</string>
|
||||
|
||||
<!-- Network settings strings -->
|
||||
<string name="web_token">Token Web</string>
|
||||
<string name="web_token_description">Token web digunakan untuk membuat ruang publik. Ini adalah string 48 karakter yang hanya berisi huruf kecil a-z.</string>
|
||||
<string name="network">Jaringan</string>
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="renderer_accuracy">Tingkatan Akurasi</string>
|
||||
<string name="renderer_resolution">Resolusi (Handheld/Docked)</string>
|
||||
@@ -423,6 +478,10 @@
|
||||
<string name="renderer_debug_description">Menyetel grafis API ke mode lambat</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">Pencatatan</string>
|
||||
<string name="flush_by_line">Buang log debug per baris</string>
|
||||
<string name="flush_by_line_description">Membuang log debug pada setiap baris yang ditulis, memudahkan debugging dalam kasus crash atau freeze.</string>
|
||||
|
||||
<!-- Audio settings strings -->
|
||||
<string name="audio_output_engine">Output audio</string>
|
||||
<string name="audio_volume">Volume</string>
|
||||
@@ -517,6 +576,33 @@
|
||||
<string name="system_gpu_driver">Driver GPU sistem</string>
|
||||
<string name="installing_driver">Memasang driver...</string>
|
||||
|
||||
<!-- GPU driver fetcher -->
|
||||
<string name="gpu_driver_fetcher">Pengambil Driver GPU</string>
|
||||
<string name="fetch">Ambil</string>
|
||||
<string name="fetch_error">Kesalahan saat Mengambil</string>
|
||||
<string name="check_connection">Periksa koneksi Anda dan coba lagi.</string>
|
||||
<string name="show_releases">Tampilkan Rilis</string>
|
||||
<string name="view_full_release_notes">Catatan Rilis</string>
|
||||
<string name="failed_to_fetch">Gagal Mengambil</string>
|
||||
<string name="error_during_fetch">Kesalahan saat Mengambil</string>
|
||||
<string name="toggle_release_notes">Alihkan Catatan Rilis</string>
|
||||
<string name="downloads">Unduhan</string>
|
||||
<string name="show_downloads">Tampilkan Unduhan</string>
|
||||
<string name="hide_downloads">Sembunyikan Unduhan</string>
|
||||
<string name="failed_cache_dir">Direktori cache tidak tersedia</string>
|
||||
<string name="empty_response_body">Isi respons kosong</string>
|
||||
<string name="successfully_installed">%1$s Berhasil Diinstal</string>
|
||||
<string name="driver_failed_title">Gagal Menginstal Driver</string>
|
||||
<string name="failed_install_driver">Gagal menginstal driver %1$s, apakah sistem Anda mendukungnya?</string>
|
||||
<string name="driver_empty">Driver yang diunduh kosong, periksa koneksi internet Anda</string>
|
||||
<string name="downloading">Mengunduh…</string>
|
||||
<string name="installing">Menginstal…</string>
|
||||
<string name="latest">Terbaru</string>
|
||||
<string name="recommended_driver">Driver yang Direkomendasikan:</string>
|
||||
<string name="gpu_model">Model GPU:</string>
|
||||
<string name="unsupported_gpu">GPU Tidak Didukung</string>
|
||||
<string name="unsupported_gpu_warning">GPU Anda tidak mendukung injeksi driver. Tidak disarankan untuk mengatur driver kustom.</string>
|
||||
|
||||
<!-- Preferences Screen -->
|
||||
<string name="preferences_settings">Pengaturan</string>
|
||||
<string name="preferences_general">Umum</string>
|
||||
@@ -581,8 +667,8 @@
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">ROM-mu ter-enkripsi</string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Silakan ikuti panduan untuk redump <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">kartu permainan</a> atau <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">judul yang terinstal</a>.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Harap pastikan bahwa Anda <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> diinstal sehingga game dapat didekripsi.]]></string>
|
||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Silakan ikuti panduan untuk redump <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">kartu permainan</a> atau <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">judul yang terinstal</a>.]]></string>
|
||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Harap pastikan bahwa Anda <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> diinstal sehingga game dapat didekripsi.]]></string>
|
||||
<string name="loader_error_video_core">Terjadi kesalahan ketika menginisialisasi inti video.</string>
|
||||
<string name="loader_error_video_core_description">Hal ini biasanya disebabkan oleh driver GPU yang tidak kompatibel. Menginstal driver GPU khusus dapat mengatasi masalah ini</string>
|
||||
<string name="loader_error_invalid_format">Tidak Dapat Memuat ROM</string>
|
||||
@@ -761,6 +847,15 @@
|
||||
<string name="center">Pusat</string>
|
||||
<string name="bottom">Bawah</string>
|
||||
|
||||
<!-- Applet Modes -->
|
||||
<string name="applets_menu">Applet</string>
|
||||
<string name="applets_menu_description">(Dalam pengerjaan) Ubah frontend dan pengaturan applet</string>
|
||||
|
||||
<string name="applet_hle">Frontend Kustom</string>
|
||||
<string name="applet_lle">Applet Asli</string>
|
||||
|
||||
<string name="swkbd_applet">Papan Ketik Perangkat Lunak</string>
|
||||
|
||||
<!-- Licenses screen strings -->
|
||||
<string name="licenses">Lisensi</string>
|
||||
<string name="license_fidelityfx_fsr_description">Peningkatan kualitas tinggi dari AMD</string>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user