Compare commits

..

6 Commits

Author SHA1 Message Date
6f9d0e1e0a Android 189 2024-01-11 01:00:40 +00:00
0ce30ddb01 Merge yuzu-emu#12642 2024-01-11 01:00:40 +00:00
7722625929 Merge yuzu-emu#12612 2024-01-11 01:00:40 +00:00
8b30ee3bf3 Merge yuzu-emu#12611 2024-01-11 01:00:40 +00:00
0e767e5e82 Merge yuzu-emu#12610 2024-01-11 01:00:40 +00:00
314dcf2cc3 Merge yuzu-emu#12579 2024-01-11 01:00:40 +00:00
716 changed files with 13372 additions and 30465 deletions

View File

@ -25,13 +25,10 @@ for f in $FILES_TO_LINT; do
"$CLANG_FORMAT" -i "$f" "$CLANG_FORMAT" -i "$f"
done done
DIFF=$(git -c core.fileMode=false diff) DIFF=$(git diff)
if [ ! -z "$DIFF" ]; then if [ ! -z "$DIFF" ]; then
echo "!!! Not compliant to coding style, here is the fix:" echo "!!! Not compliant to coding style, here is the fix:"
echo "$DIFF" echo "$DIFF"
exit 1 exit 1
fi fi
cd src/android
./gradlew ktlintCheck

View File

@ -8,7 +8,17 @@ variables:
DisplayVersion: $[counter(variables['DisplayPrefix'], 1)] DisplayVersion: $[counter(variables['DisplayPrefix'], 1)]
stages: stages:
- stage: format
displayName: 'format'
jobs:
- job: format
displayName: 'clang'
pool:
vmImage: ubuntu-latest
steps:
- template: ./templates/format-check.yml
- stage: build - stage: build
dependsOn: format
displayName: 'build' displayName: 'build'
jobs: jobs:
- job: build - job: build
@ -33,6 +43,7 @@ stages:
cache: 'true' cache: 'true'
version: $(DisplayVersion) version: $(DisplayVersion)
- stage: build_win - stage: build_win
dependsOn: format
displayName: 'build-windows' displayName: 'build-windows'
jobs: jobs:
- job: build - job: build

View File

@ -13,15 +13,13 @@ jobs:
format: format:
name: 'verify format' name: 'verify format'
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: yuzuemu/build-environments:linux-clang-format
options: -u 1001
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
submodules: false submodules: false
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: 'Verify Formatting' - name: 'Verify Formatting'
run: bash -ex ./.ci/scripts/format/script.sh run: bash -ex ./.ci/scripts/format/script.sh
build: build:

View File

@ -155,7 +155,3 @@ License: MIT
Files: externals/gamemode/* Files: externals/gamemode/*
Copyright: Copyright 2017-2019 Feral Interactive Copyright: Copyright 2017-2019 Feral Interactive
License: BSD-3-Clause License: BSD-3-Clause
Files: src/android/app/debug.keystore
Copyright: 2023 yuzu Emulator Project
License: GPL-3.0-or-later

View File

@ -2,20 +2,18 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
include(FindPackageHandleStandardArgs) find_path(SimpleIni_INCLUDE_DIR SimpleIni.h)
find_package(SimpleIni QUIET CONFIG) include(FindPackageHandleStandardArgs)
if (SimpleIni_CONSIDERED_CONFIGS) find_package_handle_standard_args(SimpleIni
find_package_handle_standard_args(SimpleIni CONFIG_MODE) REQUIRED_VARS SimpleIni_INCLUDE_DIR
else() )
find_package(PkgConfig QUIET)
pkg_search_module(SIMPLEINI QUIET IMPORTED_TARGET simpleini) if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni)
find_package_handle_standard_args(SimpleIni add_library(SimpleIni::SimpleIni INTERFACE IMPORTED)
REQUIRED_VARS SIMPLEINI_INCLUDEDIR set_target_properties(SimpleIni::SimpleIni PROPERTIES
VERSION_VAR SIMPLEINI_VERSION INTERFACE_INCLUDE_DIRECTORIES "${SimpleIni_INCLUDE_DIR}"
) )
endif() endif()
if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni) mark_as_advanced(SimpleIni_INCLUDE_DIR)
add_library(SimpleIni::SimpleIni ALIAS PkgConfig::SIMPLEINI)
endif()

View File

@ -1,9 +1,10 @@
| Pull Request | Commit | Title | Author | Merged? | | Pull Request | Commit | Title | Author | Merged? |
|----|----|----|----|----| |----|----|----|----|----|
| [12749](https://github.com/yuzu-emu/yuzu-android//pull/12749) | [`e3171486d`](https://github.com/yuzu-emu/yuzu-android//pull/12749/files) | general: workarounds for SMMU syncing issues | [liamwhite](https://github.com/liamwhite/) | Yes | | [12579](https://github.com/yuzu-emu/yuzu-android//pull/12579) | [`66ae60a9e`](https://github.com/yuzu-emu/yuzu-android//pull/12579/files) | Core: Implement Device Mapping & GPU SMMU | [FernandoS27](https://github.com/FernandoS27/) | Yes |
| [12760](https://github.com/yuzu-emu/yuzu-android//pull/12760) | [`c6b88b62d`](https://github.com/yuzu-emu/yuzu-android//pull/12760/files) | am: rewrite for multiprocess support | [liamwhite](https://github.com/liamwhite/) | Yes | | [12610](https://github.com/yuzu-emu/yuzu-android//pull/12610) | [`200b371d1`](https://github.com/yuzu-emu/yuzu-android//pull/12610/files) | server_manager: respond to session close correctly | [liamwhite](https://github.com/liamwhite/) | Yes |
| [12814](https://github.com/yuzu-emu/yuzu-android//pull/12814) | [`da410506a`](https://github.com/yuzu-emu/yuzu-android//pull/12814/files) | Move time services to new IPC and add debug printing | [Kelebek1](https://github.com/Kelebek1/) | Yes | | [12611](https://github.com/yuzu-emu/yuzu-android//pull/12611) | [`642a29923`](https://github.com/yuzu-emu/yuzu-android//pull/12611/files) | kernel: fix resource management issues | [liamwhite](https://github.com/liamwhite/) | Yes |
| [12830](https://github.com/yuzu-emu/yuzu-android//pull/12830) | [`6cc82fd43`](https://github.com/yuzu-emu/yuzu-android//pull/12830/files) | externals/dynarmic: Update to 6.6.1 | [merryhime](https://github.com/merryhime/) | Yes | | [12612](https://github.com/yuzu-emu/yuzu-android//pull/12612) | [`417df3b6e`](https://github.com/yuzu-emu/yuzu-android//pull/12612/files) | fsp-srv: use program registry for SetCurrentProcess | [liamwhite](https://github.com/liamwhite/) | Yes |
| [12642](https://github.com/yuzu-emu/yuzu-android//pull/12642) | [`4037afea1`](https://github.com/yuzu-emu/yuzu-android//pull/12642/files) | android: Refactor list adapters | [t895](https://github.com/t895/) | Yes |
End of merge log. You can find the original README.md below the break. End of merge log. You can find the original README.md below the break.

View File

@ -178,9 +178,6 @@ if (NOT TARGET stb::headers)
add_library(stb::headers ALIAS stb) add_library(stb::headers ALIAS stb)
endif() endif()
add_library(tz tz/tz/tz.cpp)
target_include_directories(tz PUBLIC ./tz)
add_library(bc_decoder bc_decoder/bc_decoder.cpp) add_library(bc_decoder bc_decoder/bc_decoder.cpp)
target_include_directories(bc_decoder PUBLIC ./bc_decoder) target_include_directories(bc_decoder PUBLIC ./bc_decoder)

View File

@ -32,7 +32,7 @@ set(NX_TZDB_ARCHIVE "${CMAKE_CURRENT_BINARY_DIR}/${NX_TZDB_VERSION}.zip")
set(NX_TZDB_ROMFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb") set(NX_TZDB_ROMFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb")
if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ROMFS_DIR}) if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ARCHIVE})
set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip") set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip")
message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...") message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...")

View File

@ -11,10 +11,6 @@ execute_process(
WORKING_DIRECTORY ${ZONE_PATH} WORKING_DIRECTORY ${ZONE_PATH}
OUTPUT_VARIABLE FILE_LIST) OUTPUT_VARIABLE FILE_LIST)
if (NOT FILE_LIST)
message(FATAL_ERROR "No timezone files found in directory ${ZONE_PATH}, did the download fail?")
endif()
set(DIRECTORY_NAME ${HEADER_NAME}) set(DIRECTORY_NAME ${HEADER_NAME})
set(FILE_DATA "") set(FILE_DATA "")

1636
externals/tz/tz/tz.cpp vendored

File diff suppressed because it is too large Load Diff

81
externals/tz/tz/tz.h vendored
View File

@ -1,81 +0,0 @@
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-FileCopyrightText: 1996 Arthur David Olson
// SPDX-License-Identifier: BSD-2-Clause
#pragma once
#include <cstdint>
#include <limits>
#include <span>
#include <array>
#include <time.h>
namespace Tz {
using u8 = uint8_t;
using s8 = int8_t;
using u16 = uint16_t;
using s16 = int16_t;
using u32 = uint32_t;
using s32 = int32_t;
using u64 = uint64_t;
using s64 = int64_t;
constexpr size_t TZ_MAX_TIMES = 1000;
constexpr size_t TZ_MAX_TYPES = 128;
constexpr size_t TZ_MAX_CHARS = 50;
constexpr size_t MY_TZNAME_MAX = 255;
constexpr size_t TZNAME_MAXIMUM = 255;
constexpr size_t TZ_MAX_LEAPS = 50;
constexpr s64 TIME_T_MAX = std::numeric_limits<s64>::max();
constexpr s64 TIME_T_MIN = std::numeric_limits<s64>::min();
constexpr size_t CHARS_EXTRA = 3;
constexpr size_t MAX_ZONE_CHARS = std::max(TZ_MAX_CHARS + CHARS_EXTRA, sizeof("UTC"));
constexpr size_t MAX_TZNAME_CHARS = 2 * (MY_TZNAME_MAX + 1);
struct ttinfo {
s32 tt_utoff;
bool tt_isdst;
s32 tt_desigidx;
bool tt_ttisstd;
bool tt_ttisut;
};
static_assert(sizeof(ttinfo) == 0x10, "ttinfo has the wrong size!");
struct Rule {
s32 timecnt;
s32 typecnt;
s32 charcnt;
bool goback;
bool goahead;
std::array <u8, 0x2> padding0;
std::array<s64, TZ_MAX_TIMES> ats;
std::array<u8, TZ_MAX_TIMES> types;
std::array<ttinfo, TZ_MAX_TYPES> ttis;
std::array<char, std::max(MAX_ZONE_CHARS, MAX_TZNAME_CHARS)> chars;
s32 defaulttype;
std::array <u8, 0x12C4> padding1;
};
static_assert(sizeof(Rule) == 0x4000, "Rule has the wrong size!");
struct CalendarTimeInternal {
s32 tm_sec;
s32 tm_min;
s32 tm_hour;
s32 tm_mday;
s32 tm_mon;
s32 tm_year;
s32 tm_wday;
s32 tm_yday;
s32 tm_isdst;
std::array<char, 16> tm_zone;
s32 tm_utoff;
s32 time_index;
};
static_assert(sizeof(CalendarTimeInternal) == 0x3C, "CalendarTimeInternal has the wrong size!");
s32 ParseTimeZoneBinary(Rule& out_rule, std::span<const u8> binary);
bool localtime_rz(CalendarTimeInternal* tmp, Rule const* sp, time_t* timep);
u32 mktime_tzname(time_t* out_time, Rule const* sp, CalendarTimeInternal* tmp);
} // namespace Tz

View File

@ -82,8 +82,8 @@ android {
} }
val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE") val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
signingConfigs { if (keystoreFile != null) {
if (keystoreFile != null) { signingConfigs {
create("release") { create("release") {
storeFile = file(keystoreFile) storeFile = file(keystoreFile)
storePassword = System.getenv("ANDROID_KEYSTORE_PASS") storePassword = System.getenv("ANDROID_KEYSTORE_PASS")
@ -91,12 +91,6 @@ android {
keyPassword = System.getenv("ANDROID_KEYSTORE_PASS") keyPassword = System.getenv("ANDROID_KEYSTORE_PASS")
} }
} }
create("default") {
storeFile = file("$projectDir/debug.keystore")
storePassword = "android"
keyAlias = "androiddebugkey"
keyPassword = "android"
}
} }
// Define build types, which are orthogonal to product flavors. // Define build types, which are orthogonal to product flavors.
@ -107,7 +101,7 @@ android {
signingConfig = if (keystoreFile != null) { signingConfig = if (keystoreFile != null) {
signingConfigs.getByName("release") signingConfigs.getByName("release")
} else { } else {
signingConfigs.getByName("default") signingConfigs.getByName("debug")
} }
resValue("string", "app_name_suffixed", "yuzu") resValue("string", "app_name_suffixed", "yuzu")
@ -124,7 +118,7 @@ android {
register("relWithDebInfo") { register("relWithDebInfo") {
isDefault = true isDefault = true
resValue("string", "app_name_suffixed", "yuzu Debug Release") resValue("string", "app_name_suffixed", "yuzu Debug Release")
signingConfig = signingConfigs.getByName("default") signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = true isMinifyEnabled = true
isDebuggable = true isDebuggable = true
proguardFiles( proguardFiles(
@ -139,7 +133,6 @@ android {
// Signed by debug key disallowing distribution on Play Store. // Signed by debug key disallowing distribution on Play Store.
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
debug { debug {
signingConfig = signingConfigs.getByName("default")
resValue("string", "app_name_suffixed", "yuzu Debug") resValue("string", "app_name_suffixed", "yuzu Debug")
isDebuggable = true isDebuggable = true
isJniDebuggable = true isJniDebuggable = true
@ -195,15 +188,8 @@ tasks.create<Delete>("ktlintReset") {
delete(File(buildDir.path + File.separator + "intermediates/ktLint")) delete(File(buildDir.path + File.separator + "intermediates/ktLint"))
} }
val showFormatHelp = {
logger.lifecycle(
"If this check fails, please try running \"gradlew ktlintFormat\" for automatic " +
"codestyle fixes"
)
}
tasks.getByPath("ktlintKotlinScriptCheck").doFirst { showFormatHelp.invoke() }
tasks.getByPath("ktlintMainSourceSetCheck").doFirst { showFormatHelp.invoke() }
tasks.getByPath("loadKtlintReporters").dependsOn("ktlintReset") tasks.getByPath("loadKtlintReporters").dependsOn("ktlintReset")
tasks.getByPath("preBuild").dependsOn("ktlintCheck")
ktlint { ktlint {
version.set("0.47.1") version.set("0.47.1")
@ -242,33 +228,71 @@ dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
} }
fun runGitCommand(command: List<String>): String { fun getGitVersion(): String {
return try { var versionName = "0.0"
ProcessBuilder(command)
try {
versionName = ProcessBuilder("git", "describe", "--always", "--long")
.directory(project.rootDir) .directory(project.rootDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE) .redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE) .redirectError(ProcessBuilder.Redirect.PIPE)
.start().inputStream.bufferedReader().use { it.readText() } .start().inputStream.bufferedReader().use { it.readText() }
.trim() .trim()
} catch (e: Exception) {
logger.error("Cannot find git")
""
}
}
fun getGitVersion(): String {
val versionName = if (System.getenv("GITHUB_ACTIONS") != null) {
val gitTag = System.getenv("GIT_TAG_NAME") ?: ""
gitTag
} else {
runGitCommand(listOf("git", "describe", "--always", "--long"))
.replace(Regex("(-0)?-[^-]+$"), "") .replace(Regex("(-0)?-[^-]+$"), "")
} catch (e: Exception) {
logger.error("Cannot find git, defaulting to dummy version number")
} }
return versionName.ifEmpty { "0.0" }
if (System.getenv("GITHUB_ACTIONS") != null) {
val gitTag = System.getenv("GIT_TAG_NAME")
versionName = gitTag ?: versionName
}
return versionName
} }
fun getGitHash(): String = fun getGitHash(): String {
runGitCommand(listOf("git", "rev-parse", "--short", "HEAD")).ifEmpty { "dummy-hash" } try {
val processBuilder = ProcessBuilder("git", "rev-parse", "--short", "HEAD")
processBuilder.directory(project.rootDir)
val process = processBuilder.start()
val inputStream = process.inputStream
val errorStream = process.errorStream
process.waitFor()
fun getBranch(): String = return if (process.exitValue() == 0) {
runGitCommand(listOf("git", "rev-parse", "--abbrev-ref", "HEAD")).ifEmpty { "dummy-hash" } inputStream.bufferedReader()
.use { it.readText().trim() } // return the value of gitHash
} else {
val errorMessage = errorStream.bufferedReader().use { it.readText().trim() }
logger.error("Error running git command: $errorMessage")
"dummy-hash" // return a dummy hash value in case of an error
}
} catch (e: Exception) {
logger.error("$e: Cannot find git, defaulting to dummy build hash")
return "dummy-hash" // return a dummy hash value in case of an error
}
}
fun getBranch(): String {
try {
val processBuilder = ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD")
processBuilder.directory(project.rootDir)
val process = processBuilder.start()
val inputStream = process.inputStream
val errorStream = process.errorStream
process.waitFor()
return if (process.exitValue() == 0) {
inputStream.bufferedReader()
.use { it.readText().trim() } // return the value of gitHash
} else {
val errorMessage = errorStream.bufferedReader().use { it.readText().trim() }
logger.error("Error running git command: $errorMessage")
"dummy-hash" // return a dummy hash value in case of an error
}
} catch (e: Exception) {
logger.error("$e: Cannot find git, defaulting to dummy build hash")
return "dummy-hash" // return a dummy hash value in case of an error
}
}

Binary file not shown.

View File

@ -21,9 +21,6 @@ import org.yuzu.yuzu_emu.utils.DocumentsTree
import org.yuzu.yuzu_emu.utils.FileUtil import org.yuzu.yuzu_emu.utils.FileUtil
import org.yuzu.yuzu_emu.utils.Log import org.yuzu.yuzu_emu.utils.Log
import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable
import org.yuzu.yuzu_emu.model.InstallResult
import org.yuzu.yuzu_emu.model.Patch
import org.yuzu.yuzu_emu.model.GameVerificationResult
/** /**
* Class which contains methods that interact * Class which contains methods that interact
@ -238,12 +235,9 @@ object NativeLibrary {
/** /**
* Installs a nsp or xci file to nand * Installs a nsp or xci file to nand
* @param filename String representation of file uri * @param filename String representation of file uri
* @return int representation of [InstallResult] * @param extension Lowercase string representation of file extension without "."
*/ */
external fun installFileToNand( external fun installFileToNand(filename: String, extension: String): Int
filename: String,
callback: (max: Long, progress: Long) -> Boolean
): Int
external fun doesUpdateMatchProgram(programId: String, updatePath: String): Boolean external fun doesUpdateMatchProgram(programId: String, updatePath: String): Boolean
@ -261,7 +255,7 @@ object NativeLibrary {
/** /**
* Begins emulation. * Begins emulation.
*/ */
external fun run(path: String?, programIndex: Int = 0) external fun run(path: String?)
// Surface Handling // Surface Handling
external fun surfaceChanged(surf: Surface?) external fun surfaceChanged(surf: Surface?)
@ -303,11 +297,6 @@ object NativeLibrary {
*/ */
external fun getCpuBackend(): String external fun getCpuBackend(): String
/**
* Returns the current GPU Driver.
*/
external fun getGpuDriver(): String
external fun applySettings() external fun applySettings()
external fun logSettings() external fun logSettings()
@ -489,12 +478,6 @@ object NativeLibrary {
sEmulationActivity.get()!!.onEmulationStopped(status) sEmulationActivity.get()!!.onEmulationStopped(status)
} }
@Keep
@JvmStatic
fun onProgramChanged(programIndex: Int) {
sEmulationActivity.get()!!.onProgramChanged(programIndex)
}
/** /**
* Logs the Yuzu version, Android version and, CPU. * Logs the Yuzu version, Android version and, CPU.
*/ */
@ -552,49 +535,9 @@ object NativeLibrary {
* *
* @param path Path to game file. Can be a [Uri]. * @param path Path to game file. Can be a [Uri].
* @param programId String representation of a game's program ID * @param programId String representation of a game's program ID
* @return Array of available patches * @return Array of pairs where the first value is the name of an addon and the second is the version
*/ */
external fun getPatchesForFile(path: String, programId: String): Array<Patch>? external fun getAddonsForFile(path: String, programId: String): Array<Pair<String, String>>?
/**
* Removes an update for a given [programId]
* @param programId String representation of a game's program ID
*/
external fun removeUpdate(programId: String)
/**
* Removes all DLC for a [programId]
* @param programId String representation of a game's program ID
*/
external fun removeDLC(programId: String)
/**
* Removes a mod installed for a given [programId]
* @param programId String representation of a game's program ID
* @param name The name of a mod as given by [getPatchesForFile]. This corresponds with the name
* of the mod's directory in a game's load folder.
*/
external fun removeMod(programId: String, name: String)
/**
* Verifies all installed content
* @param callback UI callback for verification progress. Return true in the callback to cancel.
* @return Array of content that failed verification. Successful if empty.
*/
external fun verifyInstalledContents(
callback: (max: Long, progress: Long) -> Boolean
): Array<String>
/**
* Verifies the contents of a game
* @param path String path to a game
* @param callback UI callback for verification progress. Return true in the callback to cancel.
* @return Int that is meant to be converted to a [GameVerificationResult]
*/
external fun verifyGameContents(
path: String,
callback: (max: Long, progress: Long) -> Boolean
): Int
/** /**
* Gets the save location for a specific game * Gets the save location for a specific game
@ -625,11 +568,6 @@ object NativeLibrary {
*/ */
external fun clearFilesystemProvider() external fun clearFilesystemProvider()
/**
* Checks if all necessary keys are present for decryption
*/
external fun areKeysPresent(): Boolean
/** /**
* Button type for use in onTouchEvent * Button type for use in onTouchEvent
*/ */
@ -671,4 +609,15 @@ object NativeLibrary {
const val RELEASED = 0 const val RELEASED = 0
const val PRESSED = 1 const val PRESSED = 1
} }
/**
* Result from installFileToNand
*/
object InstallFileToNandResult {
const val Success = 0
const val SuccessFileOverwritten = 1
const val Error = 2
const val ErrorBaseGame = 3
const val ErrorFilenameExtension = 4
}
} }

View File

@ -49,6 +49,7 @@ import org.yuzu.yuzu_emu.utils.ForegroundService
import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.InputHandler
import org.yuzu.yuzu_emu.utils.Log import org.yuzu.yuzu_emu.utils.Log
import org.yuzu.yuzu_emu.utils.MemoryUtil import org.yuzu.yuzu_emu.utils.MemoryUtil
import org.yuzu.yuzu_emu.utils.NativeConfig
import org.yuzu.yuzu_emu.utils.NfcReader import org.yuzu.yuzu_emu.utils.NfcReader
import org.yuzu.yuzu_emu.utils.ThemeHelper import org.yuzu.yuzu_emu.utils.ThemeHelper
import java.text.NumberFormat import java.text.NumberFormat
@ -76,6 +77,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
override fun onDestroy() { override fun onDestroy() {
stopForegroundService(this) stopForegroundService(this)
emulationViewModel.clear()
super.onDestroy() super.onDestroy()
} }
@ -169,6 +171,11 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
stopMotionSensorListener() stopMotionSensorListener()
} }
override fun onStop() {
super.onStop()
NativeConfig.saveGlobalConfig()
}
override fun onUserLeaveHint() { override fun onUserLeaveHint() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && !isInPictureInPictureMode) { if (BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && !isInPictureInPictureMode) {
@ -192,10 +199,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
return super.dispatchKeyEvent(event) return super.dispatchKeyEvent(event)
} }
if (emulationViewModel.drawerOpen.value) {
return super.dispatchKeyEvent(event)
}
return InputHandler.dispatchKeyEvent(event) return InputHandler.dispatchKeyEvent(event)
} }
@ -206,10 +209,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
return super.dispatchGenericMotionEvent(event) return super.dispatchGenericMotionEvent(event)
} }
if (emulationViewModel.drawerOpen.value) {
return super.dispatchGenericMotionEvent(event)
}
// Don't attempt to do anything if we are disconnecting a device. // Don't attempt to do anything if we are disconnecting a device.
if (event.actionMasked == MotionEvent.ACTION_CANCEL) { if (event.actionMasked == MotionEvent.ACTION_CANCEL) {
return true return true
@ -445,14 +444,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
} }
fun onEmulationStopped(status: Int) { fun onEmulationStopped(status: Int) {
if (status == 0 && emulationViewModel.programChanged.value == -1) { if (status == 0) {
finish() finish()
} }
emulationViewModel.setEmulationStopped(true)
}
fun onProgramChanged(programIndex: Int) {
emulationViewModel.setProgramChanged(programIndex)
} }
private fun startMotionSensorListener() { private fun startMotionSensorListener() {

View File

@ -14,20 +14,15 @@ import androidx.recyclerview.widget.RecyclerView
* Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate * Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate
* code used in every [RecyclerView]. * code used in every [RecyclerView].
* Type assigned to [Model] must inherit from [Object] in order to be compared properly. * Type assigned to [Model] must inherit from [Object] in order to be compared properly.
* @param exact Decides whether each item will be compared by reference or by their contents
*/ */
abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>>( abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>> :
exact: Boolean = true ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>()).build()) {
) : ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>(exact)).build()) {
override fun onBindViewHolder(holder: Holder, position: Int) = override fun onBindViewHolder(holder: Holder, position: Int) =
holder.bind(currentList[position]) holder.bind(currentList[position])
private class DiffCallback<Model>(val exact: Boolean) : DiffUtil.ItemCallback<Model>() { private class DiffCallback<Model> : DiffUtil.ItemCallback<Model>() {
override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean { override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {
if (exact) { return oldItem === newItem
return oldItem === newItem
}
return oldItem == newItem
} }
@SuppressLint("DiffUtilEquals") @SuppressLint("DiffUtilEquals")

View File

@ -6,32 +6,27 @@ package org.yuzu.yuzu_emu.adapters
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding
import org.yuzu.yuzu_emu.model.Patch import org.yuzu.yuzu_emu.model.Addon
import org.yuzu.yuzu_emu.model.AddonViewModel
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
class AddonAdapter(val addonViewModel: AddonViewModel) : class AddonAdapter : AbstractDiffAdapter<Addon, AddonAdapter.AddonViewHolder>() {
AbstractDiffAdapter<Patch, AddonAdapter.AddonViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddonViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddonViewHolder {
ListItemAddonBinding.inflate(LayoutInflater.from(parent.context), parent, false) ListItemAddonBinding.inflate(LayoutInflater.from(parent.context), parent, false)
.also { return AddonViewHolder(it) } .also { return AddonViewHolder(it) }
} }
inner class AddonViewHolder(val binding: ListItemAddonBinding) : inner class AddonViewHolder(val binding: ListItemAddonBinding) :
AbstractViewHolder<Patch>(binding) { AbstractViewHolder<Addon>(binding) {
override fun bind(model: Patch) { override fun bind(model: Addon) {
binding.root.setOnClickListener { binding.root.setOnClickListener {
binding.addonCheckbox.isChecked = !binding.addonCheckbox.isChecked binding.addonSwitch.isChecked = !binding.addonSwitch.isChecked
} }
binding.title.text = model.name binding.title.text = model.title
binding.version.text = model.version binding.version.text = model.version
binding.addonCheckbox.setOnCheckedChangeListener { _, checked -> binding.addonSwitch.setOnCheckedChangeListener { _, checked ->
model.enabled = checked model.enabled = checked
} }
binding.addonCheckbox.isChecked = model.enabled binding.addonSwitch.isChecked = model.enabled
binding.buttonDelete.setOnClickListener {
addonViewModel.setAddonToDelete(model)
}
} }
} }
} }

View File

@ -3,6 +3,9 @@
package org.yuzu.yuzu_emu.adapters package org.yuzu.yuzu_emu.adapters
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.LayerDrawable
import android.net.Uri import android.net.Uri
import android.text.TextUtils import android.text.TextUtils
import android.view.LayoutInflater import android.view.LayoutInflater
@ -12,6 +15,10 @@ import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toDrawable
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@ -23,6 +30,7 @@ import kotlinx.coroutines.withContext
import org.yuzu.yuzu_emu.HomeNavigationDirections import org.yuzu.yuzu_emu.HomeNavigationDirections
import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.activities.EmulationActivity
import org.yuzu.yuzu_emu.databinding.CardGameBinding import org.yuzu.yuzu_emu.databinding.CardGameBinding
import org.yuzu.yuzu_emu.model.Game import org.yuzu.yuzu_emu.model.Game
import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.GamesViewModel
@ -30,7 +38,7 @@ import org.yuzu.yuzu_emu.utils.GameIconUtils
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
class GameAdapter(private val activity: AppCompatActivity) : class GameAdapter(private val activity: AppCompatActivity) :
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>(exact = false) { AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder {
CardGameBinding.inflate(LayoutInflater.from(parent.context), parent, false) CardGameBinding.inflate(LayoutInflater.from(parent.context), parent, false)
.also { return GameViewHolder(it) } .also { return GameViewHolder(it) }
@ -81,13 +89,36 @@ class GameAdapter(private val activity: AppCompatActivity) :
) )
.apply() .apply()
val openIntent =
Intent(YuzuApplication.appContext, EmulationActivity::class.java).apply {
action = Intent.ACTION_VIEW
data = Uri.parse(game.path)
}
activity.lifecycleScope.launch { activity.lifecycleScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val layerDrawable = ResourcesCompat.getDrawable(
YuzuApplication.appContext.resources,
R.drawable.shortcut,
null
) as LayerDrawable
layerDrawable.setDrawableByLayerId(
R.id.shortcut_foreground,
GameIconUtils.getGameIcon(activity, game)
.toDrawable(YuzuApplication.appContext.resources)
)
val inset = YuzuApplication.appContext.resources
.getDimensionPixelSize(R.dimen.icon_inset)
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
val shortcut = val shortcut =
ShortcutInfoCompat.Builder(YuzuApplication.appContext, game.path) ShortcutInfoCompat.Builder(YuzuApplication.appContext, game.path)
.setShortLabel(game.title) .setShortLabel(game.title)
.setIcon(GameIconUtils.getShortcutIcon(activity, game)) .setIcon(
.setIntent(game.launchIntent) IconCompat.createWithAdaptiveBitmap(
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
)
)
.setIntent(openIntent)
.build() .build()
ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut) ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut)
} }

View File

@ -23,8 +23,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
THEME("theme"), THEME("theme"),
THEME_MODE("theme_mode"), THEME_MODE("theme_mode"),
OVERLAY_SCALE("control_scale"), OVERLAY_SCALE("control_scale"),
OVERLAY_OPACITY("control_opacity"), OVERLAY_OPACITY("control_opacity");
LOCK_DRAWER("lock_drawer");
override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal) override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)

View File

@ -76,8 +76,8 @@ class AboutFragment : Fragment() {
binding.root.findNavController().navigate(R.id.action_aboutFragment_to_licensesFragment) binding.root.findNavController().navigate(R.id.action_aboutFragment_to_licensesFragment)
} }
binding.textVersionName.text = BuildConfig.VERSION_NAME binding.textBuildHash.text = BuildConfig.GIT_HASH
binding.buttonVersionName.setOnClickListener { binding.buttonBuildHash.setOnClickListener {
val clipBoard = val clipBoard =
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(getString(R.string.build), BuildConfig.GIT_HASH) val clip = ClipData.newPlainText(getString(R.string.build), BuildConfig.GIT_HASH)

View File

@ -74,7 +74,7 @@ class AddonsFragment : Fragment() {
binding.listAddons.apply { binding.listAddons.apply {
layoutManager = LinearLayoutManager(requireContext()) layoutManager = LinearLayoutManager(requireContext())
adapter = AddonAdapter(addonViewModel) adapter = AddonAdapter()
} }
viewLifecycleOwner.lifecycleScope.apply { viewLifecycleOwner.lifecycleScope.apply {
@ -110,21 +110,6 @@ class AddonsFragment : Fragment() {
} }
} }
} }
launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
addonViewModel.addonToDelete.collect {
if (it != null) {
MessageDialogFragment.newInstance(
requireActivity(),
titleId = R.string.confirm_uninstall,
descriptionId = R.string.confirm_uninstall_description,
positiveAction = { addonViewModel.onDeleteAddon(it) }
).show(parentFragmentManager, MessageDialogFragment.TAG)
addonViewModel.setAddonToDelete(null)
}
}
}
}
} }
binding.buttonInstall.setOnClickListener { binding.buttonInstall.setOnClickListener {
@ -171,22 +156,22 @@ class AddonsFragment : Fragment() {
descriptionId = R.string.invalid_directory_description descriptionId = R.string.invalid_directory_description
) )
if (isValid) { if (isValid) {
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
requireActivity(), requireActivity(),
R.string.installing_game_content, R.string.installing_game_content,
false false
) { progressCallback, _ -> ) {
val parentDirectoryName = externalAddonDirectory.name val parentDirectoryName = externalAddonDirectory.name
val internalAddonDirectory = val internalAddonDirectory =
File(args.game.addonDir + parentDirectoryName) File(args.game.addonDir + parentDirectoryName)
try { try {
externalAddonDirectory.copyFilesTo(internalAddonDirectory, progressCallback) externalAddonDirectory.copyFilesTo(internalAddonDirectory)
} catch (_: Exception) { } catch (_: Exception) {
return@newInstance errorMessage return@newInstance errorMessage
} }
addonViewModel.refreshAddons() addonViewModel.refreshAddons()
return@newInstance getString(R.string.addon_installed_successfully) return@newInstance getString(R.string.addon_installed_successfully)
}.show(parentFragmentManager, ProgressDialogFragment.TAG) }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG)
} else { } else {
errorMessage.show(parentFragmentManager, MessageDialogFragment.TAG) errorMessage.show(parentFragmentManager, MessageDialogFragment.TAG)
} }

View File

@ -75,7 +75,7 @@ class DriverManagerFragment : Fragment() {
driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global) driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global)
binding.toolbarDrivers.setOnMenuItemClickListener { binding.toolbarDrivers.setOnMenuItemClickListener {
when (it.itemId) { when (it.itemId) {
R.id.menu_driver_use_global -> { R.id.menu_driver_clear -> {
StringSetting.DRIVER_PATH.global = true StringSetting.DRIVER_PATH.global = true
driverViewModel.updateDriverList() driverViewModel.updateDriverList()
(binding.listDrivers.adapter as DriverAdapter) (binding.listDrivers.adapter as DriverAdapter)
@ -93,7 +93,7 @@ class DriverManagerFragment : Fragment() {
repeatOnLifecycle(Lifecycle.State.STARTED) { repeatOnLifecycle(Lifecycle.State.STARTED) {
driverViewModel.showClearButton.collect { driverViewModel.showClearButton.collect {
binding.toolbarDrivers.menu binding.toolbarDrivers.menu
.findItem(R.id.menu_driver_use_global).isVisible = it .findItem(R.id.menu_driver_clear).isVisible = it
} }
} }
} }
@ -173,11 +173,11 @@ class DriverManagerFragment : Fragment() {
return@registerForActivityResult return@registerForActivityResult
} }
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
requireActivity(), requireActivity(),
R.string.installing_driver, R.string.installing_driver,
false false
) { _, _ -> ) {
val driverPath = val driverPath =
"${GpuDriverHelper.driverStoragePath}${FileUtil.getFilename(result)}" "${GpuDriverHelper.driverStoragePath}${FileUtil.getFilename(result)}"
val driverFile = File(driverPath) val driverFile = File(driverPath)
@ -213,6 +213,6 @@ class DriverManagerFragment : Fragment() {
} }
} }
return@newInstance Any() return@newInstance Any()
}.show(childFragmentManager, ProgressDialogFragment.TAG) }.show(childFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
} }

View File

@ -141,9 +141,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
// So this fragment doesn't restart on configuration changes; i.e. rotation. // So this fragment doesn't restart on configuration changes; i.e. rotation.
retainInstance = true retainInstance = true
emulationState = EmulationState(game.path) { emulationState = EmulationState(game.path)
return@EmulationState driverViewModel.isInteractionAllowed.value
}
} }
/** /**
@ -184,14 +182,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
override fun onDrawerOpened(drawerView: View) { override fun onDrawerOpened(drawerView: View) {
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) // No op
binding.inGameMenu.requestFocus()
emulationViewModel.setDrawerOpen(true)
} }
override fun onDrawerClosed(drawerView: View) { override fun onDrawerClosed(drawerView: View) {
binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt()) // No op
emulationViewModel.setDrawerOpen(false)
} }
override fun onDrawerStateChanged(newState: Int) { override fun onDrawerStateChanged(newState: Int) {
@ -201,28 +196,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text = binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text =
game.title game.title
binding.inGameMenu.menu.findItem(R.id.menu_lock_drawer).apply {
val lockMode = IntSetting.LOCK_DRAWER.getInt()
val titleId = if (lockMode == DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
R.string.unlock_drawer
} else {
R.string.lock_drawer
}
val iconId = if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED) {
R.drawable.ic_unlock
} else {
R.drawable.ic_lock
}
title = getString(titleId)
icon = ResourcesCompat.getDrawable(
resources,
iconId,
requireContext().theme
)
}
binding.inGameMenu.setNavigationItemSelectedListener { binding.inGameMenu.setNavigationItemSelectedListener {
when (it.itemId) { when (it.itemId) {
R.id.menu_pause_emulation -> { R.id.menu_pause_emulation -> {
@ -243,7 +216,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
requireContext().theme requireContext().theme
) )
} }
binding.inGameMenu.requestFocus()
true true
} }
@ -252,7 +224,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
null, null,
Settings.MenuTag.SECTION_ROOT Settings.MenuTag.SECTION_ROOT
) )
binding.inGameMenu.requestFocus()
binding.root.findNavController().navigate(action) binding.root.findNavController().navigate(action)
true true
} }
@ -262,7 +233,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
args.game, args.game,
Settings.MenuTag.SECTION_ROOT Settings.MenuTag.SECTION_ROOT
) )
binding.inGameMenu.requestFocus()
binding.root.findNavController().navigate(action) binding.root.findNavController().navigate(action)
true true
} }
@ -272,39 +242,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
true true
} }
R.id.menu_lock_drawer -> {
when (IntSetting.LOCK_DRAWER.getInt()) {
DrawerLayout.LOCK_MODE_UNLOCKED -> {
IntSetting.LOCK_DRAWER.setInt(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
it.title = resources.getString(R.string.unlock_drawer)
it.icon = ResourcesCompat.getDrawable(
resources,
R.drawable.ic_lock,
requireContext().theme
)
}
DrawerLayout.LOCK_MODE_LOCKED_CLOSED -> {
IntSetting.LOCK_DRAWER.setInt(DrawerLayout.LOCK_MODE_UNLOCKED)
it.title = resources.getString(R.string.lock_drawer)
it.icon = ResourcesCompat.getDrawable(
resources,
R.drawable.ic_unlock,
requireContext().theme
)
}
}
binding.inGameMenu.requestFocus()
NativeConfig.saveGlobalConfig()
true
}
R.id.menu_exit -> { R.id.menu_exit -> {
emulationState.stop() emulationState.stop()
NativeConfig.reloadGlobalConfig()
emulationViewModel.setIsEmulationStopping(true) emulationViewModel.setIsEmulationStopping(true)
binding.drawerLayout.close() binding.drawerLayout.close()
binding.inGameMenu.requestFocus() binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
true true
} }
@ -321,7 +263,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
if (!NativeLibrary.isRunning()) { if (!NativeLibrary.isRunning()) {
return return
} }
emulationViewModel.setDrawerOpen(!binding.drawerLayout.isOpen)
if (binding.drawerLayout.isOpen) {
binding.drawerLayout.close()
} else {
binding.drawerLayout.open()
}
} }
} }
) )
@ -375,20 +322,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
} }
} }
launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
driverViewModel.isInteractionAllowed.collect {
if (it) {
startEmulation()
}
}
}
}
launch { launch {
repeatOnLifecycle(Lifecycle.State.CREATED) { repeatOnLifecycle(Lifecycle.State.CREATED) {
emulationViewModel.emulationStarted.collectLatest { emulationViewModel.emulationStarted.collectLatest {
if (it) { if (it) {
binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt()) binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
ViewUtils.showView(binding.surfaceInputOverlay) ViewUtils.showView(binding.surfaceInputOverlay)
ViewUtils.hideView(binding.loadingIndicator) ViewUtils.hideView(binding.loadingIndicator)
@ -413,41 +351,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
} }
launch { launch {
repeatOnLifecycle(Lifecycle.State.CREATED) { repeatOnLifecycle(Lifecycle.State.RESUMED) {
emulationViewModel.drawerOpen.collect { driverViewModel.isInteractionAllowed.collect {
if (it) { if (it) {
binding.drawerLayout.open() onEmulationStart()
binding.inGameMenu.requestFocus()
} else {
binding.drawerLayout.close()
}
}
}
}
launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
emulationViewModel.programChanged.collect {
if (it != 0) {
emulationViewModel.setEmulationStarted(false)
binding.drawerLayout.close()
binding.drawerLayout
.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
ViewUtils.hideView(binding.surfaceInputOverlay)
ViewUtils.showView(binding.loadingIndicator)
}
}
}
}
launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
emulationViewModel.emulationStopped.collect {
if (it && emulationViewModel.programChanged.value != -1) {
if (perfStatsUpdater != null) {
perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!)
}
emulationState.changeProgram(emulationViewModel.programChanged.value)
emulationViewModel.setProgramChanged(-1)
emulationViewModel.setEmulationStopped(false)
} }
} }
} }
@ -455,7 +362,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
} }
private fun startEmulation(programIndex: Int = 0) { private fun onEmulationStart() {
if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) { if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) {
if (!DirectoryInitialization.areDirectoriesReady) { if (!DirectoryInitialization.areDirectoriesReady) {
DirectoryInitialization.start() DirectoryInitialization.start()
@ -463,7 +370,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
updateScreenLayout() updateScreenLayout()
emulationState.run(emulationActivity!!.isActivityRecreated, programIndex) emulationState.run(emulationActivity!!.isActivityRecreated)
} }
} }
@ -530,15 +437,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
val FRAMETIME = 2 val FRAMETIME = 2
val SPEED = 3 val SPEED = 3
perfStatsUpdater = { perfStatsUpdater = {
if (emulationViewModel.emulationStarted.value && if (emulationViewModel.emulationStarted.value) {
!emulationViewModel.isEmulationStopping.value
) {
val perfStats = NativeLibrary.getPerfStats() val perfStats = NativeLibrary.getPerfStats()
val cpuBackend = NativeLibrary.getCpuBackend() val cpuBackend = NativeLibrary.getCpuBackend()
val gpuDriver = NativeLibrary.getGpuDriver()
if (_binding != null) { if (_binding != null) {
binding.showFpsText.text = binding.showFpsText.text =
String.format("FPS: %.1f\n%s/%s", perfStats[FPS], cpuBackend, gpuDriver) String.format("FPS: %.1f\n%s", perfStats[FPS], cpuBackend)
} }
perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800) perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
} }
@ -650,7 +554,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
findItem(R.id.menu_touchscreen).isChecked = BooleanSetting.TOUCHSCREEN.getBoolean() findItem(R.id.menu_touchscreen).isChecked = BooleanSetting.TOUCHSCREEN.getBoolean()
} }
popup.setOnDismissListener { NativeConfig.saveGlobalConfig() }
popup.setOnMenuItemClickListener { popup.setOnMenuItemClickListener {
when (it.itemId) { when (it.itemId) {
R.id.menu_toggle_fps -> { R.id.menu_toggle_fps -> {
@ -817,9 +720,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
MaterialAlertDialogBuilder(requireContext()) MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.emulation_control_adjust) .setTitle(R.string.emulation_control_adjust)
.setView(adjustBinding.root) .setView(adjustBinding.root)
.setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> .setPositiveButton(android.R.string.ok, null)
NativeConfig.saveGlobalConfig()
}
.setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int -> .setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int ->
setControlScale(50) setControlScale(50)
setControlOpacity(100) setControlOpacity(100)
@ -855,13 +756,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
} }
private class EmulationState( private class EmulationState(private val gamePath: String) {
private val gamePath: String,
private val emulationCanStart: () -> Boolean
) {
private var state: State private var state: State
private var surface: Surface? = null private var surface: Surface? = null
lateinit var emulationThread: Thread
init { init {
// Starting state is stopped. // Starting state is stopped.
@ -907,7 +804,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
@Synchronized @Synchronized
fun run(isActivityRecreated: Boolean, programIndex: Int = 0) { fun run(isActivityRecreated: Boolean) {
if (isActivityRecreated) { if (isActivityRecreated) {
if (NativeLibrary.isRunning()) { if (NativeLibrary.isRunning()) {
state = State.PAUSED state = State.PAUSED
@ -918,20 +815,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
// If the surface is set, run now. Otherwise, wait for it to get set. // If the surface is set, run now. Otherwise, wait for it to get set.
if (surface != null) { if (surface != null) {
runWithValidSurface(programIndex) runWithValidSurface()
} }
} }
@Synchronized
fun changeProgram(programIndex: Int) {
emulationThread.join()
emulationThread = Thread({
Log.debug("[EmulationFragment] Starting emulation thread.")
NativeLibrary.run(gamePath, programIndex)
}, "NativeEmulation")
emulationThread.start()
}
// Surface callbacks // Surface callbacks
@Synchronized @Synchronized
fun newSurface(surface: Surface?) { fun newSurface(surface: Surface?) {
@ -963,7 +850,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
State.PAUSED -> Log.warning( State.PAUSED -> Log.warning(
"[EmulationFragment] Surface cleared while emulation paused." "[EmulationFragment] Surface cleared while emulation paused."
) )
else -> Log.warning( else -> Log.warning(
"[EmulationFragment] Surface cleared while emulation stopped." "[EmulationFragment] Surface cleared while emulation stopped."
) )
@ -971,17 +857,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
} }
private fun runWithValidSurface(programIndex: Int = 0) { private fun runWithValidSurface() {
NativeLibrary.surfaceChanged(surface) NativeLibrary.surfaceChanged(surface)
if (!emulationCanStart.invoke()) {
return
}
when (state) { when (state) {
State.STOPPED -> { State.STOPPED -> {
emulationThread = Thread({ val emulationThread = Thread({
Log.debug("[EmulationFragment] Starting emulation thread.") Log.debug("[EmulationFragment] Starting emulation thread.")
NativeLibrary.run(gamePath, programIndex) NativeLibrary.run(gamePath)
}, "NativeEmulation") }, "NativeEmulation")
emulationThread.start() emulationThread.start()
} }

View File

@ -21,10 +21,8 @@ import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.google.android.material.transition.MaterialSharedAxis import com.google.android.material.transition.MaterialSharedAxis
import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
import org.yuzu.yuzu_emu.model.GameVerificationResult
import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.GameMetadata import org.yuzu.yuzu_emu.utils.GameMetadata
@ -103,38 +101,6 @@ class GameInfoFragment : Fragment() {
""".trimIndent() """.trimIndent()
copyToClipboard(args.game.title, details) copyToClipboard(args.game.title, details)
} }
buttonVerifyIntegrity.setOnClickListener {
ProgressDialogFragment.newInstance(
requireActivity(),
R.string.verifying,
true
) { progressCallback, _ ->
val result = GameVerificationResult.from(
NativeLibrary.verifyGameContents(
args.game.path,
progressCallback
)
)
return@newInstance when (result) {
GameVerificationResult.Success ->
MessageDialogFragment.newInstance(
titleId = R.string.verify_success,
descriptionId = R.string.operation_completed_successfully
)
GameVerificationResult.Failed ->
MessageDialogFragment.newInstance(
titleId = R.string.verify_failure,
descriptionId = R.string.verify_failure_description
)
GameVerificationResult.NotImplemented ->
MessageDialogFragment.newInstance(
titleId = R.string.verify_no_result,
descriptionId = R.string.verify_no_result_description
)
}
}.show(parentFragmentManager, ProgressDialogFragment.TAG)
}
} }
setInsets() setInsets()

View File

@ -4,8 +4,6 @@
package org.yuzu.yuzu_emu.fragments package org.yuzu.yuzu_emu.fragments
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils import android.text.TextUtils
import android.view.LayoutInflater import android.view.LayoutInflater
@ -46,6 +44,7 @@ import org.yuzu.yuzu_emu.utils.FileUtil
import org.yuzu.yuzu_emu.utils.GameIconUtils import org.yuzu.yuzu_emu.utils.GameIconUtils
import org.yuzu.yuzu_emu.utils.GpuDriverHelper import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.MemoryUtil import org.yuzu.yuzu_emu.utils.MemoryUtil
import java.io.BufferedInputStream
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.File import java.io.File
@ -86,24 +85,6 @@ class GamePropertiesFragment : Fragment() {
view.findNavController().popBackStack() view.findNavController().popBackStack()
} }
val shortcutManager = requireActivity().getSystemService(ShortcutManager::class.java)
binding.buttonShortcut.isEnabled = shortcutManager.isRequestPinShortcutSupported
binding.buttonShortcut.setOnClickListener {
viewLifecycleOwner.lifecycleScope.launch {
withContext(Dispatchers.IO) {
val shortcut = ShortcutInfo.Builder(requireContext(), args.game.title)
.setShortLabel(args.game.title)
.setIcon(
GameIconUtils.getShortcutIcon(requireActivity(), args.game)
.toIcon(requireContext())
)
.setIntent(args.game.launchIntent)
.build()
shortcutManager.requestPinShortcut(shortcut, null)
}
}
}
GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen) GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen)
binding.title.text = args.game.title binding.title.text = args.game.title
binding.title.postDelayed( binding.title.postDelayed(
@ -376,17 +357,27 @@ class GamePropertiesFragment : Fragment() {
return@registerForActivityResult return@registerForActivityResult
} }
val inputZip = requireContext().contentResolver.openInputStream(result)
val savesFolder = File(args.game.saveDir) val savesFolder = File(args.game.saveDir)
val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/") val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/")
cacheSaveDir.mkdir() cacheSaveDir.mkdir()
ProgressDialogFragment.newInstance( if (inputZip == null) {
Toast.makeText(
YuzuApplication.appContext,
getString(R.string.fatal_error),
Toast.LENGTH_LONG
).show()
return@registerForActivityResult
}
IndeterminateProgressDialogFragment.newInstance(
requireActivity(), requireActivity(),
R.string.save_files_importing, R.string.save_files_importing,
false false
) { _, _ -> ) {
try { try {
FileUtil.unzipToInternalStorage(result.toString(), cacheSaveDir) FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheSaveDir)
val files = cacheSaveDir.listFiles() val files = cacheSaveDir.listFiles()
var savesFolderFile: File? = null var savesFolderFile: File? = null
if (files != null) { if (files != null) {
@ -431,7 +422,7 @@ class GamePropertiesFragment : Fragment() {
Toast.LENGTH_LONG Toast.LENGTH_LONG
).show() ).show()
} }
}.show(parentFragmentManager, ProgressDialogFragment.TAG) }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
/** /**
@ -445,11 +436,11 @@ class GamePropertiesFragment : Fragment() {
return@registerForActivityResult return@registerForActivityResult
} }
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
requireActivity(), requireActivity(),
R.string.save_files_exporting, R.string.save_files_exporting,
false false
) { _, _ -> ) {
val saveLocation = args.game.saveDir val saveLocation = args.game.saveDir
val zipResult = FileUtil.zipFromInternalStorage( val zipResult = FileUtil.zipFromInternalStorage(
File(saveLocation), File(saveLocation),
@ -461,6 +452,6 @@ class GamePropertiesFragment : Fragment() {
TaskState.Completed -> getString(R.string.export_success) TaskState.Completed -> getString(R.string.export_success)
TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed) TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed)
} }
}.show(parentFragmentManager, ProgressDialogFragment.TAG) }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
} }

View File

@ -32,7 +32,6 @@ import org.yuzu.yuzu_emu.BuildConfig
import org.yuzu.yuzu_emu.HomeNavigationDirections import org.yuzu.yuzu_emu.HomeNavigationDirections
import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter
import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding
import org.yuzu.yuzu_emu.features.DocumentProvider import org.yuzu.yuzu_emu.features.DocumentProvider
@ -141,44 +140,6 @@ class HomeSettingsFragment : Fragment() {
} }
) )
) )
add(
HomeSetting(
R.string.verify_installed_content,
R.string.verify_installed_content_description,
R.drawable.ic_check_circle,
{
ProgressDialogFragment.newInstance(
requireActivity(),
titleId = R.string.verifying,
cancellable = true
) { progressCallback, _ ->
val result = NativeLibrary.verifyInstalledContents(progressCallback)
return@newInstance if (progressCallback.invoke(100, 100)) {
// Invoke the progress callback to check if the process was cancelled
MessageDialogFragment.newInstance(
titleId = R.string.verify_no_result,
descriptionId = R.string.verify_no_result_description
)
} else if (result.isEmpty()) {
MessageDialogFragment.newInstance(
titleId = R.string.verify_success,
descriptionId = R.string.operation_completed_successfully
)
} else {
val failedNames = result.joinToString("\n")
val errorMessage = YuzuApplication.appContext.getString(
R.string.verification_failed_for,
failedNames
)
MessageDialogFragment.newInstance(
titleId = R.string.verify_failure,
descriptionString = errorMessage
)
}
}.show(parentFragmentManager, ProgressDialogFragment.TAG)
}
)
)
add( add(
HomeSetting( HomeSetting(
R.string.share_log, R.string.share_log,

View File

@ -23,13 +23,11 @@ import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
import org.yuzu.yuzu_emu.model.TaskViewModel import org.yuzu.yuzu_emu.model.TaskViewModel
class ProgressDialogFragment : DialogFragment() { class IndeterminateProgressDialogFragment : DialogFragment() {
private val taskViewModel: TaskViewModel by activityViewModels() private val taskViewModel: TaskViewModel by activityViewModels()
private lateinit var binding: DialogProgressBarBinding private lateinit var binding: DialogProgressBarBinding
private val PROGRESS_BAR_RESOLUTION = 1000
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val titleId = requireArguments().getInt(TITLE) val titleId = requireArguments().getInt(TITLE)
val cancellable = requireArguments().getBoolean(CANCELLABLE) val cancellable = requireArguments().getBoolean(CANCELLABLE)
@ -63,7 +61,6 @@ class ProgressDialogFragment : DialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.message.isSelected = true
viewLifecycleOwner.lifecycleScope.apply { viewLifecycleOwner.lifecycleScope.apply {
launch { launch {
repeatOnLifecycle(Lifecycle.State.CREATED) { repeatOnLifecycle(Lifecycle.State.CREATED) {
@ -100,35 +97,6 @@ class ProgressDialogFragment : DialogFragment() {
} }
} }
} }
launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
taskViewModel.progress.collect {
if (it != 0.0) {
binding.progressBar.apply {
isIndeterminate = false
progress = (
(it / taskViewModel.maxProgress.value) *
PROGRESS_BAR_RESOLUTION
).toInt()
min = 0
max = PROGRESS_BAR_RESOLUTION
}
}
}
}
}
launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
taskViewModel.message.collect {
if (it.isEmpty()) {
binding.message.visibility = View.GONE
} else {
binding.message.visibility = View.VISIBLE
binding.message.text = it
}
}
}
}
} }
} }
@ -140,7 +108,6 @@ class ProgressDialogFragment : DialogFragment() {
val negativeButton = alertDialog.getButton(Dialog.BUTTON_NEGATIVE) val negativeButton = alertDialog.getButton(Dialog.BUTTON_NEGATIVE)
negativeButton.setOnClickListener { negativeButton.setOnClickListener {
alertDialog.setTitle(getString(R.string.cancelling)) alertDialog.setTitle(getString(R.string.cancelling))
binding.progressBar.isIndeterminate = true
taskViewModel.setCancelled(true) taskViewModel.setCancelled(true)
} }
} }
@ -155,12 +122,9 @@ class ProgressDialogFragment : DialogFragment() {
activity: FragmentActivity, activity: FragmentActivity,
titleId: Int, titleId: Int,
cancellable: Boolean = false, cancellable: Boolean = false,
task: suspend ( task: suspend () -> Any
progressCallback: (max: Long, progress: Long) -> Boolean, ): IndeterminateProgressDialogFragment {
messageCallback: (message: String) -> Unit val dialog = IndeterminateProgressDialogFragment()
) -> Any
): ProgressDialogFragment {
val dialog = ProgressDialogFragment()
val args = Bundle() val args = Bundle()
ViewModelProvider(activity)[TaskViewModel::class.java].task = task ViewModelProvider(activity)[TaskViewModel::class.java].task = task
args.putInt(TITLE, titleId) args.putInt(TITLE, titleId)

View File

@ -34,6 +34,7 @@ import org.yuzu.yuzu_emu.model.TaskState
import org.yuzu.yuzu_emu.ui.main.MainActivity import org.yuzu.yuzu_emu.ui.main.MainActivity
import org.yuzu.yuzu_emu.utils.DirectoryInitialization import org.yuzu.yuzu_emu.utils.DirectoryInitialization
import org.yuzu.yuzu_emu.utils.FileUtil import org.yuzu.yuzu_emu.utils.FileUtil
import java.io.BufferedInputStream
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.File import java.io.File
import java.math.BigInteger import java.math.BigInteger
@ -194,20 +195,26 @@ class InstallableFragment : Fragment() {
return@registerForActivityResult return@registerForActivityResult
} }
val inputZip = requireContext().contentResolver.openInputStream(result)
val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/") val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/")
cacheSaveDir.mkdir() cacheSaveDir.mkdir()
ProgressDialogFragment.newInstance( if (inputZip == null) {
Toast.makeText(
YuzuApplication.appContext,
getString(R.string.fatal_error),
Toast.LENGTH_LONG
).show()
return@registerForActivityResult
}
IndeterminateProgressDialogFragment.newInstance(
requireActivity(), requireActivity(),
R.string.save_files_importing, R.string.save_files_importing,
false false
) { progressCallback, _ -> ) {
try { try {
FileUtil.unzipToInternalStorage( FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheSaveDir)
result.toString(),
cacheSaveDir,
progressCallback
)
val files = cacheSaveDir.listFiles() val files = cacheSaveDir.listFiles()
var successfulImports = 0 var successfulImports = 0
var failedImports = 0 var failedImports = 0
@ -280,7 +287,7 @@ class InstallableFragment : Fragment() {
Toast.LENGTH_LONG Toast.LENGTH_LONG
).show() ).show()
} }
}.show(parentFragmentManager, ProgressDialogFragment.TAG) }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
private val exportSaves = registerForActivityResult( private val exportSaves = registerForActivityResult(
@ -290,11 +297,11 @@ class InstallableFragment : Fragment() {
return@registerForActivityResult return@registerForActivityResult
} }
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
requireActivity(), requireActivity(),
R.string.save_files_exporting, R.string.save_files_exporting,
false false
) { _, _ -> ) {
val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/") val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/")
cacheSaveDir.mkdir() cacheSaveDir.mkdir()
@ -331,6 +338,6 @@ class InstallableFragment : Fragment() {
TaskState.Completed -> getString(R.string.export_success) TaskState.Completed -> getString(R.string.export_success)
TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed) TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed)
} }
}.show(parentFragmentManager, ProgressDialogFragment.TAG) }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
} }

View File

@ -26,15 +26,9 @@ class MessageDialogFragment : DialogFragment() {
val descriptionId = requireArguments().getInt(DESCRIPTION_ID) val descriptionId = requireArguments().getInt(DESCRIPTION_ID)
val descriptionString = requireArguments().getString(DESCRIPTION_STRING)!! val descriptionString = requireArguments().getString(DESCRIPTION_STRING)!!
val helpLinkId = requireArguments().getInt(HELP_LINK) val helpLinkId = requireArguments().getInt(HELP_LINK)
val dismissible = requireArguments().getBoolean(DISMISSIBLE)
val clearPositiveAction = requireArguments().getBoolean(CLEAR_POSITIVE_ACTION)
val builder = MaterialAlertDialogBuilder(requireContext()) val builder = MaterialAlertDialogBuilder(requireContext())
if (clearPositiveAction) {
messageDialogViewModel.positiveAction = null
}
if (messageDialogViewModel.positiveAction == null) { if (messageDialogViewModel.positiveAction == null) {
builder.setPositiveButton(R.string.close, null) builder.setPositiveButton(R.string.close, null)
} else { } else {
@ -57,8 +51,6 @@ class MessageDialogFragment : DialogFragment() {
} }
} }
isCancelable = dismissible
return builder.show() return builder.show()
} }
@ -75,38 +67,28 @@ class MessageDialogFragment : DialogFragment() {
private const val DESCRIPTION_ID = "DescriptionId" private const val DESCRIPTION_ID = "DescriptionId"
private const val DESCRIPTION_STRING = "DescriptionString" private const val DESCRIPTION_STRING = "DescriptionString"
private const val HELP_LINK = "Link" private const val HELP_LINK = "Link"
private const val DISMISSIBLE = "Dismissible"
private const val CLEAR_POSITIVE_ACTION = "ClearPositiveAction"
fun newInstance( fun newInstance(
activity: FragmentActivity? = null, activity: FragmentActivity,
titleId: Int = 0, titleId: Int = 0,
titleString: String = "", titleString: String = "",
descriptionId: Int = 0, descriptionId: Int = 0,
descriptionString: String = "", descriptionString: String = "",
helpLinkId: Int = 0, helpLinkId: Int = 0,
dismissible: Boolean = true,
positiveAction: (() -> Unit)? = null positiveAction: (() -> Unit)? = null
): MessageDialogFragment { ): MessageDialogFragment {
var clearPositiveAction = false
if (activity != null) {
ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply {
clear()
this.positiveAction = positiveAction
}
} else {
clearPositiveAction = true
}
val dialog = MessageDialogFragment() val dialog = MessageDialogFragment()
val bundle = Bundle().apply { val bundle = Bundle()
bundle.apply {
putInt(TITLE_ID, titleId) putInt(TITLE_ID, titleId)
putString(TITLE_STRING, titleString) putString(TITLE_STRING, titleString)
putInt(DESCRIPTION_ID, descriptionId) putInt(DESCRIPTION_ID, descriptionId)
putString(DESCRIPTION_STRING, descriptionString) putString(DESCRIPTION_STRING, descriptionString)
putInt(HELP_LINK, helpLinkId) putInt(HELP_LINK, helpLinkId)
putBoolean(DISMISSIBLE, dismissible) }
putBoolean(CLEAR_POSITIVE_ACTION, clearPositiveAction) ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply {
clear()
this.positiveAction = positiveAction
} }
dialog.arguments = bundle dialog.arguments = bundle
return dialog return dialog

View File

@ -136,14 +136,14 @@ class SearchFragment : Fragment() {
baseList.filter { baseList.filter {
val lastPlayedTime = preferences.getLong(it.keyLastPlayedTime, 0L) val lastPlayedTime = preferences.getLong(it.keyLastPlayedTime, 0L)
lastPlayedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000) lastPlayedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000)
}.sortedByDescending { preferences.getLong(it.keyLastPlayedTime, 0L) } }
} }
R.id.chip_recently_added -> { R.id.chip_recently_added -> {
baseList.filter { baseList.filter {
val addedTime = preferences.getLong(it.keyAddedToLibraryTime, 0L) val addedTime = preferences.getLong(it.keyAddedToLibraryTime, 0L)
addedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000) addedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000)
}.sortedByDescending { preferences.getLong(it.keyAddedToLibraryTime, 0L) } }
} }
R.id.chip_homebrew -> baseList.filter { it.isHomebrew } R.id.chip_homebrew -> baseList.filter { it.isHomebrew }

View File

@ -31,7 +31,6 @@ import androidx.preference.PreferenceManager
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.google.android.material.transition.MaterialFadeThrough import com.google.android.material.transition.MaterialFadeThrough
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.yuzu.yuzu_emu.NativeLibrary
import java.io.File import java.io.File
import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.YuzuApplication
@ -163,7 +162,7 @@ class SetupFragment : Fragment() {
R.string.install_prod_keys_warning_help, R.string.install_prod_keys_warning_help,
{ {
val file = File(DirectoryInitialization.userDirectory + "/keys/prod.keys") val file = File(DirectoryInitialization.userDirectory + "/keys/prod.keys")
if (file.exists() && NativeLibrary.areKeysPresent()) { if (file.exists()) {
StepState.COMPLETE StepState.COMPLETE
} else { } else {
StepState.INCOMPLETE StepState.INCOMPLETE
@ -348,8 +347,7 @@ class SetupFragment : Fragment() {
val getProdKey = val getProdKey =
registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> registerForActivityResult(ActivityResultContracts.OpenDocument()) { result ->
if (result != null) { if (result != null) {
mainActivity.processKey(result) if (mainActivity.processKey(result)) {
if (NativeLibrary.areKeysPresent()) {
keyCallback.onStepCompleted() keyCallback.onStepCompleted()
} }
} }

View File

@ -0,0 +1,10 @@
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
package org.yuzu.yuzu_emu.model
data class Addon(
var enabled: Boolean,
val title: String,
val version: String
)

View File

@ -15,8 +15,8 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
class AddonViewModel : ViewModel() { class AddonViewModel : ViewModel() {
private val _patchList = MutableStateFlow(mutableListOf<Patch>()) private val _addonList = MutableStateFlow(mutableListOf<Addon>())
val addonList get() = _patchList.asStateFlow() val addonList get() = _addonList.asStateFlow()
private val _showModInstallPicker = MutableStateFlow(false) private val _showModInstallPicker = MutableStateFlow(false)
val showModInstallPicker get() = _showModInstallPicker.asStateFlow() val showModInstallPicker get() = _showModInstallPicker.asStateFlow()
@ -24,9 +24,6 @@ class AddonViewModel : ViewModel() {
private val _showModNoticeDialog = MutableStateFlow(false) private val _showModNoticeDialog = MutableStateFlow(false)
val showModNoticeDialog get() = _showModNoticeDialog.asStateFlow() val showModNoticeDialog get() = _showModNoticeDialog.asStateFlow()
private val _addonToDelete = MutableStateFlow<Patch?>(null)
val addonToDelete = _addonToDelete.asStateFlow()
var game: Game? = null var game: Game? = null
private val isRefreshing = AtomicBoolean(false) private val isRefreshing = AtomicBoolean(false)
@ -43,47 +40,36 @@ class AddonViewModel : ViewModel() {
isRefreshing.set(true) isRefreshing.set(true)
viewModelScope.launch { viewModelScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val patchList = ( val addonList = mutableListOf<Addon>()
NativeLibrary.getPatchesForFile(game!!.path, game!!.programId) val disabledAddons = NativeConfig.getDisabledAddons(game!!.programId)
?: emptyArray() NativeLibrary.getAddonsForFile(game!!.path, game!!.programId)?.forEach {
).toMutableList() val name = it.first.replace("[D] ", "")
patchList.sortBy { it.name } addonList.add(Addon(!disabledAddons.contains(name), name, it.second))
_patchList.value = patchList }
addonList.sortBy { it.title }
_addonList.value = addonList
isRefreshing.set(false) isRefreshing.set(false)
} }
} }
} }
fun setAddonToDelete(patch: Patch?) {
_addonToDelete.value = patch
}
fun onDeleteAddon(patch: Patch) {
when (PatchType.from(patch.type)) {
PatchType.Update -> NativeLibrary.removeUpdate(patch.programId)
PatchType.DLC -> NativeLibrary.removeDLC(patch.programId)
PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name)
}
refreshAddons()
}
fun onCloseAddons() { fun onCloseAddons() {
if (_patchList.value.isEmpty()) { if (_addonList.value.isEmpty()) {
return return
} }
NativeConfig.setDisabledAddons( NativeConfig.setDisabledAddons(
game!!.programId, game!!.programId,
_patchList.value.mapNotNull { _addonList.value.mapNotNull {
if (it.enabled) { if (it.enabled) {
null null
} else { } else {
it.name it.title
} }
}.toTypedArray() }.toTypedArray()
) )
NativeConfig.saveGlobalConfig() NativeConfig.saveGlobalConfig()
_patchList.value.clear() _addonList.value.clear()
game = null game = null
} }

View File

@ -66,13 +66,10 @@ class DriverViewModel : ViewModel() {
fun updateDriverList() { fun updateDriverList() {
val selectedDriver = GpuDriverHelper.customDriverSettingData val selectedDriver = GpuDriverHelper.customDriverSettingData
val systemDriverData = GpuDriverHelper.getSystemDriverInfo()
val newDriverList = mutableListOf( val newDriverList = mutableListOf(
Driver( Driver(
selectedDriver == GpuDriverMetadata(), selectedDriver == GpuDriverMetadata(),
YuzuApplication.appContext.getString(R.string.system_gpu_driver), YuzuApplication.appContext.getString(R.string.system_gpu_driver)
systemDriverData?.get(0) ?: "",
systemDriverData?.get(1) ?: ""
) )
) )
driverData.forEach { driverData.forEach {
@ -147,7 +144,6 @@ class DriverViewModel : ViewModel() {
val selectedDriverFile = File(StringSetting.DRIVER_PATH.getString()) val selectedDriverFile = File(StringSetting.DRIVER_PATH.getString())
val selectedDriverMetadata = GpuDriverHelper.customDriverSettingData val selectedDriverMetadata = GpuDriverHelper.customDriverSettingData
if (GpuDriverHelper.installedCustomDriverData == selectedDriverMetadata) { if (GpuDriverHelper.installedCustomDriverData == selectedDriverMetadata) {
setDriverReady()
return return
} }

View File

@ -6,7 +6,6 @@ package org.yuzu.yuzu_emu.model
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
class EmulationViewModel : ViewModel() { class EmulationViewModel : ViewModel() {
val emulationStarted: StateFlow<Boolean> get() = _emulationStarted val emulationStarted: StateFlow<Boolean> get() = _emulationStarted
@ -15,12 +14,6 @@ class EmulationViewModel : ViewModel() {
val isEmulationStopping: StateFlow<Boolean> get() = _isEmulationStopping val isEmulationStopping: StateFlow<Boolean> get() = _isEmulationStopping
private val _isEmulationStopping = MutableStateFlow(false) private val _isEmulationStopping = MutableStateFlow(false)
private val _emulationStopped = MutableStateFlow(false)
val emulationStopped = _emulationStopped.asStateFlow()
private val _programChanged = MutableStateFlow(-1)
val programChanged = _programChanged.asStateFlow()
val shaderProgress: StateFlow<Int> get() = _shaderProgress val shaderProgress: StateFlow<Int> get() = _shaderProgress
private val _shaderProgress = MutableStateFlow(0) private val _shaderProgress = MutableStateFlow(0)
@ -30,9 +23,6 @@ class EmulationViewModel : ViewModel() {
val shaderMessage: StateFlow<String> get() = _shaderMessage val shaderMessage: StateFlow<String> get() = _shaderMessage
private val _shaderMessage = MutableStateFlow("") private val _shaderMessage = MutableStateFlow("")
private val _drawerOpen = MutableStateFlow(false)
val drawerOpen = _drawerOpen.asStateFlow()
fun setEmulationStarted(started: Boolean) { fun setEmulationStarted(started: Boolean) {
_emulationStarted.value = started _emulationStarted.value = started
} }
@ -41,17 +31,6 @@ class EmulationViewModel : ViewModel() {
_isEmulationStopping.value = value _isEmulationStopping.value = value
} }
fun setEmulationStopped(value: Boolean) {
if (value) {
_emulationStarted.value = false
}
_emulationStopped.value = value
}
fun setProgramChanged(programIndex: Int) {
_programChanged.value = programIndex
}
fun setShaderProgress(progress: Int) { fun setShaderProgress(progress: Int) {
_shaderProgress.value = progress _shaderProgress.value = progress
} }
@ -70,7 +49,19 @@ class EmulationViewModel : ViewModel() {
setTotalShaders(max) setTotalShaders(max)
} }
fun setDrawerOpen(value: Boolean) { fun clear() {
_drawerOpen.value = value setEmulationStarted(false)
setIsEmulationStopping(false)
setShaderProgress(0)
setTotalShaders(0)
setShaderMessage("")
}
companion object {
const val KEY_EMULATION_STARTED = "EmulationStarted"
const val KEY_IS_EMULATION_STOPPING = "IsEmulationStarting"
const val KEY_SHADER_PROGRESS = "ShaderProgress"
const val KEY_TOTAL_SHADERS = "TotalShaders"
const val KEY_SHADER_MESSAGE = "ShaderMessage"
} }
} }

View File

@ -3,7 +3,6 @@
package org.yuzu.yuzu_emu.model package org.yuzu.yuzu_emu.model
import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Parcelable import android.os.Parcelable
import java.util.HashSet import java.util.HashSet
@ -12,7 +11,6 @@ import kotlinx.serialization.Serializable
import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.activities.EmulationActivity
import org.yuzu.yuzu_emu.utils.DirectoryInitialization import org.yuzu.yuzu_emu.utils.DirectoryInitialization
import org.yuzu.yuzu_emu.utils.FileUtil import org.yuzu.yuzu_emu.utils.FileUtil
import java.time.LocalDateTime import java.time.LocalDateTime
@ -63,26 +61,12 @@ class Game(
val addonDir: String val addonDir: String
get() = DirectoryInitialization.userDirectory + "/load/" + programIdHex + "/" get() = DirectoryInitialization.userDirectory + "/load/" + programIdHex + "/"
val launchIntent: Intent override fun equals(other: Any?): Boolean {
get() = Intent(YuzuApplication.appContext, EmulationActivity::class.java).apply { if (other !is Game) {
action = Intent.ACTION_VIEW return false
data = Uri.parse(path)
} }
override fun equals(other: Any?): Boolean { return hashCode() == other.hashCode()
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Game
if (title != other.title) return false
if (path != other.path) return false
if (programId != other.programId) return false
if (developer != other.developer) return false
if (version != other.version) return false
if (isHomebrew != other.isHomebrew) return false
return true
} }
override fun hashCode(): Int { override fun hashCode(): Int {

View File

@ -1,15 +0,0 @@
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
package org.yuzu.yuzu_emu.model
enum class GameVerificationResult(val int: Int) {
Success(0),
Failed(1),
NotImplemented(2);
companion object {
fun from(int: Int): GameVerificationResult =
entries.firstOrNull { it.int == int } ?: Success
}
}

View File

@ -31,9 +31,6 @@ class HomeViewModel : ViewModel() {
private val _reloadPropertiesList = MutableStateFlow(false) private val _reloadPropertiesList = MutableStateFlow(false)
val reloadPropertiesList get() = _reloadPropertiesList.asStateFlow() val reloadPropertiesList get() = _reloadPropertiesList.asStateFlow()
private val _checkKeys = MutableStateFlow(false)
val checkKeys = _checkKeys.asStateFlow()
var navigatedToSetup = false var navigatedToSetup = false
fun setNavigationVisibility(visible: Boolean, animated: Boolean) { fun setNavigationVisibility(visible: Boolean, animated: Boolean) {
@ -69,8 +66,4 @@ class HomeViewModel : ViewModel() {
fun reloadPropertiesList(reload: Boolean) { fun reloadPropertiesList(reload: Boolean) {
_reloadPropertiesList.value = reload _reloadPropertiesList.value = reload
} }
fun setCheckKeys(value: Boolean) {
_checkKeys.value = value
}
} }

View File

@ -1,15 +0,0 @@
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
package org.yuzu.yuzu_emu.model
enum class InstallResult(val int: Int) {
Success(0),
Overwrite(1),
Failure(2),
BaseInstallAttempted(3);
companion object {
fun from(int: Int): InstallResult = entries.firstOrNull { it.int == int } ?: Success
}
}

View File

@ -1,16 +0,0 @@
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
package org.yuzu.yuzu_emu.model
import androidx.annotation.Keep
@Keep
data class Patch(
var enabled: Boolean,
val name: String,
val version: String,
val type: Int,
val programId: String,
val titleId: String
)

View File

@ -1,14 +0,0 @@
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
package org.yuzu.yuzu_emu.model
enum class PatchType(val int: Int) {
Update(0),
DLC(1),
Mod(2);
companion object {
fun from(int: Int): PatchType = entries.firstOrNull { it.int == int } ?: Update
}
}

View File

@ -8,7 +8,6 @@ import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class TaskViewModel : ViewModel() { class TaskViewModel : ViewModel() {
@ -24,28 +23,13 @@ class TaskViewModel : ViewModel() {
val cancelled: StateFlow<Boolean> get() = _cancelled val cancelled: StateFlow<Boolean> get() = _cancelled
private val _cancelled = MutableStateFlow(false) private val _cancelled = MutableStateFlow(false)
private val _progress = MutableStateFlow(0.0) lateinit var task: suspend () -> Any
val progress = _progress.asStateFlow()
private val _maxProgress = MutableStateFlow(0.0)
val maxProgress = _maxProgress.asStateFlow()
private val _message = MutableStateFlow("")
val message = _message.asStateFlow()
lateinit var task: suspend (
progressCallback: (max: Long, progress: Long) -> Boolean,
messageCallback: (message: String) -> Unit
) -> Any
fun clear() { fun clear() {
_result.value = Any() _result.value = Any()
_isComplete.value = false _isComplete.value = false
_isRunning.value = false _isRunning.value = false
_cancelled.value = false _cancelled.value = false
_progress.value = 0.0
_maxProgress.value = 0.0
_message.value = ""
} }
fun setCancelled(value: Boolean) { fun setCancelled(value: Boolean) {
@ -59,16 +43,7 @@ class TaskViewModel : ViewModel() {
_isRunning.value = true _isRunning.value = true
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val res = task( val res = task()
{ max, progress ->
_maxProgress.value = max.toDouble()
_progress.value = progress.toDouble()
return@task cancelled.value
},
{ message ->
_message.value = message
}
)
_result.value = res _result.value = res
_isComplete.value = true _isComplete.value = true
_isRunning.value = false _isRunning.value = false

View File

@ -38,13 +38,12 @@ import org.yuzu.yuzu_emu.activities.EmulationActivity
import org.yuzu.yuzu_emu.databinding.ActivityMainBinding import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment
import org.yuzu.yuzu_emu.fragments.ProgressDialogFragment import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
import org.yuzu.yuzu_emu.model.AddonViewModel import org.yuzu.yuzu_emu.model.AddonViewModel
import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.DriverViewModel
import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.GamesViewModel
import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.model.InstallResult
import org.yuzu.yuzu_emu.model.TaskState import org.yuzu.yuzu_emu.model.TaskState
import org.yuzu.yuzu_emu.model.TaskViewModel import org.yuzu.yuzu_emu.model.TaskViewModel
import org.yuzu.yuzu_emu.utils.* import org.yuzu.yuzu_emu.utils.*
@ -64,9 +63,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
override var themeId: Int = 0 override var themeId: Int = 0
private val CHECKED_DECRYPTION = "CheckedDecryption"
private var checkedDecryption = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen() val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady } splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady }
@ -78,18 +74,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
binding = ActivityMainBinding.inflate(layoutInflater) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
if (savedInstanceState != null) {
checkedDecryption = savedInstanceState.getBoolean(CHECKED_DECRYPTION)
}
if (!checkedDecryption) {
val firstTimeSetup = PreferenceManager.getDefaultSharedPreferences(applicationContext)
.getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true)
if (!firstTimeSetup) {
checkKeys()
}
checkedDecryption = true
}
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING) window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
@ -165,16 +149,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
} }
} }
} }
launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
homeViewModel.checkKeys.collect {
if (it) {
checkKeys()
homeViewModel.setCheckKeys(false)
}
}
}
}
} }
// Dismiss previous notifications (should not happen unless a crash occurred) // Dismiss previous notifications (should not happen unless a crash occurred)
@ -183,21 +157,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
setInsets() setInsets()
} }
private fun checkKeys() {
if (!NativeLibrary.areKeysPresent()) {
MessageDialogFragment.newInstance(
titleId = R.string.keys_missing,
descriptionId = R.string.keys_missing_description,
helpLinkId = R.string.keys_missing_help
).show(supportFragmentManager, MessageDialogFragment.TAG)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(CHECKED_DECRYPTION, checkedDecryption)
}
fun finishSetup(navController: NavController) { fun finishSetup(navController: NavController) {
navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment) navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment)
(binding.navigationView as NavigationBarView).setupWithNavController(navController) (binding.navigationView as NavigationBarView).setupWithNavController(navController)
@ -389,7 +348,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
R.string.install_keys_success, R.string.install_keys_success,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
homeViewModel.setCheckKeys(true)
gamesViewModel.reloadGames(true) gamesViewModel.reloadGames(true)
return true return true
} else { } else {
@ -411,23 +369,26 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
return@registerForActivityResult return@registerForActivityResult
} }
val inputZip = contentResolver.openInputStream(result)
if (inputZip == null) {
Toast.makeText(
applicationContext,
getString(R.string.fatal_error),
Toast.LENGTH_LONG
).show()
return@registerForActivityResult
}
val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") } val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") }
val firmwarePath = val firmwarePath =
File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/") File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/")
val cacheFirmwareDir = File("${cacheDir.path}/registered/") val cacheFirmwareDir = File("${cacheDir.path}/registered/")
ProgressDialogFragment.newInstance( val task: () -> Any = {
this,
R.string.firmware_installing
) { progressCallback, _ ->
var messageToShow: Any var messageToShow: Any
try { try {
FileUtil.unzipToInternalStorage( FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheFirmwareDir)
result.toString(),
cacheFirmwareDir,
progressCallback
)
val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1
val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2
messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) { messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) {
@ -440,17 +401,21 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
firmwarePath.deleteRecursively() firmwarePath.deleteRecursively()
cacheFirmwareDir.copyRecursively(firmwarePath, true) cacheFirmwareDir.copyRecursively(firmwarePath, true)
NativeLibrary.initializeSystem(true) NativeLibrary.initializeSystem(true)
homeViewModel.setCheckKeys(true)
getString(R.string.save_file_imported_success) getString(R.string.save_file_imported_success)
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.error("[MainActivity] Firmware install failed - ${e.message}")
messageToShow = getString(R.string.fatal_error) messageToShow = getString(R.string.fatal_error)
} finally { } finally {
cacheFirmwareDir.deleteRecursively() cacheFirmwareDir.deleteRecursively()
} }
messageToShow messageToShow
}.show(supportFragmentManager, ProgressDialogFragment.TAG) }
IndeterminateProgressDialogFragment.newInstance(
this,
R.string.firmware_installing,
task = task
).show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
val getAmiiboKey = val getAmiiboKey =
@ -509,11 +474,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
return@registerForActivityResult return@registerForActivityResult
} }
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
this@MainActivity, this@MainActivity,
R.string.verifying_content, R.string.verifying_content,
false false
) { _, _ -> ) {
var updatesMatchProgram = true var updatesMatchProgram = true
for (document in documents) { for (document in documents) {
val valid = NativeLibrary.doesUpdateMatchProgram( val valid = NativeLibrary.doesUpdateMatchProgram(
@ -536,42 +501,44 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
positiveAction = { homeViewModel.setContentToInstall(documents) } positiveAction = { homeViewModel.setContentToInstall(documents) }
) )
} }
}.show(supportFragmentManager, ProgressDialogFragment.TAG) }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
private fun installContent(documents: List<Uri>) { private fun installContent(documents: List<Uri>) {
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
this@MainActivity, this@MainActivity,
R.string.installing_game_content R.string.installing_game_content
) { progressCallback, messageCallback -> ) {
var installSuccess = 0 var installSuccess = 0
var installOverwrite = 0 var installOverwrite = 0
var errorBaseGame = 0 var errorBaseGame = 0
var error = 0 var errorExtension = 0
var errorOther = 0
documents.forEach { documents.forEach {
messageCallback.invoke(FileUtil.getFilename(it))
when ( when (
InstallResult.from( NativeLibrary.installFileToNand(
NativeLibrary.installFileToNand( it.toString(),
it.toString(), FileUtil.getExtension(it)
progressCallback
)
) )
) { ) {
InstallResult.Success -> { NativeLibrary.InstallFileToNandResult.Success -> {
installSuccess += 1 installSuccess += 1
} }
InstallResult.Overwrite -> { NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> {
installOverwrite += 1 installOverwrite += 1
} }
InstallResult.BaseInstallAttempted -> { NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> {
errorBaseGame += 1 errorBaseGame += 1
} }
InstallResult.Failure -> { NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> {
error += 1 errorExtension += 1
}
else -> {
errorOther += 1
} }
} }
} }
@ -598,7 +565,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
) )
installResult.append(separator) installResult.append(separator)
} }
val errorTotal: Int = errorBaseGame + error val errorTotal: Int = errorBaseGame + errorExtension + errorOther
if (errorTotal > 0) { if (errorTotal > 0) {
installResult.append(separator) installResult.append(separator)
installResult.append( installResult.append(
@ -615,7 +582,14 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
) )
installResult.append(separator) installResult.append(separator)
} }
if (error > 0) { if (errorExtension > 0) {
installResult.append(separator)
installResult.append(
getString(R.string.install_game_content_failure_file_extension)
)
installResult.append(separator)
}
if (errorOther > 0) {
installResult.append( installResult.append(
getString(R.string.install_game_content_failure_description) getString(R.string.install_game_content_failure_description)
) )
@ -634,7 +608,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
descriptionString = installResult.toString().trim() descriptionString = installResult.toString().trim()
) )
} }
}.show(supportFragmentManager, ProgressDialogFragment.TAG) }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
val exportUserData = registerForActivityResult( val exportUserData = registerForActivityResult(
@ -644,16 +618,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
return@registerForActivityResult return@registerForActivityResult
} }
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
this, this,
R.string.exporting_user_data, R.string.exporting_user_data,
true true
) { progressCallback, _ -> ) {
val zipResult = FileUtil.zipFromInternalStorage( val zipResult = FileUtil.zipFromInternalStorage(
File(DirectoryInitialization.userDirectory!!), File(DirectoryInitialization.userDirectory!!),
DirectoryInitialization.userDirectory!!, DirectoryInitialization.userDirectory!!,
BufferedOutputStream(contentResolver.openOutputStream(result)), BufferedOutputStream(contentResolver.openOutputStream(result)),
progressCallback, taskViewModel.cancelled,
compression = false compression = false
) )
return@newInstance when (zipResult) { return@newInstance when (zipResult) {
@ -661,7 +635,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
TaskState.Failed -> R.string.export_failed TaskState.Failed -> R.string.export_failed
TaskState.Cancelled -> R.string.user_data_export_cancelled TaskState.Cancelled -> R.string.user_data_export_cancelled
} }
}.show(supportFragmentManager, ProgressDialogFragment.TAG) }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
val importUserData = val importUserData =
@ -670,10 +644,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
return@registerForActivityResult return@registerForActivityResult
} }
ProgressDialogFragment.newInstance( IndeterminateProgressDialogFragment.newInstance(
this, this,
R.string.importing_user_data R.string.importing_user_data
) { progressCallback, _ -> ) {
val checkStream = val checkStream =
ZipInputStream(BufferedInputStream(contentResolver.openInputStream(result))) ZipInputStream(BufferedInputStream(contentResolver.openInputStream(result)))
var isYuzuBackup = false var isYuzuBackup = false
@ -702,9 +676,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
// Copy archive to internal storage // Copy archive to internal storage
try { try {
FileUtil.unzipToInternalStorage( FileUtil.unzipToInternalStorage(
result.toString(), BufferedInputStream(contentResolver.openInputStream(result)),
File(DirectoryInitialization.userDirectory!!), File(DirectoryInitialization.userDirectory!!)
progressCallback
) )
} catch (e: Exception) { } catch (e: Exception) {
return@newInstance MessageDialogFragment.newInstance( return@newInstance MessageDialogFragment.newInstance(
@ -721,6 +694,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
driverViewModel.reloadDriverData() driverViewModel.reloadDriverData()
return@newInstance getString(R.string.user_data_import_success) return@newInstance getString(R.string.user_data_import_success)
}.show(supportFragmentManager, ProgressDialogFragment.TAG) }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
} }
} }

View File

@ -7,6 +7,7 @@ import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.provider.DocumentsContract import android.provider.DocumentsContract
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import kotlinx.coroutines.flow.StateFlow
import java.io.BufferedInputStream import java.io.BufferedInputStream
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
@ -18,7 +19,6 @@ import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.model.MinimalDocumentFile import org.yuzu.yuzu_emu.model.MinimalDocumentFile
import org.yuzu.yuzu_emu.model.TaskState import org.yuzu.yuzu_emu.model.TaskState
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.OutputStream
import java.lang.NullPointerException import java.lang.NullPointerException
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.zip.Deflater import java.util.zip.Deflater
@ -104,7 +104,7 @@ object FileUtil {
/** /**
* Reference: https://stackoverflow.com/questions/42186820/documentfile-is-very-slow * Reference: https://stackoverflow.com/questions/42186820/documentfile-is-very-slow
* This function will be faster than DocumentFile.listFiles * This function will be faster than DoucmentFile.listFiles
* @param uri Directory uri. * @param uri Directory uri.
* @return CheapDocument lists. * @return CheapDocument lists.
*/ */
@ -283,34 +283,12 @@ object FileUtil {
/** /**
* Extracts the given zip file into the given directory. * Extracts the given zip file into the given directory.
* @param path String representation of a [Uri] or a typical path delimited by '/'
* @param destDir Location to unzip the contents of [path] into
* @param progressCallback Lambda that is called with the total number of files and the current
* progress through the process. Stops execution as soon as possible if this returns true.
*/ */
@Throws(SecurityException::class) @Throws(SecurityException::class)
fun unzipToInternalStorage( fun unzipToInternalStorage(zipStream: BufferedInputStream, destDir: File) {
path: String, ZipInputStream(zipStream).use { zis ->
destDir: File,
progressCallback: (max: Long, progress: Long) -> Boolean = { _, _ -> false }
) {
var totalEntries = 0L
ZipInputStream(getInputStream(path)).use { zis ->
var tempEntry = zis.nextEntry
while (tempEntry != null) {
tempEntry = zis.nextEntry
totalEntries++
}
}
var progress = 0L
ZipInputStream(getInputStream(path)).use { zis ->
var entry: ZipEntry? = zis.nextEntry var entry: ZipEntry? = zis.nextEntry
while (entry != null) { while (entry != null) {
if (progressCallback.invoke(totalEntries, progress)) {
return@use
}
val newFile = File(destDir, entry.name) val newFile = File(destDir, entry.name)
val destinationDirectory = if (entry.isDirectory) newFile else newFile.parentFile val destinationDirectory = if (entry.isDirectory) newFile else newFile.parentFile
@ -326,7 +304,6 @@ object FileUtil {
newFile.outputStream().use { fos -> zis.copyTo(fos) } newFile.outputStream().use { fos -> zis.copyTo(fos) }
} }
entry = zis.nextEntry entry = zis.nextEntry
progress++
} }
} }
} }
@ -336,15 +313,14 @@ object FileUtil {
* @param inputFile File representation of the item that will be zipped * @param inputFile File representation of the item that will be zipped
* @param rootDir Directory containing the inputFile * @param rootDir Directory containing the inputFile
* @param outputStream Stream where the zip file will be output * @param outputStream Stream where the zip file will be output
* @param progressCallback Lambda that is called with the total number of files and the current * @param cancelled [StateFlow] that reports whether this process has been cancelled
* progress through the process. Stops execution as soon as possible if this returns true.
* @param compression Disables compression if true * @param compression Disables compression if true
*/ */
fun zipFromInternalStorage( fun zipFromInternalStorage(
inputFile: File, inputFile: File,
rootDir: String, rootDir: String,
outputStream: BufferedOutputStream, outputStream: BufferedOutputStream,
progressCallback: (max: Long, progress: Long) -> Boolean = { _, _ -> false }, cancelled: StateFlow<Boolean>? = null,
compression: Boolean = true compression: Boolean = true
): TaskState { ): TaskState {
try { try {
@ -354,10 +330,8 @@ object FileUtil {
zos.setLevel(Deflater.NO_COMPRESSION) zos.setLevel(Deflater.NO_COMPRESSION)
} }
var count = 0L
val totalFiles = inputFile.walkTopDown().count().toLong()
inputFile.walkTopDown().forEach { file -> inputFile.walkTopDown().forEach { file ->
if (progressCallback.invoke(totalFiles, count)) { if (cancelled?.value == true) {
return TaskState.Cancelled return TaskState.Cancelled
} }
@ -369,7 +343,6 @@ object FileUtil {
if (file.isFile) { if (file.isFile) {
file.inputStream().use { fis -> fis.copyTo(zos) } file.inputStream().use { fis -> fis.copyTo(zos) }
} }
count++
} }
} }
} }
@ -383,14 +356,9 @@ object FileUtil {
/** /**
* Helper function that copies the contents of a DocumentFile folder into a [File] * Helper function that copies the contents of a DocumentFile folder into a [File]
* @param file [File] representation of the folder to copy into * @param file [File] representation of the folder to copy into
* @param progressCallback Lambda that is called with the total number of files and the current
* progress through the process. Stops execution as soon as possible if this returns true.
* @throws IllegalStateException Fails when trying to copy a folder into a file and vice versa * @throws IllegalStateException Fails when trying to copy a folder into a file and vice versa
*/ */
fun DocumentFile.copyFilesTo( fun DocumentFile.copyFilesTo(file: File) {
file: File,
progressCallback: (max: Long, progress: Long) -> Boolean = { _, _ -> false }
) {
file.mkdirs() file.mkdirs()
if (!this.isDirectory || !file.isDirectory) { if (!this.isDirectory || !file.isDirectory) {
throw IllegalStateException( throw IllegalStateException(
@ -398,13 +366,7 @@ object FileUtil {
) )
} }
var count = 0L
val totalFiles = this.listFiles().size.toLong()
this.listFiles().forEach { this.listFiles().forEach {
if (progressCallback.invoke(totalFiles, count)) {
return
}
val newFile = File(file, it.name!!) val newFile = File(file, it.name!!)
if (it.isDirectory) { if (it.isDirectory) {
newFile.mkdirs() newFile.mkdirs()
@ -419,7 +381,6 @@ object FileUtil {
newFile.outputStream().use { os -> bos.copyTo(os) } newFile.outputStream().use { os -> bos.copyTo(os) }
} }
} }
count++
} }
} }
@ -466,18 +427,6 @@ object FileUtil {
} }
} }
fun getInputStream(path: String) = if (path.contains("content://")) {
Uri.parse(path).inputStream()
} else {
File(path).inputStream()
}
fun getOutputStream(path: String) = if (path.contains("content://")) {
Uri.parse(path).outputStream()
} else {
File(path).outputStream()
}
@Throws(IOException::class) @Throws(IOException::class)
fun getStringFromFile(file: File): String = fun getStringFromFile(file: File): String =
String(file.readBytes(), StandardCharsets.UTF_8) String(file.readBytes(), StandardCharsets.UTF_8)
@ -485,19 +434,4 @@ object FileUtil {
@Throws(IOException::class) @Throws(IOException::class)
fun getStringFromInputStream(stream: InputStream): String = fun getStringFromInputStream(stream: InputStream): String =
String(stream.readBytes(), StandardCharsets.UTF_8) String(stream.readBytes(), StandardCharsets.UTF_8)
fun DocumentFile.inputStream(): InputStream =
YuzuApplication.appContext.contentResolver.openInputStream(uri)!!
fun DocumentFile.outputStream(): OutputStream =
YuzuApplication.appContext.contentResolver.openOutputStream(uri)!!
fun Uri.inputStream(): InputStream =
YuzuApplication.appContext.contentResolver.openInputStream(this)!!
fun Uri.outputStream(): OutputStream =
YuzuApplication.appContext.contentResolver.openOutputStream(this)!!
fun Uri.asDocumentFile(): DocumentFile? =
DocumentFile.fromSingleUri(YuzuApplication.appContext, this)
} }

View File

@ -5,10 +5,7 @@ package org.yuzu.yuzu_emu.utils
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.drawable.LayerDrawable
import android.widget.ImageView import android.widget.ImageView
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.drawable.toDrawable
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
@ -88,22 +85,4 @@ object GameIconUtils {
return imageLoader.execute(request) return imageLoader.execute(request)
.drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888) .drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
} }
suspend fun getShortcutIcon(lifecycleOwner: LifecycleOwner, game: Game): IconCompat {
val layerDrawable = ResourcesCompat.getDrawable(
YuzuApplication.appContext.resources,
R.drawable.shortcut,
null
) as LayerDrawable
layerDrawable.setDrawableByLayerId(
R.id.shortcut_foreground,
getGameIcon(lifecycleOwner, game).toDrawable(YuzuApplication.appContext.resources)
)
val inset = YuzuApplication.appContext.resources
.getDimensionPixelSize(R.dimen.icon_inset)
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
return IconCompat.createWithAdaptiveBitmap(
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
)
}
} }

View File

@ -3,10 +3,9 @@
package org.yuzu.yuzu_emu.utils package org.yuzu.yuzu_emu.utils
import android.graphics.SurfaceTexture
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.view.Surface import java.io.BufferedInputStream
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.NativeLibrary
@ -124,7 +123,7 @@ object GpuDriverHelper {
// Unzip the driver. // Unzip the driver.
try { try {
FileUtil.unzipToInternalStorage( FileUtil.unzipToInternalStorage(
copiedFile.path, BufferedInputStream(copiedFile.inputStream()),
File(driverInstallationPath!!) File(driverInstallationPath!!)
) )
} catch (e: SecurityException) { } catch (e: SecurityException) {
@ -157,7 +156,7 @@ object GpuDriverHelper {
// Unzip the driver to the private installation directory // Unzip the driver to the private installation directory
try { try {
FileUtil.unzipToInternalStorage( FileUtil.unzipToInternalStorage(
driver.path, BufferedInputStream(driver.inputStream()),
File(driverInstallationPath!!) File(driverInstallationPath!!)
) )
} catch (e: SecurityException) { } catch (e: SecurityException) {
@ -197,11 +196,6 @@ object GpuDriverHelper {
external fun supportsCustomDriverLoading(): Boolean external fun supportsCustomDriverLoading(): Boolean
external fun getSystemDriverInfo(
surface: Surface = Surface(SurfaceTexture(true)),
hookLibPath: String = GpuDriverHelper.hookLibPath!!
): Array<String>?
// Parse the custom driver metadata to retrieve the name. // Parse the custom driver metadata to retrieve the name.
val installedCustomDriverData: GpuDriverMetadata val installedCustomDriverData: GpuDriverMetadata
get() = GpuDriverMetadata(File(driverInstallationPath + META_JSON_FILENAME)) get() = GpuDriverMetadata(File(driverInstallationPath + META_JSON_FILENAME))

View File

@ -22,7 +22,7 @@ add_library(yuzu-android SHARED
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR}) set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common Vulkan::Headers) target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common)
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log) target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
if (ARCHITECTURE_arm64) if (ARCHITECTURE_arm64)
target_link_libraries(yuzu-android PRIVATE adrenotools) target_link_libraries(yuzu-android PRIVATE adrenotools)

View File

@ -42,19 +42,3 @@ double GetJDouble(JNIEnv* env, jobject jdouble) {
jobject ToJDouble(JNIEnv* env, double value) { jobject ToJDouble(JNIEnv* env, double value) {
return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value); return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value);
} }
s32 GetJInteger(JNIEnv* env, jobject jinteger) {
return env->GetIntField(jinteger, IDCache::GetIntegerValueField());
}
jobject ToJInteger(JNIEnv* env, s32 value) {
return env->NewObject(IDCache::GetIntegerClass(), IDCache::GetIntegerConstructor(), value);
}
bool GetJBoolean(JNIEnv* env, jobject jboolean) {
return env->GetBooleanField(jboolean, IDCache::GetBooleanValueField());
}
jobject ToJBoolean(JNIEnv* env, bool value) {
return env->NewObject(IDCache::GetBooleanClass(), IDCache::GetBooleanConstructor(), value);
}

View File

@ -6,7 +6,6 @@
#include <string> #include <string>
#include <jni.h> #include <jni.h>
#include "common/common_types.h"
std::string GetJString(JNIEnv* env, jstring jstr); std::string GetJString(JNIEnv* env, jstring jstr);
jstring ToJString(JNIEnv* env, std::string_view str); jstring ToJString(JNIEnv* env, std::string_view str);
@ -14,9 +13,3 @@ jstring ToJString(JNIEnv* env, std::u16string_view str);
double GetJDouble(JNIEnv* env, jobject jdouble); double GetJDouble(JNIEnv* env, jobject jdouble);
jobject ToJDouble(JNIEnv* env, double value); jobject ToJDouble(JNIEnv* env, double value);
s32 GetJInteger(JNIEnv* env, jobject jinteger);
jobject ToJInteger(JNIEnv* env, s32 value);
bool GetJBoolean(JNIEnv* env, jobject jboolean);
jobject ToJBoolean(JNIEnv* env, bool value);

View File

@ -21,7 +21,7 @@ void AndroidConfig::ReloadAllValues() {
} }
void AndroidConfig::SaveAllValues() { void AndroidConfig::SaveAllValues() {
SaveValues(); Save();
SaveAndroidValues(); SaveAndroidValues();
} }

View File

@ -63,7 +63,6 @@ struct Values {
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay", Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
Settings::Category::Overlay}; Settings::Category::Overlay};
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", 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};
}; };
extern Values values; extern Values values;

View File

@ -82,7 +82,7 @@ AndroidKeyboard::ResultData AndroidKeyboard::ResultData::CreateFromFrontend(jobj
const jstring string = reinterpret_cast<jstring>(env->GetObjectField( const jstring string = reinterpret_cast<jstring>(env->GetObjectField(
object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;"))); object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;")));
return ResultData{GetJString(env, string), return ResultData{GetJString(env, string),
static_cast<Service::AM::Frontend::SwkbdResult>(env->GetIntField( static_cast<Service::AM::Applets::SwkbdResult>(env->GetIntField(
object, env->GetFieldID(s_keyboard_data_class, "result", "I")))}; object, env->GetFieldID(s_keyboard_data_class, "result", "I")))};
} }
@ -149,7 +149,7 @@ void AndroidKeyboard::ShowNormalKeyboard() const {
} }
void AndroidKeyboard::ShowTextCheckDialog( void AndroidKeyboard::ShowTextCheckDialog(
Service::AM::Frontend::SwkbdTextCheckResult text_check_result, Service::AM::Applets::SwkbdTextCheckResult text_check_result,
std::u16string text_check_message) const { std::u16string text_check_message) const {
LOG_WARNING(Frontend, "(STUBBED) called, backend requested to show the text check dialog."); LOG_WARNING(Frontend, "(STUBBED) called, backend requested to show the text check dialog.");
} }
@ -204,7 +204,7 @@ void AndroidKeyboard::InlineTextChanged(
"\ncursor_position={}", "\ncursor_position={}",
Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position); Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position);
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString,
text_parameters.input_text, text_parameters.cursor_position); text_parameters.input_text, text_parameters.cursor_position);
} }
@ -219,7 +219,7 @@ void AndroidKeyboard::SubmitInlineKeyboardText(std::u16string submitted_text) {
m_current_text += submitted_text; m_current_text += submitted_text;
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text, submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString, m_current_text,
m_current_text.size()); m_current_text.size());
} }
@ -236,12 +236,12 @@ void AndroidKeyboard::SubmitInlineKeyboardInput(int key_code) {
case KEYCODE_BACK: case KEYCODE_BACK:
case KEYCODE_ENTER: case KEYCODE_ENTER:
m_is_inline_active = false; m_is_inline_active = false;
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::DecidedEnter, m_current_text, submit_inline_callback(Service::AM::Applets::SwkbdReplyType::DecidedEnter, m_current_text,
static_cast<s32>(m_current_text.size())); static_cast<s32>(m_current_text.size()));
break; break;
case KEYCODE_DEL: case KEYCODE_DEL:
m_current_text.pop_back(); m_current_text.pop_back();
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text, submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString, m_current_text,
m_current_text.size()); m_current_text.size());
break; break;
} }

View File

@ -24,7 +24,7 @@ public:
void ShowNormalKeyboard() const override; void ShowNormalKeyboard() const override;
void ShowTextCheckDialog(Service::AM::Frontend::SwkbdTextCheckResult text_check_result, void ShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result,
std::u16string text_check_message) const override; std::u16string text_check_message) const override;
void ShowInlineKeyboard( void ShowInlineKeyboard(
@ -45,7 +45,7 @@ private:
static ResultData CreateFromFrontend(jobject object); static ResultData CreateFromFrontend(jobject object);
std::string text; std::string text;
Service::AM::Frontend::SwkbdResult result{}; Service::AM::Applets::SwkbdResult result{};
}; };
void SubmitNormalText(const ResultData& result) const; void SubmitNormalText(const ResultData& result) const;

View File

@ -1,12 +1,12 @@
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include "core/core.h" #include <core/core.h>
#include "core/file_sys/fs_filesystem.h" #include <core/file_sys/mode.h>
#include "core/file_sys/patch_manager.h" #include <core/file_sys/patch_manager.h>
#include <core/loader/nro.h>
#include <jni.h>
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "core/loader/nro.h"
#include "jni.h"
#include "jni/android_common/android_common.h" #include "jni/android_common/android_common.h"
#include "native.h" #include "native.h"
@ -79,7 +79,7 @@ extern "C" {
jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj, jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj,
jstring jpath) { jstring jpath) {
const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
GetJString(env, jpath), FileSys::OpenMode::Read); GetJString(env, jpath), FileSys::Mode::Read);
if (!file) { if (!file) {
return false; return false;
} }

View File

@ -19,7 +19,6 @@ static jmethodID s_exit_emulation_activity;
static jmethodID s_disk_cache_load_progress; static jmethodID s_disk_cache_load_progress;
static jmethodID s_on_emulation_started; static jmethodID s_on_emulation_started;
static jmethodID s_on_emulation_stopped; static jmethodID s_on_emulation_stopped;
static jmethodID s_on_program_changed;
static jclass s_game_class; static jclass s_game_class;
static jmethodID s_game_constructor; static jmethodID s_game_constructor;
@ -44,27 +43,10 @@ static jfieldID s_overlay_control_data_landscape_position_field;
static jfieldID s_overlay_control_data_portrait_position_field; static jfieldID s_overlay_control_data_portrait_position_field;
static jfieldID s_overlay_control_data_foldable_position_field; static jfieldID s_overlay_control_data_foldable_position_field;
static jclass s_patch_class;
static jmethodID s_patch_constructor;
static jfieldID s_patch_enabled_field;
static jfieldID s_patch_name_field;
static jfieldID s_patch_version_field;
static jfieldID s_patch_type_field;
static jfieldID s_patch_program_id_field;
static jfieldID s_patch_title_id_field;
static jclass s_double_class; static jclass s_double_class;
static jmethodID s_double_constructor; static jmethodID s_double_constructor;
static jfieldID s_double_value_field; static jfieldID s_double_value_field;
static jclass s_integer_class;
static jmethodID s_integer_constructor;
static jfieldID s_integer_value_field;
static jclass s_boolean_class;
static jmethodID s_boolean_constructor;
static jfieldID s_boolean_value_field;
static constexpr jint JNI_VERSION = JNI_VERSION_1_6; static constexpr jint JNI_VERSION = JNI_VERSION_1_6;
namespace IDCache { namespace IDCache {
@ -124,10 +106,6 @@ jmethodID GetOnEmulationStopped() {
return s_on_emulation_stopped; return s_on_emulation_stopped;
} }
jmethodID GetOnProgramChanged() {
return s_on_program_changed;
}
jclass GetGameClass() { jclass GetGameClass() {
return s_game_class; return s_game_class;
} }
@ -208,38 +186,6 @@ jfieldID GetOverlayControlDataFoldablePositionField() {
return s_overlay_control_data_foldable_position_field; return s_overlay_control_data_foldable_position_field;
} }
jclass GetPatchClass() {
return s_patch_class;
}
jmethodID GetPatchConstructor() {
return s_patch_constructor;
}
jfieldID GetPatchEnabledField() {
return s_patch_enabled_field;
}
jfieldID GetPatchNameField() {
return s_patch_name_field;
}
jfieldID GetPatchVersionField() {
return s_patch_version_field;
}
jfieldID GetPatchTypeField() {
return s_patch_type_field;
}
jfieldID GetPatchProgramIdField() {
return s_patch_program_id_field;
}
jfieldID GetPatchTitleIdField() {
return s_patch_title_id_field;
}
jclass GetDoubleClass() { jclass GetDoubleClass() {
return s_double_class; return s_double_class;
} }
@ -252,30 +198,6 @@ jfieldID GetDoubleValueField() {
return s_double_value_field; return s_double_value_field;
} }
jclass GetIntegerClass() {
return s_integer_class;
}
jmethodID GetIntegerConstructor() {
return s_integer_constructor;
}
jfieldID GetIntegerValueField() {
return s_integer_value_field;
}
jclass GetBooleanClass() {
return s_boolean_class;
}
jmethodID GetBooleanConstructor() {
return s_boolean_constructor;
}
jfieldID GetBooleanValueField() {
return s_boolean_value_field;
}
} // namespace IDCache } // namespace IDCache
#ifdef __cplusplus #ifdef __cplusplus
@ -311,8 +233,6 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
env->GetStaticMethodID(s_native_library_class, "onEmulationStarted", "()V"); env->GetStaticMethodID(s_native_library_class, "onEmulationStarted", "()V");
s_on_emulation_stopped = s_on_emulation_stopped =
env->GetStaticMethodID(s_native_library_class, "onEmulationStopped", "(I)V"); env->GetStaticMethodID(s_native_library_class, "onEmulationStopped", "(I)V");
s_on_program_changed =
env->GetStaticMethodID(s_native_library_class, "onProgramChanged", "(I)V");
const jclass game_class = env->FindClass("org/yuzu/yuzu_emu/model/Game"); const jclass game_class = env->FindClass("org/yuzu/yuzu_emu/model/Game");
s_game_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_class)); s_game_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_class));
@ -358,37 +278,12 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;");
env->DeleteLocalRef(overlay_control_data_class); env->DeleteLocalRef(overlay_control_data_class);
const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch");
s_patch_class = reinterpret_cast<jclass>(env->NewGlobalRef(patch_class));
s_patch_constructor = env->GetMethodID(
patch_class, "<init>",
"(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V");
s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z");
s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;");
s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;");
s_patch_type_field = env->GetFieldID(patch_class, "type", "I");
s_patch_program_id_field = env->GetFieldID(patch_class, "programId", "Ljava/lang/String;");
s_patch_title_id_field = env->GetFieldID(patch_class, "titleId", "Ljava/lang/String;");
env->DeleteLocalRef(patch_class);
const jclass double_class = env->FindClass("java/lang/Double"); const jclass double_class = env->FindClass("java/lang/Double");
s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class)); s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class));
s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V"); s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V");
s_double_value_field = env->GetFieldID(double_class, "value", "D"); s_double_value_field = env->GetFieldID(double_class, "value", "D");
env->DeleteLocalRef(double_class); env->DeleteLocalRef(double_class);
const jclass int_class = env->FindClass("java/lang/Integer");
s_integer_class = reinterpret_cast<jclass>(env->NewGlobalRef(int_class));
s_integer_constructor = env->GetMethodID(int_class, "<init>", "(I)V");
s_integer_value_field = env->GetFieldID(int_class, "value", "I");
env->DeleteLocalRef(int_class);
const jclass boolean_class = env->FindClass("java/lang/Boolean");
s_boolean_class = reinterpret_cast<jclass>(env->NewGlobalRef(boolean_class));
s_boolean_constructor = env->GetMethodID(boolean_class, "<init>", "(Z)V");
s_boolean_value_field = env->GetFieldID(boolean_class, "value", "Z");
env->DeleteLocalRef(boolean_class);
// Initialize Android Storage // Initialize Android Storage
Common::FS::Android::RegisterCallbacks(env, s_native_library_class); Common::FS::Android::RegisterCallbacks(env, s_native_library_class);
@ -414,10 +309,7 @@ void JNI_OnUnload(JavaVM* vm, void* reserved) {
env->DeleteGlobalRef(s_string_class); env->DeleteGlobalRef(s_string_class);
env->DeleteGlobalRef(s_pair_class); env->DeleteGlobalRef(s_pair_class);
env->DeleteGlobalRef(s_overlay_control_data_class); env->DeleteGlobalRef(s_overlay_control_data_class);
env->DeleteGlobalRef(s_patch_class);
env->DeleteGlobalRef(s_double_class); env->DeleteGlobalRef(s_double_class);
env->DeleteGlobalRef(s_integer_class);
env->DeleteGlobalRef(s_boolean_class);
// UnInitialize applets // UnInitialize applets
SoftwareKeyboard::CleanupJNI(env); SoftwareKeyboard::CleanupJNI(env);

View File

@ -19,7 +19,6 @@ jmethodID GetExitEmulationActivity();
jmethodID GetDiskCacheLoadProgress(); jmethodID GetDiskCacheLoadProgress();
jmethodID GetOnEmulationStarted(); jmethodID GetOnEmulationStarted();
jmethodID GetOnEmulationStopped(); jmethodID GetOnEmulationStopped();
jmethodID GetOnProgramChanged();
jclass GetGameClass(); jclass GetGameClass();
jmethodID GetGameConstructor(); jmethodID GetGameConstructor();
@ -44,25 +43,8 @@ jfieldID GetOverlayControlDataLandscapePositionField();
jfieldID GetOverlayControlDataPortraitPositionField(); jfieldID GetOverlayControlDataPortraitPositionField();
jfieldID GetOverlayControlDataFoldablePositionField(); jfieldID GetOverlayControlDataFoldablePositionField();
jclass GetPatchClass();
jmethodID GetPatchConstructor();
jfieldID GetPatchEnabledField();
jfieldID GetPatchNameField();
jfieldID GetPatchVersionField();
jfieldID GetPatchTypeField();
jfieldID GetPatchProgramIdField();
jfieldID GetPatchTitleIdField();
jclass GetDoubleClass(); jclass GetDoubleClass();
jmethodID GetDoubleConstructor(); jmethodID GetDoubleConstructor();
jfieldID GetDoubleValueField(); jfieldID GetDoubleValueField();
jclass GetIntegerClass();
jmethodID GetIntegerConstructor();
jfieldID GetIntegerValueField();
jclass GetBooleanClass();
jmethodID GetBooleanConstructor();
jfieldID GetBooleanValueField();
} // namespace IDCache } // namespace IDCache

View File

@ -17,7 +17,6 @@
#include <core/file_sys/patch_manager.h> #include <core/file_sys/patch_manager.h>
#include <core/file_sys/savedata_factory.h> #include <core/file_sys/savedata_factory.h>
#include <core/loader/nro.h> #include <core/loader/nro.h>
#include <frontend_common/content_manager.h>
#include <jni.h> #include <jni.h>
#include "common/detached_tasks.h" #include "common/detached_tasks.h"
@ -35,22 +34,20 @@
#include "core/crypto/key_manager.h" #include "core/crypto/key_manager.h"
#include "core/file_sys/card_image.h" #include "core/file_sys/card_image.h"
#include "core/file_sys/content_archive.h" #include "core/file_sys/content_archive.h"
#include "core/file_sys/fs_filesystem.h"
#include "core/file_sys/submission_package.h" #include "core/file_sys/submission_package.h"
#include "core/file_sys/vfs/vfs.h" #include "core/file_sys/vfs.h"
#include "core/file_sys/vfs/vfs_real.h" #include "core/file_sys/vfs_real.h"
#include "core/frontend/applets/cabinet.h" #include "core/frontend/applets/cabinet.h"
#include "core/frontend/applets/controller.h" #include "core/frontend/applets/controller.h"
#include "core/frontend/applets/error.h" #include "core/frontend/applets/error.h"
#include "core/frontend/applets/general.h" #include "core/frontend/applets/general_frontend.h"
#include "core/frontend/applets/mii_edit.h" #include "core/frontend/applets/mii_edit.h"
#include "core/frontend/applets/profile_select.h" #include "core/frontend/applets/profile_select.h"
#include "core/frontend/applets/software_keyboard.h" #include "core/frontend/applets/software_keyboard.h"
#include "core/frontend/applets/web_browser.h" #include "core/frontend/applets/web_browser.h"
#include "core/hle/service/am/applet_ae.h" #include "core/hle/service/am/applet_ae.h"
#include "core/hle/service/am/applet_manager.h"
#include "core/hle/service/am/applet_oe.h" #include "core/hle/service/am/applet_oe.h"
#include "core/hle/service/am/frontend/applets.h" #include "core/hle/service/am/applets/applets.h"
#include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/filesystem/filesystem.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "frontend_common/config.h" #include "frontend_common/config.h"
@ -61,9 +58,6 @@
#include "jni/id_cache.h" #include "jni/id_cache.h"
#include "jni/native.h" #include "jni/native.h"
#include "video_core/renderer_base.h" #include "video_core/renderer_base.h"
#include "video_core/renderer_vulkan/renderer_vulkan.h"
#include "video_core/vulkan_common/vulkan_instance.h"
#include "video_core/vulkan_common/vulkan_surface.h"
#define jconst [[maybe_unused]] const auto #define jconst [[maybe_unused]] const auto
#define jauto [[maybe_unused]] auto #define jauto [[maybe_unused]] auto
@ -106,6 +100,67 @@ void EmulationSession::SetNativeWindow(ANativeWindow* native_window) {
m_native_window = native_window; m_native_window = native_window;
} }
int EmulationSession::InstallFileToNand(std::string filename, std::string file_extension) {
jconst copy_func = [](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest,
std::size_t block_size) {
if (src == nullptr || dest == nullptr) {
return false;
}
if (!dest->Resize(src->GetSize())) {
return false;
}
using namespace Common::Literals;
[[maybe_unused]] std::vector<u8> buffer(1_MiB);
for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
jconst read = src->Read(buffer.data(), buffer.size(), i);
dest->Write(buffer.data(), read, i);
}
return true;
};
enum InstallResult {
Success = 0,
SuccessFileOverwritten = 1,
InstallError = 2,
ErrorBaseGame = 3,
ErrorFilenameExtension = 4,
};
[[maybe_unused]] std::shared_ptr<FileSys::NSP> nsp;
if (file_extension == "nsp") {
nsp = std::make_shared<FileSys::NSP>(m_vfs->OpenFile(filename, FileSys::Mode::Read));
if (nsp->IsExtractedType()) {
return InstallError;
}
} else {
return ErrorFilenameExtension;
}
if (!nsp) {
return InstallError;
}
if (nsp->GetStatus() != Loader::ResultStatus::Success) {
return InstallError;
}
jconst res = m_system.GetFileSystemController().GetUserNANDContents()->InstallEntry(*nsp, true,
copy_func);
switch (res) {
case FileSys::InstallResult::Success:
return Success;
case FileSys::InstallResult::OverwriteExisting:
return SuccessFileOverwritten;
case FileSys::InstallResult::ErrorBaseInstall:
return ErrorBaseGame;
default:
return InstallError;
}
}
void EmulationSession::InitializeGpuDriver(const std::string& hook_lib_dir, void EmulationSession::InitializeGpuDriver(const std::string& hook_lib_dir,
const std::string& custom_driver_dir, const std::string& custom_driver_dir,
const std::string& custom_driver_name, const std::string& custom_driver_name,
@ -159,7 +214,7 @@ void EmulationSession::SurfaceChanged() {
} }
void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath) { void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath) {
const auto file = m_system.GetFilesystem()->OpenFile(filepath, FileSys::OpenMode::Read); const auto file = m_system.GetFilesystem()->OpenFile(filepath, FileSys::Mode::Read);
if (!file) { if (!file) {
return; return;
} }
@ -212,14 +267,7 @@ void EmulationSession::InitializeSystem(bool reload) {
m_system.GetFileSystemController().CreateFactories(*m_vfs); m_system.GetFileSystemController().CreateFactories(*m_vfs);
} }
void EmulationSession::SetAppletId(int applet_id) { Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string& filepath) {
m_applet_id = applet_id;
m_system.GetFrontendAppletHolder().SetCurrentAppletId(
static_cast<Service::AM::AppletId>(m_applet_id));
}
Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string& filepath,
const std::size_t program_index) {
std::scoped_lock lock(m_mutex); std::scoped_lock lock(m_mutex);
// Create the render window. // Create the render window.
@ -233,7 +281,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
m_system.ApplySettings(); m_system.ApplySettings();
Settings::LogSettings(); Settings::LogSettings();
m_system.HIDCore().ReloadInputDevices(); m_system.HIDCore().ReloadInputDevices();
m_system.SetFrontendAppletSet({ m_system.SetAppletFrontendSet({
nullptr, // Amiibo Settings nullptr, // Amiibo Settings
nullptr, // Controller Selector nullptr, // Controller Selector
nullptr, // Error Display nullptr, // Error Display
@ -249,11 +297,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
ConfigureFilesystemProvider(filepath); ConfigureFilesystemProvider(filepath);
// Load the ROM. // Load the ROM.
Service::AM::FrontendAppletParameters params{ m_load_result = m_system.Load(EmulationSession::GetInstance().Window(), filepath);
.applet_id = static_cast<Service::AM::AppletId>(m_applet_id),
.program_index = static_cast<s32>(program_index),
};
m_load_result = m_system.Load(EmulationSession::GetInstance().Window(), filepath, params);
if (m_load_result != Core::SystemResultStatus::Success) { if (m_load_result != Core::SystemResultStatus::Success) {
return m_load_result; return m_load_result;
} }
@ -263,24 +307,12 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
m_system.GetCpuManager().OnGpuReady(); m_system.GetCpuManager().OnGpuReady();
m_system.RegisterExitCallback([&] { HaltEmulation(); }); m_system.RegisterExitCallback([&] { HaltEmulation(); });
// Register an ExecuteProgram callback such that Core can execute a sub-program
m_system.RegisterExecuteProgramCallback([&](std::size_t program_index_) {
m_next_program_index = program_index_;
EmulationSession::GetInstance().HaltEmulation();
});
OnEmulationStarted();
return Core::SystemResultStatus::Success; return Core::SystemResultStatus::Success;
} }
void EmulationSession::ShutdownEmulation() { void EmulationSession::ShutdownEmulation() {
std::scoped_lock lock(m_mutex); std::scoped_lock lock(m_mutex);
if (m_next_program_index != -1) {
ChangeProgram(m_next_program_index);
m_next_program_index = -1;
}
m_is_running = false; m_is_running = false;
// Unload user input. // Unload user input.
@ -349,9 +381,6 @@ void EmulationSession::RunEmulation() {
} }
} }
} }
// Reset current applet ID.
m_applet_id = static_cast<int>(Service::AM::AppletId::Application);
} }
bool EmulationSession::IsHandheldOnly() { bool EmulationSession::IsHandheldOnly() {
@ -381,8 +410,8 @@ void EmulationSession::OnGamepadConnectEvent([[maybe_unused]] int index) {
jauto handheld = m_system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); jauto handheld = m_system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
if (controller->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::Handheld) { if (controller->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::Handheld) {
handheld->SetNpadStyleIndex(Core::HID::NpadStyleIndex::Fullkey); handheld->SetNpadStyleIndex(Core::HID::NpadStyleIndex::ProController);
controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::Fullkey); controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::ProController);
handheld->Disconnect(); handheld->Disconnect();
} }
} }
@ -431,12 +460,6 @@ void EmulationSession::OnEmulationStopped(Core::SystemResultStatus result) {
static_cast<jint>(result)); static_cast<jint>(result));
} }
void EmulationSession::ChangeProgram(std::size_t program_index) {
JNIEnv* env = IDCache::GetEnvForThread();
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnProgramChanged(),
static_cast<jint>(program_index));
}
u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) { u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
auto program_id_string = GetJString(env, jprogramId); auto program_id_string = GetJString(env, jprogramId);
try { try {
@ -446,8 +469,7 @@ u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
} }
} }
static Core::SystemResultStatus RunEmulation(const std::string& filepath, static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
const size_t program_index = 0) {
MicroProfileOnThreadCreate("EmuThread"); MicroProfileOnThreadCreate("EmuThread");
SCOPE_EXIT({ MicroProfileShutdown(); }); SCOPE_EXIT({ MicroProfileShutdown(); });
@ -460,7 +482,7 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath,
SCOPE_EXIT({ EmulationSession::GetInstance().ShutdownEmulation(); }); SCOPE_EXIT({ EmulationSession::GetInstance().ShutdownEmulation(); });
jconst result = EmulationSession::GetInstance().InitializeEmulation(filepath, program_index); jconst result = EmulationSession::GetInstance().InitializeEmulation(filepath);
if (result != Core::SystemResultStatus::Success) { if (result != Core::SystemResultStatus::Success) {
return result; return result;
} }
@ -490,20 +512,10 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject
} }
int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance,
jstring j_file, jobject jcallback) { jstring j_file,
auto jlambdaClass = env->GetObjectClass(jcallback); jstring j_file_extension) {
auto jlambdaInvokeMethod = env->GetMethodID( return EmulationSession::GetInstance().InstallFileToNand(GetJString(env, j_file),
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); GetJString(env, j_file_extension));
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
ToJDouble(env, max), ToJDouble(env, progress));
return GetJBoolean(env, jwasCancelled);
};
return static_cast<int>(
ContentManager::InstallNSP(EmulationSession::GetInstance().System(),
*EmulationSession::GetInstance().System().GetFilesystem(),
GetJString(env, j_file), callback));
} }
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj,
@ -512,8 +524,8 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* en
u64 program_id = EmulationSession::GetProgramId(env, jprogramId); u64 program_id = EmulationSession::GetProgramId(env, jprogramId);
std::string updatePath = GetJString(env, jupdatePath); std::string updatePath = GetJString(env, jupdatePath);
std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>( std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(updatePath,
updatePath, FileSys::OpenMode::Read)); FileSys::Mode::Read));
for (const auto& item : nsp->GetNCAs()) { for (const auto& item : nsp->GetNCAs()) {
for (const auto& nca_details : item.second) { for (const auto& nca_details : item.second) {
if (nca_details.second->GetName().ends_with(".cnmt.nca")) { if (nca_details.second->GetName().ends_with(".cnmt.nca")) {
@ -557,37 +569,6 @@ jboolean JNICALL Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_supportsCustomDri
#endif #endif
} }
jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
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 = 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 m_window = std::make_unique<EmuWindow_Android>(
&input_subsystem, 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, m_window->GetWindowInfo());
auto device = Vulkan::CreateDevice(vk_instance, dld, *surface);
auto driver_version = device.GetDriverVersion();
auto version_string =
fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(driver_version),
VK_API_VERSION_MINOR(driver_version), VK_API_VERSION_PATCH(driver_version));
jobjectArray j_driver_info =
env->NewObjectArray(2, IDCache::GetStringClass(), ToJString(env, version_string));
env->SetObjectArrayElement(j_driver_info, 1, ToJString(env, device.GetDriverName()));
return j_driver_info;
}
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) { jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) {
Core::Crypto::KeyManager::Instance().ReloadKeys(); Core::Crypto::KeyManager::Instance().ReloadKeys();
return static_cast<jboolean>(Core::Crypto::KeyManager::Instance().AreKeysLoaded()); return static_cast<jboolean>(Core::Crypto::KeyManager::Instance().AreKeysLoaded());
@ -743,11 +724,6 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass
return ToJString(env, "JIT"); return ToJString(env, "JIT");
} }
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) {
return ToJString(env,
EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor());
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) { void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
EmulationSession::GetInstance().System().ApplySettings(); EmulationSession::GetInstance().System().ApplySettings();
} }
@ -756,11 +732,11 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj
Settings::LogSettings(); Settings::LogSettings();
} }
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path, void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2(JNIEnv* env, jclass clazz,
jint j_program_index) { jstring j_path) {
const std::string path = GetJString(env, j_path); const std::string path = GetJString(env, j_path);
const Core::SystemResultStatus result{RunEmulation(path, j_program_index)}; const Core::SystemResultStatus result{RunEmulation(path)};
if (result != Core::SystemResultStatus::Success) { if (result != Core::SystemResultStatus::Success) {
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(),
IDCache::GetExitEmulationActivity(), static_cast<int>(result)); IDCache::GetExitEmulationActivity(), static_cast<int>(result));
@ -787,7 +763,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv*
jobject instance) { jobject instance) {
const auto nand_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir); const auto nand_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
auto vfs_nand_dir = EmulationSession::GetInstance().System().GetFilesystem()->OpenDirectory( auto vfs_nand_dir = EmulationSession::GetInstance().System().GetFilesystem()->OpenDirectory(
Common::FS::PathToUTF8String(nand_dir), FileSys::OpenMode::Read); Common::FS::PathToUTF8String(nand_dir), FileSys::Mode::Read);
const auto user_id = EmulationSession::GetInstance().System().GetProfileManager().GetUser( const auto user_id = EmulationSession::GetInstance().System().GetProfileManager().GetUser(
static_cast<std::size_t>(0)); static_cast<std::size_t>(0));
@ -822,12 +798,13 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, j
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz, void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz,
jint jappletId) { jint jappletId) {
EmulationSession::GetInstance().SetAppletId(jappletId); EmulationSession::GetInstance().System().GetAppletManager().SetCurrentAppletId(
static_cast<Service::AM::Applets::AppletId>(jappletId));
} }
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz, void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz,
jint jcabinetMode) { jint jcabinetMode) {
EmulationSession::GetInstance().System().GetFrontendAppletHolder().SetCabinetMode( EmulationSession::GetInstance().System().GetAppletManager().SetCabinetMode(
static_cast<Service::NFP::CabinetMode>(jcabinetMode)); static_cast<Service::NFP::CabinetMode>(jcabinetMode));
} }
@ -847,9 +824,9 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env,
return true; return true;
} }
jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj, jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAddonsForFile(JNIEnv* env, jobject jobj,
jstring jpath, jstring jpath,
jstring jprogramId) { jstring jprogramId) {
const auto path = GetJString(env, jpath); const auto path = GetJString(env, jpath);
const auto vFile = const auto vFile =
Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path); Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path);
@ -866,78 +843,20 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env
FileSys::VirtualFile update_raw; FileSys::VirtualFile update_raw;
loader->ReadUpdateRaw(update_raw); loader->ReadUpdateRaw(update_raw);
auto patches = pm.GetPatches(update_raw); auto addons = pm.GetPatchVersionNames(update_raw);
jobjectArray jpatchArray = auto jemptyString = ToJString(env, "");
env->NewObjectArray(patches.size(), IDCache::GetPatchClass(), nullptr); auto jemptyStringPair = env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
jemptyString, jemptyString);
jobjectArray jaddonsArray =
env->NewObjectArray(addons.size(), IDCache::GetPairClass(), jemptyStringPair);
int i = 0; int i = 0;
for (const auto& patch : patches) { for (const auto& addon : addons) {
jobject jpatch = env->NewObject( jobject jaddon = env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
IDCache::GetPatchClass(), IDCache::GetPatchConstructor(), patch.enabled, ToJString(env, addon.first), ToJString(env, addon.second));
ToJString(env, patch.name), ToJString(env, patch.version), env->SetObjectArrayElement(jaddonsArray, i, jaddon);
static_cast<jint>(patch.type), ToJString(env, std::to_string(patch.program_id)),
ToJString(env, std::to_string(patch.title_id)));
env->SetObjectArrayElement(jpatchArray, i, jpatch);
++i; ++i;
} }
return jpatchArray; return jaddonsArray;
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject jobj,
jstring jprogramId) {
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
ContentManager::RemoveUpdate(EmulationSession::GetInstance().System().GetFileSystemController(),
program_id);
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj,
jstring jprogramId) {
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
ContentManager::RemoveAllDLC(EmulationSession::GetInstance().System(), program_id);
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId,
jstring jname) {
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
ContentManager::RemoveMod(EmulationSession::GetInstance().System().GetFileSystemController(),
program_id, GetJString(env, jname));
}
jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env,
jobject jobj,
jobject jcallback) {
auto jlambdaClass = env->GetObjectClass(jcallback);
auto jlambdaInvokeMethod = env->GetMethodID(
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
ToJDouble(env, max), ToJDouble(env, progress));
return GetJBoolean(env, jwasCancelled);
};
auto& session = EmulationSession::GetInstance();
std::vector<std::string> result = ContentManager::VerifyInstalledContents(
session.System(), *session.GetContentProvider(), callback);
jobjectArray jresult =
env->NewObjectArray(result.size(), IDCache::GetStringClass(), ToJString(env, ""));
for (size_t i = 0; i < result.size(); ++i) {
env->SetObjectArrayElement(jresult, i, ToJString(env, result[i]));
}
return jresult;
}
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj,
jstring jpath, jobject jcallback) {
auto jlambdaClass = env->GetObjectClass(jcallback);
auto jlambdaInvokeMethod = env->GetMethodID(
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
ToJDouble(env, max), ToJDouble(env, progress));
return GetJBoolean(env, jwasCancelled);
};
auto& session = EmulationSession::GetInstance();
return static_cast<jint>(
ContentManager::VerifyGameContents(session.System(), GetJString(env, jpath), callback));
} }
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj,
@ -956,7 +875,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject j
const auto nandDir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir); const auto nandDir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
auto vfsNandDir = system.GetFilesystem()->OpenDirectory(Common::FS::PathToUTF8String(nandDir), auto vfsNandDir = system.GetFilesystem()->OpenDirectory(Common::FS::PathToUTF8String(nandDir),
FileSys::OpenMode::Read); FileSys::Mode::Read);
const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath( const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath(
{}, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData, {}, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData,
@ -986,10 +905,4 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env,
EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries(); EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries();
} }
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobject jobj) {
auto& system = EmulationSession::GetInstance().System();
system.GetFileSystemController().CreateFactories(*system.GetFilesystem());
return ContentManager::AreKeysPresent();
}
} // extern "C" } // extern "C"

View File

@ -7,7 +7,6 @@
#include "core/file_sys/registered_cache.h" #include "core/file_sys/registered_cache.h"
#include "core/hle/service/acc/profile_manager.h" #include "core/hle/service/acc/profile_manager.h"
#include "core/perf_stats.h" #include "core/perf_stats.h"
#include "frontend_common/content_manager.h"
#include "jni/applets/software_keyboard.h" #include "jni/applets/software_keyboard.h"
#include "jni/emu_window/emu_window.h" #include "jni/emu_window/emu_window.h"
#include "video_core/rasterizer_interface.h" #include "video_core/rasterizer_interface.h"
@ -30,6 +29,7 @@ public:
void SetNativeWindow(ANativeWindow* native_window); void SetNativeWindow(ANativeWindow* native_window);
void SurfaceChanged(); void SurfaceChanged();
int InstallFileToNand(std::string filename, std::string file_extension);
void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir, void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir,
const std::string& custom_driver_name, const std::string& custom_driver_name,
const std::string& file_redirect_dir); const std::string& file_redirect_dir);
@ -45,9 +45,7 @@ public:
const Core::PerfStatsResults& PerfStats(); const Core::PerfStatsResults& PerfStats();
void ConfigureFilesystemProvider(const std::string& filepath); void ConfigureFilesystemProvider(const std::string& filepath);
void InitializeSystem(bool reload); void InitializeSystem(bool reload);
void SetAppletId(int applet_id); Core::SystemResultStatus InitializeEmulation(const std::string& filepath);
Core::SystemResultStatus InitializeEmulation(const std::string& filepath,
const std::size_t program_index = 0);
bool IsHandheldOnly(); bool IsHandheldOnly();
void SetDeviceType([[maybe_unused]] int index, int type); void SetDeviceType([[maybe_unused]] int index, int type);
@ -62,7 +60,6 @@ public:
private: private:
static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max); static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max);
static void OnEmulationStopped(Core::SystemResultStatus result); static void OnEmulationStopped(Core::SystemResultStatus result);
static void ChangeProgram(std::size_t program_index);
private: private:
// Window management // Window management
@ -80,7 +77,6 @@ private:
std::atomic<bool> m_is_paused = false; std::atomic<bool> m_is_paused = false;
SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider; std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider;
int m_applet_id{1};
// GPU driver parameters // GPU driver parameters
std::shared_ptr<Common::DynamicLibrary> m_vulkan_library; std::shared_ptr<Common::DynamicLibrary> m_vulkan_library;
@ -88,7 +84,4 @@ private:
// Synchronization // Synchronization
std::condition_variable_any m_cv; std::condition_variable_any m_cv;
mutable std::mutex m_mutex; mutable std::mutex m_mutex;
// Program index for next boot
std::atomic<s32> m_next_program_index = -1;
}; };

View File

@ -205,7 +205,7 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEn
jstring jkey) { jstring jkey) {
auto setting = getSetting<std::string>(env, jkey); auto setting = getSetting<std::string>(env, jkey);
if (setting != nullptr) { if (setting != nullptr) {
return setting->RuntimeModifiable(); return setting->RuntimeModfiable();
} }
return true; return true;
} }

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp">
<path
android:fillColor="?attr/colorControlNormal"
android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" />
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="?attr/colorControlNormal"
android:pathData="M280,920q-33,0 -56.5,-23.5T200,840v-720q0,-33 23.5,-56.5T280,40h400q33,0 56.5,23.5T760,120v160h-80v-40L280,240v480h400v-40h80v160q0,33 -23.5,56.5T680,920L280,920ZM686,520L480,520v120h-80v-120q0,-33 23.5,-56.5T480,440h206l-62,-64 56,-56 160,160 -160,160 -56,-56 62,-64Z" />
</vector>

View File

@ -11,14 +11,12 @@
android:id="@+id/appbar_about" android:id="@+id/appbar_about"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_about" android:id="@+id/toolbar_about"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" app:navigationIcon="@drawable/ic_back"
app:title="@string/about" /> app:title="@string/about" />
@ -30,7 +28,6 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:fadeScrollbars="false" android:fadeScrollbars="false"
android:scrollbars="vertical" android:scrollbars="vertical"
android:defaultFocusHighlightEnabled="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout <LinearLayout
@ -150,7 +147,7 @@
android:layout_marginHorizontal="20dp" /> android:layout_marginHorizontal="20dp" />
<LinearLayout <LinearLayout
android:id="@+id/button_version_name" android:id="@+id/button_build_hash"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
@ -167,7 +164,7 @@
android:textAlignment="viewStart" /> android:textAlignment="viewStart" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/text_version_name" android:id="@+id/text_build_hash"
style="@style/TextAppearance.Material3.BodyMedium" style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -1,155 +0,0 @@
<?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:id="@+id/coordinator_about"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_info"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/scroll_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:defaultFocusHighlightEnabled="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/content_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingHorizontal="16dp"
android:baselineAligned="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="3"
android:gravity="top|center_horizontal"
android:paddingHorizontal="16dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/button_copy"
style="@style/Widget.Material3.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/copy_details" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_verify_integrity"
style="@style/Widget.Material3.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/verify_integrity" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="1">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/path_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:importantForAutofill="no"
android:inputType="none"
android:minHeight="48dp"
android:textAlignment="viewStart"
tools:text="1.0.0" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/program_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/program_id_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:importantForAutofill="no"
android:inputType="none"
android:minHeight="48dp"
android:textAlignment="viewStart"
tools:text="1.0.0" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/developer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/developer_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:importantForAutofill="no"
android:inputType="none"
android:minHeight="48dp"
android:textAlignment="viewStart"
tools:text="1.0.0" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/version_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:importantForAutofill="no"
android:inputType="none"
android:minHeight="48dp"
android:textAlignment="viewStart"
tools:text="1.0.0" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -14,7 +14,6 @@
android:clipToPadding="false" android:clipToPadding="false"
android:fadeScrollbars="false" android:fadeScrollbars="false"
android:scrollbars="vertical" android:scrollbars="vertical"
android:defaultFocusHighlightEnabled="false"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/icon_layout" app:layout_constraintStart_toEndOf="@+id/icon_layout"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -44,35 +43,16 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout <Button
android:layout_width="match_parent" android:id="@+id/button_back"
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_margin="8dp" android:layout_margin="8dp"
android:orientation="horizontal"> app:icon="@drawable/ic_back"
app:iconSize="24dp"
<Button app:iconTint="?attr/colorOnSurface" />
android:id="@+id/button_back"
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_back"
app:iconSize="24dp"
app:iconTint="?attr/colorOnSurface"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_shortcut"
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_shortcut"
app:iconSize="24dp"
app:iconTint="?attr/colorOnSurface"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewElevatedStyle" style="?attr/materialCardViewElevatedStyle"

View File

@ -23,7 +23,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:focusable="false"
android:clickable="false" android:clickable="false"
android:checked="false" /> android:checked="false" />

View File

@ -6,14 +6,16 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginVertical="12dp"> android:layout_marginVertical="12dp"
android:focusable="true">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="16dp" android:padding="16dp"
android:layout_gravity="center_vertical"> android:layout_gravity="center_vertical"
android:animateLayoutChanges="true">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/path" android:id="@+id/path"

View File

@ -2,16 +2,16 @@
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <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:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
style="?attr/materialCardViewElevatedStyle" style="?attr/materialCardViewFilledStyle"
android:id="@+id/option_card" android:id="@+id/option_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="24dp" android:layout_marginBottom="24dp"
android:layout_marginHorizontal="12dp" android:layout_marginHorizontal="12dp"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:backgroundTint="?attr/colorSurfaceVariant"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true">
app:cardElevation="4dp">
<LinearLayout <LinearLayout
android:id="@+id/option_layout" android:id="@+id/option_layout"

View File

@ -1,30 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.material.progressindicator.LinearProgressIndicator xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/progress_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:padding="24dp"
app:trackCornerRadius="4dp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/message"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="6dp"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:requiresFadingEdge="horizontal"
android:singleLine="true"
android:textAlignment="viewStart"
android:visibility="gone" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="24dp"
app:trackCornerRadius="4dp" />
</LinearLayout>

View File

@ -11,14 +11,12 @@
android:id="@+id/appbar_about" android:id="@+id/appbar_about"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_about" android:id="@+id/toolbar_about"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:title="@string/about" app:title="@string/about"
app:navigationIcon="@drawable/ic_back" /> app:navigationIcon="@drawable/ic_back" />
@ -30,7 +28,6 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:scrollbars="vertical" android:scrollbars="vertical"
android:fadeScrollbars="false" android:fadeScrollbars="false"
android:defaultFocusHighlightEnabled="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout <LinearLayout
@ -151,7 +148,7 @@
android:layout_marginHorizontal="20dp" /> android:layout_marginHorizontal="20dp" />
<LinearLayout <LinearLayout
android:id="@+id/button_version_name" android:id="@+id/button_build_hash"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingVertical="16dp" android:paddingVertical="16dp"
@ -168,7 +165,7 @@
android:text="@string/build" /> android:text="@string/build" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/text_version_name" android:id="@+id/text_build_hash"
style="@style/TextAppearance.Material3.BodyMedium" style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -11,7 +11,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:touchscreenBlocksFocus="false"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -20,7 +19,6 @@
android:id="@+id/toolbar_addons" android:id="@+id/toolbar_addons"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" /> app:navigationIcon="@drawable/ic_back" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@ -30,8 +28,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:clipToPadding="false" android:clipToPadding="false"
android:defaultFocusHighlightEnabled="false"
android:nextFocusDown="@id/button_install"
app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@ -10,14 +10,12 @@
android:id="@+id/appbar_applets" android:id="@+id/appbar_applets"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_applets" android:id="@+id/toolbar_applets"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" app:navigationIcon="@drawable/ic_back"
app:title="@string/applets" /> app:title="@string/applets" />

View File

@ -15,14 +15,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:touchscreenBlocksFocus="false"
app:liftOnScrollTargetViewId="@id/list_drivers"> app:liftOnScrollTargetViewId="@id/list_drivers">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_drivers" android:id="@+id/toolbar_drivers"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" app:navigationIcon="@drawable/ic_back"
app:title="@string/gpu_driver_manager" /> app:title="@string/gpu_driver_manager" />

View File

@ -11,14 +11,12 @@
android:id="@+id/appbar_ea" android:id="@+id/appbar_ea"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_about" android:id="@+id/toolbar_about"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" app:navigationIcon="@drawable/ic_back"
app:title="@string/early_access" /> app:title="@string/early_access" />
@ -32,7 +30,6 @@
android:paddingBottom="20dp" android:paddingBottom="20dp"
android:scrollbars="vertical" android:scrollbars="vertical"
android:fadeScrollbars="false" android:fadeScrollbars="false"
android:defaultFocusHighlightEnabled="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout <LinearLayout

View File

@ -5,7 +5,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:keepScreenOn="true" android:keepScreenOn="true"
android:defaultFocusHighlightEnabled="false"
tools:context="org.yuzu.yuzu_emu.fragments.EmulationFragment" tools:context="org.yuzu.yuzu_emu.fragments.EmulationFragment"
tools:openDrawer="start"> tools:openDrawer="start">
@ -25,8 +24,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center" android:layout_gravity="center"
android:focusable="false" android:focusable="false"
android:focusableInTouchMode="false" android:focusableInTouchMode="false" />
android:defaultFocusHighlightEnabled="false" />
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/loading_indicator" android:id="@+id/loading_indicator"
@ -35,9 +33,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:focusable="false" android:focusable="false"
android:defaultFocusHighlightEnabled="false" android:clickable="false">
android:clickable="false"
app:rippleColor="@android:color/transparent">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/loading_layout" android:id="@+id/loading_layout"
@ -122,7 +118,6 @@
android:layout_gravity="center" android:layout_gravity="center"
android:focusable="true" android:focusable="true"
android:focusableInTouchMode="true" android:focusableInTouchMode="true"
android:defaultFocusHighlightEnabled="false"
android:visibility="invisible" /> android:visibility="invisible" />
<Button <Button
@ -165,7 +160,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:focusedByDefault="true"
app:headerLayout="@layout/header_in_game" app:headerLayout="@layout/header_in_game"
app:menu="@menu/menu_in_game" app:menu="@menu/menu_in_game"
tools:visibility="gone" /> tools:visibility="gone" />

View File

@ -15,14 +15,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:touchscreenBlocksFocus="false"
app:liftOnScrollTargetViewId="@id/list_folders"> app:liftOnScrollTargetViewId="@id/list_folders">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_folders" android:id="@+id/toolbar_folders"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" app:navigationIcon="@drawable/ic_back"
app:title="@string/game_folders" /> app:title="@string/game_folders" />
@ -33,7 +31,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false" android:clipToPadding="false"
android:defaultFocusHighlightEnabled="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -11,14 +11,12 @@
android:id="@+id/appbar_info" android:id="@+id/appbar_info"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:touchscreenBlocksFocus="false"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_info" android:id="@+id/toolbar_info"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:navigationIcon="@drawable/ic_back" /> app:navigationIcon="@drawable/ic_back" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@ -27,7 +25,6 @@
android:id="@+id/scroll_info" android:id="@+id/scroll_info"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:defaultFocusHighlightEnabled="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout <LinearLayout
@ -121,14 +118,6 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/copy_details" /> android:text="@string/copy_details" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_verify_integrity"
style="@style/Widget.Material3.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/verify_integrity" />
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -12,8 +13,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:scrollbars="vertical" android:scrollbars="vertical"
android:fadeScrollbars="false" android:fadeScrollbars="false"
android:clipToPadding="false" android:clipToPadding="false">
android:defaultFocusHighlightEnabled="false">
<LinearLayout <LinearLayout
android:id="@+id/layout_all" android:id="@+id/layout_all"
@ -22,35 +22,16 @@
android:orientation="vertical" android:orientation="vertical"
android:gravity="center_horizontal"> android:gravity="center_horizontal">
<androidx.constraintlayout.widget.ConstraintLayout <Button
android:layout_width="match_parent" android:id="@+id/button_back"
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="8dp" android:layout_margin="8dp"
android:orientation="horizontal"> android:layout_gravity="start"
app:icon="@drawable/ic_back"
<Button app:iconSize="24dp"
android:id="@+id/button_back" app:iconTint="?attr/colorOnSurface" />
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_back"
app:iconSize="24dp"
app:iconTint="?attr/colorOnSurface"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_shortcut"
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_shortcut"
app:iconSize="24dp"
app:iconTint="?attr/colorOnSurface"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewElevatedStyle" style="?attr/materialCardViewElevatedStyle"
@ -64,7 +45,7 @@
android:id="@+id/image_game_screen" android:id="@+id/image_game_screen"
android:layout_width="175dp" android:layout_width="175dp"
android:layout_height="175dp" android:layout_height="175dp"
tools:src="@drawable/default_icon" /> tools:src="@drawable/default_icon"/>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
@ -87,7 +68,7 @@
android:id="@+id/list_properties" android:id="@+id/list_properties"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:defaultFocusHighlightEnabled="false" /> tools:listitem="@layout/card_simple_outlined" />
</LinearLayout> </LinearLayout>

View File

@ -27,7 +27,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clipToPadding="false" android:clipToPadding="false"
android:defaultFocusHighlightEnabled="false"
tools:listitem="@layout/card_game" /> tools:listitem="@layout/card_game" />
</RelativeLayout> </RelativeLayout>

View File

@ -7,8 +7,7 @@
android:background="?attr/colorSurface" android:background="?attr/colorSurface"
android:scrollbars="vertical" android:scrollbars="vertical"
android:fadeScrollbars="false" android:fadeScrollbars="false"
android:clipToPadding="false" android:clipToPadding="false">
android:defaultFocusHighlightEnabled="false">
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/linear_layout_settings" android:id="@+id/linear_layout_settings"

View File

@ -10,14 +10,12 @@
android:id="@+id/appbar_installables" android:id="@+id/appbar_installables"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_installables" android:id="@+id/toolbar_installables"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:title="@string/manage_yuzu_data" app:title="@string/manage_yuzu_data"
app:navigationIcon="@drawable/ic_back" /> app:navigationIcon="@drawable/ic_back" />

View File

@ -10,14 +10,12 @@
android:id="@+id/appbar_licenses" android:id="@+id/appbar_licenses"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
android:touchscreenBlocksFocus="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_licenses" android:id="@+id/toolbar_licenses"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:title="@string/licenses" app:title="@string/licenses"
app:navigationIcon="@drawable/ic_back" /> app:navigationIcon="@drawable/ic_back" />

View File

@ -11,7 +11,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:touchscreenBlocksFocus="false"
app:elevation="0dp"> app:elevation="0dp">
<com.google.android.material.appbar.CollapsingToolbarLayout <com.google.android.material.appbar.CollapsingToolbarLayout
@ -25,7 +24,6 @@
android:id="@+id/toolbar_settings" android:id="@+id/toolbar_settings"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:touchscreenBlocksFocus="false"
app:layout_collapseMode="pin" app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_back" /> app:navigationIcon="@drawable/ic_back" />

View File

@ -6,7 +6,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:focusable="false" android:focusable="true"
android:paddingHorizontal="20dp" android:paddingHorizontal="20dp"
android:paddingVertical="16dp"> android:paddingVertical="16dp">
@ -14,11 +14,12 @@
android:id="@+id/text_container" android:id="@+id/text_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
app:layout_constraintEnd_toStartOf="@+id/addon_checkbox" android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@+id/addon_switch"
app:layout_constraintEnd_toStartOf="@+id/addon_switch"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="@+id/addon_switch">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/title" android:id="@+id/title"
@ -41,29 +42,16 @@
</LinearLayout> </LinearLayout>
<com.google.android.material.checkbox.MaterialCheckBox <com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/addon_checkbox" android:id="@+id/addon_switch"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:focusable="true" android:focusable="true"
android:gravity="center" android:gravity="center"
android:layout_marginEnd="8dp" android:nextFocusLeft="@id/addon_container"
app:layout_constraintTop_toTopOf="@+id/text_container" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toBottomOf="@+id/text_container"
app:layout_constraintEnd_toStartOf="@+id/button_delete" />
<Button
android:id="@+id/button_delete"
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/delete"
android:tooltipText="@string/delete"
app:icon="@drawable/ic_delete"
app:iconTint="?attr/colorControlNormal"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/addon_checkbox" app:layout_constraintStart_toEndOf="@id/text_container"
app:layout_constraintBottom_toBottomOf="@+id/addon_checkbox" /> app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -69,7 +69,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:visibility="gone" android:visibility="gone"
android:text="@string/use_global_setting" android:text="@string/clear"
tools:visibility="visible" /> tools:visibility="visible" />
</LinearLayout> </LinearLayout>

View File

@ -63,7 +63,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/use_global_setting" android:text="@string/clear"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" /> tools:visibility="visible" />

View File

@ -12,5 +12,4 @@
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textColor="?attr/colorPrimary" android:textColor="?attr/colorPrimary"
android:textStyle="bold" android:textStyle="bold"
android:focusable="false"
tools:text="CPU Settings" /> tools:text="CPU Settings" />

View File

@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/menu_driver_use_global" android:id="@+id/menu_driver_clear"
android:title="@string/use_global_setting" /> android:icon="@drawable/ic_clear"
android:title="@string/clear"
app:showAsAction="always" />
</menu> </menu>

View File

@ -21,11 +21,6 @@
android:icon="@drawable/ic_controller" android:icon="@drawable/ic_controller"
android:title="@string/emulation_input_overlay" /> android:title="@string/emulation_input_overlay" />
<item
android:id="@+id/menu_lock_drawer"
android:icon="@drawable/ic_unlock"
android:title="@string/emulation_input_overlay" />
<item <item
android:id="@+id/menu_exit" android:id="@+id/menu_exit"
android:icon="@drawable/ic_exit" android:icon="@drawable/ic_exit"

View File

@ -3,39 +3,38 @@
<string name="emulation_notification_channel_name">المحاكي نشط</string> <string name="emulation_notification_channel_name">المحاكي نشط</string>
<string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string> <string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string>
<string name="emulation_notification_running">يوزو قيد التشغيل</string> <string name="emulation_notification_running">يوزو يعمل</string>
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string> <string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
<string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string> <string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string>
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string> <string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string>
<!-- Setup strings --> <!-- Setup strings -->
<string name="welcome">مرحبا</string> <string name="welcome">مرحبًا</string>
<string name="welcome_description">تعرف على كيفية إعداد <b>يوزو</b> والانتقال إلى المحاكاة</string> <string name="welcome_description">والانتقال إلى المحاكاة <b>يوزو</b> تعرف على كيفية إعداد.</string>
<string name="get_started">لنبدأ</string> <string name="get_started">لنبدأ</string>
<string name="keys">المفاتيح</string> <string name="keys">المفاتيح</string>
<string name="keys_description">اختر ملف &lt;b>prod.keys&lt;/b> من الزر ادناه</string> <string name="keys_description">اختر ملف &lt;b>prod.keys&lt;/b> من الزر ادناه</string>
<string name="select_keys">إختيار المفاتيح</string> <string name="select_keys">إختيار المفاتيح</string>
<string name="games">الألعاب</string> <string name="games">الألعاب</string>
<string name="games_description">حدد مجلد &lt;b>العابك&lt;/b> من الزر ادناه.</string> <string name="games_description">اختر مجلد &lt;b>العابك&lt;/b> من الزر ادناه.</string>
<string name="done">إنهاء</string> <string name="done">إنهاء</string>
<string name="done_description">أنت جاهز تمامًا. استمتع بألعابك!</string> <string name="done_description">كل شيء جاهز./n استمتع بألعابك!</string>
<string name="text_continue">استمر</string> <string name="text_continue">استمر</string>
<string name="next">التالي</string> <string name="next">التالي</string>
<string name="back">عودة</string> <string name="back">عودة</string>
<string name="add_games">إضافة ألعاب</string> <string name="add_games">إضافة ألعاب</string>
<string name="add_games_description">حدد مجلد الألعاب الخاص بك</string> <string name="add_games_description">إختار مجلد ألعابك</string>
<string name="step_complete">مكتمل</string> <string name="step_complete">مكتمل</string>
<!-- Home strings --> <!-- Home strings -->
<string name="home_games">الألعاب</string> <string name="home_games">الألعاب</string>
<string name="home_search">البحث</string> <string name="home_search">البحث</string>
<string name="home_settings">الإعدادات</string> <string name="home_settings">الإعدادات</string>
<string name="empty_gamelist">لم يتم العثور على ملفات أو لم يتم تحديد مجلد الألعاب حتى الآن.</string> <string name="empty_gamelist">لم يتم العثور على ملفات او لم يتم تحديد مسار العاب.</string>
<string name="search_and_filter_games">البحث وتصفية الألعاب</string> <string name="search_and_filter_games">بحث وتصفية الألعاب</string>
<string name="select_games_folder">حدد مجلد الألعاب</string> <string name="select_games_folder">تحديد مجلد الألعاب</string>
<string name="manage_game_folders">إدارة مجلدات اللعبة</string>
<string name="select_games_folder_description">يسمح لـ يوزو بملء قائمة الألعاب</string> <string name="select_games_folder_description">يسمح لـ يوزو بملء قائمة الألعاب</string>
<string name="add_games_warning">تخطي تحديد مجلد الألعاب؟</string> <string name="add_games_warning">تخطُ اختيار مجلد الالعاب؟</string>
<string name="add_games_warning_description">لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد</string> <string name="add_games_warning_description">لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد</string>
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
<string name="home_search_games">البحث عن ألعاب</string> <string name="home_search_games">البحث عن ألعاب</string>
@ -46,7 +45,7 @@
<string name="install_prod_keys_warning">تخطي إضافة المفاتيح؟</string> <string name="install_prod_keys_warning">تخطي إضافة المفاتيح؟</string>
<string name="install_prod_keys_warning_description">مطلوب مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية فقط إذا تابعت</string> <string name="install_prod_keys_warning_description">مطلوب مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية فقط إذا تابعت</string>
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
<string name="notifications">الإشعارات</string> <string name="notifications">التنبيهات</string>
<string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string> <string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string>
<string name="give_permission">منح الإذن</string> <string name="give_permission">منح الإذن</string>
<string name="notification_warning">تخطي منح إذن الإشعارات؟</string> <string name="notification_warning">تخطي منح إذن الإشعارات؟</string>
@ -63,12 +62,9 @@
<string name="invalid_keys_file">تم تحديد ملف مفاتيح غير صالح</string> <string name="invalid_keys_file">تم تحديد ملف مفاتيح غير صالح</string>
<string name="install_keys_success">تم تثبيت المفاتيح بنجاح</string> <string name="install_keys_success">تم تثبيت المفاتيح بنجاح</string>
<string name="reading_keys_failure">خطأ في قراءة مفاتيح التشفير</string> <string name="reading_keys_failure">خطأ في قراءة مفاتيح التشفير</string>
<string name="install_prod_keys_failure_extension_description">وحاول مرة أخر keys تحقق من أن ملف المفاتيح له امتداد</string>
<string name="install_amiibo_keys_failure_extension_description">وحاول مرة أخر bin تحقق من أن ملف المفاتيح له امتداد</string>
<string name="invalid_keys_error">مفاتيح التشفير غير صالحة</string> <string name="invalid_keys_error">مفاتيح التشفير غير صالحة</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">الملف المحدد غير صحيح أو تالف. يرجى إعادة المفاتيح الخاصة بك</string> <string name="install_keys_failure_description">الملف المحدد غير صحيح أو تالف. يرجى إعادة المفاتيح الخاصة بك</string>
<string name="gpu_driver_manager">GPU مدير برنامج تشغيل</string>
<string name="install_gpu_driver">GPU تثبيت برنامج تشغيل</string> <string name="install_gpu_driver">GPU تثبيت برنامج تشغيل</string>
<string name="install_gpu_driver_description">قم بتثبيت برامج تشغيل بديلة للحصول على أداء أو دقة أفضل</string> <string name="install_gpu_driver_description">قم بتثبيت برامج تشغيل بديلة للحصول على أداء أو دقة أفضل</string>
<string name="advanced_settings">إعدادات متقدمة</string> <string name="advanced_settings">إعدادات متقدمة</string>
@ -86,27 +82,22 @@
<string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير الملفات يدويًا</string> <string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير الملفات يدويًا</string>
<string name="manage_save_data">إدارة حفظ البيانات</string> <string name="manage_save_data">إدارة حفظ البيانات</string>
<string name="manage_save_data_description">حفظ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string> <string name="manage_save_data_description">حفظ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string>
<string name="import_save_warning">استيراد حفظ البيانات</string>
<string name="import_save_warning_description">سيؤدي هذا إلى استبدال جميع بيانات الحفظ الموجودة بالملف المقدم. هل أنت متأكد أنك تريد الاستمرار؟</string>
<string name="import_export_saves_description">استيراد أو تصدير ملفات الحفظ</string> <string name="import_export_saves_description">استيراد أو تصدير ملفات الحفظ</string>
<string name="save_files_importing">جاري استيراد ملفات الحفظ</string>
<string name="save_files_exporting">جاري تصدير ملفات الحفظ</string>
<string name="save_file_imported_success">تم الاستيراد بنجاح</string> <string name="save_file_imported_success">تم الاستيراد بنجاح</string>
<string name="save_file_invalid_zip_structure">بنية مجلد الحفظ غير صالحة</string> <string name="save_file_invalid_zip_structure">بنية مجلد الحفظ غير صالحة</string>
<string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد الفرعي الأول هو معرف عنوان اللعبة.</string> <string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد الفرعي الأول هو معرف عنوان اللعبة.</string>
<string name="import_saves">استيراد</string> <string name="import_saves">استيراد</string>
<string name="export_saves">تصدير</string> <string name="export_saves">تصدير</string>
<string name="install_firmware">تثبيت فيرموير</string> <string name="install_firmware">تثبيت البرامج الثابتة</string>
<string name="install_firmware_description">يجب أن يكون فيرموير في أرشيف مضغوط وهو ضروري لتشغيل بعض الألعاب</string> <string name="firmware_installing">تثبيت البرامج الثابتة</string>
<string name="firmware_installing">تثبيت فيرموير</string> <string name="firmware_installed_success">تم تثبيت البرامج الثابتة بنجاح</string>
<string name="firmware_installed_success">تم تثبيت فيرموير بنجاح</string> <string name="firmware_installed_failure">فشل تثبيت البرامج الثابتة</string>
<string name="firmware_installed_failure">فشل تثبيت فيرموير</string>
<string name="share_log">مشاركة سجلات التصحيح</string> <string name="share_log">مشاركة سجلات التصحيح</string>
<string name="share_log_description">مشاركة ملف سجل يوزو لتصحيح المشكلات</string> <string name="share_log_description">مشاركة ملف سجل يوزو لتصحيح المشكلات</string>
<string name="share_log_missing">لم يتم العثور على ملف السجل</string> <string name="share_log_missing">لم يتم العثور على ملف السجل</string>
<string name="install_game_content">تثبيت محتوى اللعبة</string> <string name="install_game_content">تثبيت محتوى اللعبة</string>
<string name="install_game_content_description">DLC قم بتثبيت تحديثات اللعبة أو</string> <string name="install_game_content_description">DLC قم بتثبيت تحديثات اللعبة أو</string>
<string name="installing_game_content">جاري تثبيت المحتوى</string> <string name="installing_game_content">جارٍ تثبيت المحتوى</string>
<string name="install_game_content_failure_base">لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string> <string name="install_game_content_failure_base">لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string>
<string name="install_game_content_success_install">%1$d تم التثبيت بنجاح</string> <string name="install_game_content_success_install">%1$d تم التثبيت بنجاح</string>
<string name="install_game_content_success_overwrite">%1$d تمت الكتابة فوقه بنجاح</string> <string name="install_game_content_success_overwrite">%1$d تمت الكتابة فوقه بنجاح</string>
@ -114,39 +105,19 @@
<string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string> <string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string>
<string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى في المستقبل لمعرفة ما إذا تمت إضافة الدعم!</string> <string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى في المستقبل لمعرفة ما إذا تمت إضافة الدعم!</string>
<string name="manage_yuzu_data">إدارة بيانات يوزو</string> <string name="manage_yuzu_data">إدارة بيانات يوزو</string>
<string name="manage_yuzu_data_description">استيراد/تصدير فيرموير والمفاتيح وبيانات المستخدم والمزيد</string> <string name="manage_yuzu_data_description">استيراد/تصدير البرامج الثابتة والمفاتيح وبيانات المستخدم والمزيد!</string>
<string name="share_save_file">مشاركة ملف الحفظ</string> <string name="share_save_file">مشاركة ملف الحفظ</string>
<string name="export_save_failed">فشل تصدير الحفظ</string> <string name="export_save_failed">فشل تصدير الحفظ</string>
<string name="game_folders">مجلدات اللعبة</string>
<string name="deep_scan">فحص عميق</string>
<string name="add_game_folder">إضافة مجلد اللعبة</string>
<string name="folder_already_added">تمت إضافة هذا المجلد بالفعل</string>
<string name="game_folder_properties">خصائص مجلد اللعبة</string>
<string name="no_save_data_found">لم يتم العثور على بيانات الحفظ</string>
<!-- Applet launcher strings -->
<string name="applets">قائمة التطبيقات المصغرة</string>
<string name="applets_description">قم بتشغيل تطبيقات النظام باستخدام فيرموير المثبت</string>
<string name="applets_error_firmware">فيرموير غير مثبت</string>
<string name="applets_error_applet">التطبيق المصغر غير متوفر</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">باستخدام محرر النظام Miis عرض وتحرير</string>
<string name="cabinet_applet_description">تحرير وحذف البيانات المخزنة على أميبو</string>
<string name="cabinet_nickname_and_owner">إعدادات الاسم المستعار والمالك</string>
<string name="cabinet_game_data_eraser">ممحاة بيانات اللعبة</string>
<string name="copied_to_clipboard">نسخ إلى الحافظة</string> <string name="copied_to_clipboard">نسخ إلى الحافظة</string>
<string name="about_app_description">محاكي سويتش مفتوح المصدر</string> <string name="about_app_description">محاكي سويتش مفتوح المصدر</string>
<string name="contributors">المساهمين</string> <string name="contributors">المساهمين</string>
<string name="contributors_description">مصنوع من فريق يوزو</string>
<string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
<string name="licenses_description">المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا</string> <string name="licenses_description">المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا</string>
<string name="build">البناء</string> <string name="build">البناء</string>
<string name="user_data">بيانات المستخدم</string> <string name="user_data">بيانات المستخدم</string>
<string name="user_data_description">استيراد/تصدير جميع بيانات التطبيق. عند استيراد بيانات المستخدم، سيتم حذف جميع بيانات المستخدم الحالية!</string> <string name="exporting_user_data">جارٍ تصدير بيانات المستخدم</string>
<string name="exporting_user_data">جاري تصدير بيانات المستخدم</string> <string name="importing_user_data">جارٍ استيراد بيانات المستخدم</string>
<string name="importing_user_data">جاري استيراد بيانات المستخدم</string>
<string name="import_user_data">استيراد بيانات المستخدم</string> <string name="import_user_data">استيراد بيانات المستخدم</string>
<string name="invalid_yuzu_backup">نسخة احتياطية يوزو غير صالحة</string> <string name="invalid_yuzu_backup">نسخة احتياطية يوزو غير صالحة</string>
<string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string> <string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string>
@ -182,7 +153,7 @@
<string name="use_docked_mode">وضع الإرساء</string> <string name="use_docked_mode">وضع الإرساء</string>
<string name="use_docked_mode_description">زيادة الدقة، وانخفاض الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى خفض الدقة وزيادة الأداء.</string> <string name="use_docked_mode_description">زيادة الدقة، وانخفاض الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى خفض الدقة وزيادة الأداء.</string>
<string name="emulated_region">المنطقة التي تمت محاكاتها</string> <string name="emulated_region">المنطقة التي تمت محاكاتها</string>
<string name="emulated_language">لغة المحاكاة</string> <string name="emulated_language">لغة المحاكاه</string>
<string name="select_rtc_date">حدد التاريخ و الساعة في الوقت الحقيقي</string> <string name="select_rtc_date">حدد التاريخ و الساعة في الوقت الحقيقي</string>
<string name="select_rtc_time">حدد وقت الساعة في الوقت الفعلي</string> <string name="select_rtc_time">حدد وقت الساعة في الوقت الفعلي</string>
<string name="use_custom_rtc">ساعة مخصصة في الوقت الحقيقي</string> <string name="use_custom_rtc">ساعة مخصصة في الوقت الحقيقي</string>
@ -193,7 +164,7 @@
<string name="renderer_accuracy">مستوى الدقة</string> <string name="renderer_accuracy">مستوى الدقة</string>
<string name="renderer_resolution">(Handheld/Docked) الدقة</string> <string name="renderer_resolution">(Handheld/Docked) الدقة</string>
<string name="renderer_vsync">VSync وضع</string> <string name="renderer_vsync">VSync وضع</string>
<string name="renderer_screen_layout">اتجاه العرض</string> <string name="renderer_screen_layout">الاتجاه</string>
<string name="renderer_aspect_ratio">تناسب الابعاد</string> <string name="renderer_aspect_ratio">تناسب الابعاد</string>
<string name="renderer_anti_aliasing">طريقة مكافحة التعرج</string> <string name="renderer_anti_aliasing">طريقة مكافحة التعرج</string>
<string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string> <string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
@ -201,32 +172,31 @@
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string> <string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
<string name="renderer_reactive_flushing_description">تحسين دقة العرض في بعض الألعاب على حساب الأداء</string> <string name="renderer_reactive_flushing_description">تحسين دقة العرض في بعض الألعاب على حساب الأداء</string>
<string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string> <string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">وحدة المعالج المركزية</string> <string name="cpu">وحدة المعالج المركزية</string>
<string name="cpu_debug_mode">تصحيح أخطاء وحدة المعالجة المركزية</string> <string name="cpu_debug_mode">تصحيح أخطاء وحدة المعالجة المركزية</string>
<string name="cpu_debug_mode_description">يضع وحدة المعالجة المركزية في وضع التصحيح البطيء.</string> <string name="cpu_debug_mode_description">يضع وحدة المعالجة المركزية في وضع التصحيح البطيء.</string>
<string name="gpu">وحدة معالجة الرسومات</string> <string name="gpu">GPU</string>
<string name="renderer_api">واجهة برمجة التطبيقات</string> <string name="renderer_api">API</string>
<string name="renderer_debug">تصحيح الأخطاء الرسومية</string> <string name="renderer_debug">تصحيح الأخطاء الرسومية</string>
<string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string> <string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string>
<string name="fastmem">Fastmem</string> <string name="fastmem">Fastmem</string>
<!-- Audio settings strings --> <!-- Audio settings strings -->
<string name="audio_output_engine">محرك الإخراج</string> <string name="audio_output_engine">محرك الإخراج</string>
<string name="audio_volume">مستوى الصوت</string> <string name="audio_volume">حجم</string>
<string name="audio_volume_description">يحدد مستوى إخراج الصوت</string> <string name="audio_volume_description">يحدد حجم إخراج الصوت</string>
<!-- Miscellaneous --> <!-- Miscellaneous -->
<string name="slider_default">افتراضي</string> <string name="slider_default">افتراضي</string>
<string name="ini_saved">الإعدادات المحفوظة</string> <string name="ini_saved">الإعدادات المحفوظة</string>
<string name="gameid_saved">الإعدادات المحفوظة لـ %1$s</string> <string name="gameid_saved">الإعدادات المحفوظة لـ %1$s</string>
<string name="error_saving">خطأ في حفظ %1$s.ini: %2$s</string>
<string name="unimplemented_menu">القائمة غير المنفذة</string> <string name="unimplemented_menu">القائمة غير المنفذة</string>
<string name="loading">جاري التحميل</string> <string name="loading">جاري تحميل</string>
<string name="shutting_down">إيقاف التشغيل</string> <string name="shutting_down">إيقاف تشغيل</string>
<string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته الافتراضية؟</string> <string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته الافتراضية؟</string>
<string name="reset_to_default">إعادة التعيين إلى الوضع الافتراضي</string> <string name="reset_to_default">إعادة تعيين إلى الافتراضي</string>
<string name="reset_to_default_description">إعادة تعيين جميع الإعدادات المتقدمة</string>
<string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string> <string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string>
<string name="reset_all_settings_description">سيتم إعادة تعيين كافة الإعدادات المتقدمة إلى تكوينها الافتراضي. هذا لا يمكن التراجع عنها.</string> <string name="reset_all_settings_description">سيتم إعادة تعيين كافة الإعدادات المتقدمة إلى تكوينها الافتراضي. هذا لا يمكن التراجع عنها.</string>
<string name="settings_reset">إعادة تعيين الأعدادات</string> <string name="settings_reset">إعادة تعيين الأعدادات</string>
@ -234,77 +204,32 @@
<string name="learn_more">معرفة المزيد</string> <string name="learn_more">معرفة المزيد</string>
<string name="auto">تلقائي</string> <string name="auto">تلقائي</string>
<string name="submit">إرسال</string> <string name="submit">إرسال</string>
<string name="string_null">لا شيء</string> <string name="string_null">قيمه خاليه</string>
<string name="string_import">استيراد</string> <string name="string_import">استيراد</string>
<string name="export">تصدير</string> <string name="export">تصدير</string>
<string name="export_failed">فشل التصدير</string> <string name="export_failed">فشل التصدير</string>
<string name="import_failed">فشل الاستيراد</string> <string name="import_failed">فشل الاستيراد</string>
<string name="cancelling">إلغاء</string> <string name="cancelling">إلغاء</string>
<string name="install">تثبيت</string>
<string name="delete">حذف</string>
<string name="edit">حرر</string>
<string name="export_success">تم التصدير بنجاح</string>
<string name="start">Start</string>
<string name="clear">مسح</string>
<string name="global">عالمي</string>
<string name="custom">مخصص</string>
<string name="notice">إشعار</string>
<string name="import_complete">اكتمل الاستيراد</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">GPU حدد برنامج تشغيل</string> <string name="select_gpu_driver">GPU حدد برنامج تشغيل</string>
<string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب في استبدال برنامج تشغيل</string> <string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب في استبدال برنامج تشغيل</string>
<string name="select_gpu_driver_install">تثبيت</string> <string name="select_gpu_driver_install">تثبيت</string>
<string name="select_gpu_driver_default">افتراضي</string> <string name="select_gpu_driver_default">افتراضي</string>
<string name="select_gpu_driver_use_default">يستخدم تعريف معالج الرسومات الافتراضي</string> <string name="select_gpu_driver_use_default">يستخدم تعريف معالج الرسوميات الافتراضي</string>
<string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح</string> <string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح ، باستخدام النظام الافتراضي</string>
<string name="driver_already_installed">برنامج التشغيل مثبت بالفعل</string> <string name="system_gpu_driver">تعريف معالج الرسوميات الخاص بالنظام</string>
<string name="system_gpu_driver">تعريف معالج الرسومات الخاص بالنظام</string> <string name="installing_driver">جارٍ تثبيت برنامج التشغيل…</string>
<string name="installing_driver">جاري تثبيت برنامج التشغيل…</string>
<!-- Preferences Screen --> <!-- Preferences Screen -->
<string name="preferences_settings">إعدادات</string> <string name="preferences_settings">إعدادات</string>
<string name="preferences_general">عام</string> <string name="preferences_general">عام</string>
<string name="preferences_system">النظام</string> <string name="preferences_system">النظام</string>
<string name="preferences_system_description">وضع الإرساء ،المنطقة ،اللغة</string> <string name="preferences_graphics">الرسوميات</string>
<string name="preferences_graphics">الرسومات</string>
<string name="preferences_graphics_description">مستوى الدقة ،الدقة ،ذاكرة التخزين المؤقت للتظليل</string>
<string name="preferences_audio">الصوت</string> <string name="preferences_audio">الصوت</string>
<string name="preferences_audio_description">محرك الإخراج ، حجم الصوت</string>
<string name="preferences_theme">السمة واللون</string> <string name="preferences_theme">السمة واللون</string>
<string name="preferences_debug">تصحيح الأخطاء</string> <string name="preferences_debug">تصحيح الأخطاء</string>
<!-- Game properties -->
<string name="info">معلومات</string>
<string name="info_description">معرف البرنامج، المطور، الإصدار</string>
<string name="per_game_settings">إعدادات كل لعبة</string>
<string name="per_game_settings_description">تحرير الإعدادات الخاصة بهذه اللعبة</string>
<string name="launch_options">تشغيل الإعدادات</string>
<string name="path">المسار</string>
<string name="program_id">معرف البرنامج</string>
<string name="developer">المطور</string>
<string name="version">إصدار</string>
<string name="copy_details">نسخ التفاصيل</string>
<string name="add_ons">الإضافات</string>
<string name="add_ons_description">DLCالتعديلات والتحديثات و</string>
<string name="clear_shader_cache">مسح ذاكرة التخزين المؤقت للتظليل</string>
<string name="clear_shader_cache_description">يزيل جميع التظليلات التي تم إنشاؤها أثناء لعب هذه اللعبة</string>
<string name="clear_shader_cache_warning_description">سوف تواجه المزيد من التأتأة مع تجديد ذاكرة التخزين المؤقت للتظليل</string>
<string name="cleared_shaders_successfully">تم مسح التظليل بنجاح</string>
<string name="addons_game">إضافات: %1$s</string>
<string name="save_data">حفظ البيانات</string>
<string name="save_data_description">إدارة حفظ البيانات الخاصة بهذه اللعبة</string>
<string name="delete_save_data">حذف حفظ البيانات</string>
<string name="delete_save_data_description">يزيل كافة البيانات المحفوظة الخاصة بهذه اللعبة</string>
<string name="delete_save_data_warning_description">يؤدي هذا إلى إزالة كافة البيانات المحفوظة لهذه اللعبة بشكل لا يمكن استرداده. هل أنت متأكد أنك تريد الاستمرار؟</string>
<string name="save_data_deleted_successfully">حفظ البيانات تم حذفها بنجاح</string>
<string name="select_content_type">نوع المحتوى</string>
<string name="updates_and_dlc">DLC التحديثات والمحتوى القابل للتنزيل </string>
<string name="mods_and_cheats">تعديل وغش</string>
<string name="addon_notice">إشعار إضافي مهم</string>
<string name="invalid_directory">مجلد غير صالح</string>
<string name="addon_installed_successfully">تم تثبيت الملحق بنجاح</string>
<string name="verifying_content">جاري التحقق من المحتوى</string>
<string name="content_install_notice">إشعار تثبيت المحتوى</string>
<string name="content_install_notice_description">المحتوى الذي حددته لا يتطابق مع هذه اللعبة.هل تريد التثبيت على أية حال؟</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">الخاص بك ROM تم تشفير</string> <string name="loader_error_encrypted">الخاص بك ROM تم تشفير</string>
<string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الفيديو</string> <string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الفيديو</string>
@ -313,25 +238,24 @@
<!-- Emulation Menu --> <!-- Emulation Menu -->
<string name="emulation_exit">الخروج من المحاكاة</string> <string name="emulation_exit">الخروج من المحاكاة</string>
<string name="emulation_done">إنهاء</string> <string name="emulation_done">منجز</string>
<string name="emulation_fps_counter">عداد إطار/ثانية</string> <string name="emulation_fps_counter">عداد إطار/ثانية</string>
<string name="emulation_toggle_controls">عناصر التحكم</string> <string name="emulation_toggle_controls">تبديل عناصر التحكم</string>
<string name="emulation_rel_stick_center">مركز العصا النسبي</string> <string name="emulation_rel_stick_center">مركز العصا النسبي</string>
<string name="emulation_dpad_slide">مزلاق الأسهم</string> <string name="emulation_dpad_slide">مزلاق أزرار الاتجاهات</string>
<string name="emulation_haptics">الاهتزازات الديناميكية</string> <string name="emulation_haptics">الاهتزازات الديناميكية</string>
<string name="emulation_show_overlay">عرض التراكب</string> <string name="emulation_show_overlay">عرض التراكب</string>
<string name="emulation_toggle_all">الكل</string> <string name="emulation_toggle_all">تبديل الكل</string>
<string name="emulation_control_adjust">ضبط التراكب</string> <string name="emulation_control_adjust">ضبط التراكب</string>
<string name="emulation_control_scale">الحجم</string> <string name="emulation_control_scale">حجم</string>
<string name="emulation_control_opacity">الشفافية</string> <string name="emulation_control_opacity">العتامه</string>
<string name="emulation_touch_overlay_reset">إعادة تعيين التراكب</string> <string name="emulation_touch_overlay_reset">إعادة تعيين التراكب</string>
<string name="emulation_touch_overlay_edit">تحرير التراكب</string> <string name="emulation_touch_overlay_edit">تحرير التراكب</string>
<string name="emulation_pause">إيقاف المحاكاة مؤقتًا</string> <string name="emulation_pause">إيقاف المحاكاة مؤقتًا</string>
<string name="emulation_unpause">إلغاء الإيقاف المؤقت للمحاكاة</string> <string name="emulation_unpause">إلغاء الإيقاف المؤقت للمضاهاة</string>
<string name="emulation_input_overlay">خيارات التراكب</string> <string name="emulation_input_overlay">خيارات التراكب</string>
<string name="touchscreen">شاشة اللمس</string>
<string name="load_settings">جاري تحميل الإعدادات</string> <string name="load_settings">جارٍ تحميل الإعدادات</string>
<!-- Software keyboard --> <!-- Software keyboard -->
<string name="software_keyboard">لوحة المفاتيح البرمجية</string> <string name="software_keyboard">لوحة المفاتيح البرمجية</string>
@ -358,7 +282,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Byte</string> <string name="memory_byte">Byte</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">KB</string> <string name="memory_kilobyte">KB</string>
<string name="memory_megabyte">MB</string> <string name="memory_megabyte">MB</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -403,9 +326,10 @@
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">تلقائي</string> <string name="screen_layout_landscape">افقي</string>
<string name="screen_layout_landscape">أفقي</string>
<string name="screen_layout_portrait">عمودي</string> <string name="screen_layout_portrait">عمودي</string>
<string name="screen_layout_auto">تلقائي</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">(16:9) افتراضي</string> <string name="ratio_default">(16:9) افتراضي</string>
<string name="ratio_force_four_three">4:3 فرض</string> <string name="ratio_force_four_three">4:3 فرض</string>
@ -413,20 +337,16 @@
<string name="ratio_force_sixteen_ten">16:10 فرض</string> <string name="ratio_force_sixteen_ten">16:10 فرض</string>
<string name="ratio_stretch">تمتد إلى النافذة</string> <string name="ratio_stretch">تمتد إلى النافذة</string>
<!-- CPU Backend -->
<string name="cpu_backend_dynarmic">Dynarmic (بطيء)</string>
<string name="cpu_backend_nce">تنفيذ التعليمات البرمجية الأصلية (NCE)</string>
<!-- CPU Accuracy --> <!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">دقه</string> <string name="cpu_accuracy_accurate">دقه</string>
<string name="cpu_accuracy_unsafe">غير آمن</string> <string name="cpu_accuracy_unsafe">غير آمن</string>
<string name="cpu_accuracy_paranoid">Paranoid (بطيء)</string> <string name="cpu_accuracy_paranoid">Paranoid (Slow)</string>
<!-- Gamepad Buttons --> <!-- Gamepad Buttons -->
<string name="gamepad_d_pad">الأسهم</string> <string name="gamepad_d_pad">أزرار الاتجاهات</string>
<string name="gamepad_left_stick">العصا اليسرى</string> <string name="gamepad_left_stick">العصا اليسرى</string>
<string name="gamepad_right_stick">العصا اليمنى</string> <string name="gamepad_right_stick">العصا اليمنى</string>
<string name="gamepad_home">شاشة الرئيسية</string> <string name="gamepad_home">شاشة الإستقبال</string>
<string name="gamepad_screenshot">لقطة شاشة</string> <string name="gamepad_screenshot">لقطة شاشة</string>
<!-- Disk shader cache --> <!-- Disk shader cache -->
@ -442,16 +362,11 @@
<string name="change_theme_mode">تغيير وضع السمة</string> <string name="change_theme_mode">تغيير وضع السمة</string>
<string name="theme_mode_follow_system">اتبع النظام</string> <string name="theme_mode_follow_system">اتبع النظام</string>
<string name="theme_mode_light">فاتح</string> <string name="theme_mode_light">فاتح</string>
<string name="theme_mode_dark">داكن</string> <string name="theme_mode_dark">غامق</string>
<!-- Audio output engines -->
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">خلفيات سوداء</string> <string name="use_black_backgrounds">خلفيات سوداء</string>
<string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلفيات سوداء.</string> <string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلفيات سوداء.</string>

View File

@ -157,6 +157,7 @@
<string name="renderer_reactive_flushing_description">وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی.</string> <string name="renderer_reactive_flushing_description">وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی.</string>
<string name="use_disk_shader_cache">بیرگەخێرای سێبەری دیسک</string> <string name="use_disk_shader_cache">بیرگەخێرای سێبەری دیسک</string>
<string name="use_disk_shader_cache_description">پچڕپچڕی کەمدەکاتەوە بە هەڵگرتن و بارکردنی سێبەری دروستکراو لە ناوخۆدا.</string> <string name="use_disk_shader_cache_description">پچڕپچڕی کەمدەکاتەوە بە هەڵگرتن و بارکردنی سێبەری دروستکراو لە ناوخۆدا.</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">CPU</string> <string name="cpu">CPU</string>
<string name="renderer_api">API گرافیک</string> <string name="renderer_api">API گرافیک</string>
@ -182,15 +183,13 @@
<string name="submit">پێشکەشکردن</string> <string name="submit">پێشکەشکردن</string>
<string name="string_import">هاوردەکردن</string> <string name="string_import">هاوردەکردن</string>
<string name="export">هەناردەکردن</string> <string name="export">هەناردەکردن</string>
<string name="install">دامەزراندن</string>
<string name="delete">سڕینەوە</string>
<string name="clear">سڕینەوە</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">هەڵبژاردنی وەگەڕخەری GPU</string> <string name="select_gpu_driver">هەڵبژاردنی وەگەڕخەری GPU</string>
<string name="select_gpu_driver_title">حەز دەکەیت وەگەڕخەری GPU ی ئێستات بگۆڕیت؟</string> <string name="select_gpu_driver_title">حەز دەکەیت وەگەڕخەری GPU ی ئێستات بگۆڕیت؟</string>
<string name="select_gpu_driver_install">دامەزراندن</string> <string name="select_gpu_driver_install">دامەزراندن</string>
<string name="select_gpu_driver_default">بنەڕەت</string> <string name="select_gpu_driver_default">بنەڕەت</string>
<string name="select_gpu_driver_use_default">بەکارهێنانی وەگەڕخەری GPU ی بنەڕەت</string> <string name="select_gpu_driver_use_default">بەکارهێنانی وەگەڕخەری GPU ی بنەڕەت</string>
<string name="select_gpu_driver_error">وەگەڕخەری نادروست هەڵبژێردرا، بە بەکارهێنانی بنەڕەتی سیستەم!</string>
<string name="system_gpu_driver">وەگەڕخەری GPU ی سیستەم</string> <string name="system_gpu_driver">وەگەڕخەری GPU ی سیستەم</string>
<string name="installing_driver">دامەزراندنی وەگەڕخەر...</string> <string name="installing_driver">دامەزراندنی وەگەڕخەر...</string>
@ -202,8 +201,7 @@
<string name="preferences_audio">دەنگ</string> <string name="preferences_audio">دەنگ</string>
<string name="preferences_theme">ڕەنگ و ڕووکار</string> <string name="preferences_theme">ڕەنگ و ڕووکار</string>
<string name="preferences_debug">چاککردنەوە</string> <string name="preferences_debug">چاککردنەوە</string>
<string name="path">ڕێڕەو</string>
<string name="version">وەشان</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">ڕۆمەکەت کۆدکراوە</string> <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-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]></string>
@ -230,7 +228,6 @@
<string name="emulation_pause">وەستاندنی ئیمولەیشن</string> <string name="emulation_pause">وەستاندنی ئیمولەیشن</string>
<string name="emulation_unpause">لادانی وەستاندنی ئیمولەیشن</string> <string name="emulation_unpause">لادانی وەستاندنی ئیمولەیشن</string>
<string name="emulation_input_overlay">هەڵبژاردەکانی داپۆشەر</string> <string name="emulation_input_overlay">هەڵبژاردەکانی داپۆشەر</string>
<string name="touchscreen">رووکاری لەمسی</string>
<string name="load_settings">بارکردنی ڕێکخستنەکان...</string> <string name="load_settings">بارکردنی ڕێکخستنەکان...</string>
@ -256,7 +253,6 @@
<string name="region_korea">کۆریا</string> <string name="region_korea">کۆریا</string>
<string name="region_taiwan">تایوان</string> <string name="region_taiwan">تایوان</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
<!-- Renderer APIs --> <!-- Renderer APIs -->
<string name="renderer_vulkan">ڤوڵکان</string> <string name="renderer_vulkan">ڤوڵکان</string>
@ -294,8 +290,8 @@
<string name="anti_aliasing_fxaa">FXAA</string> <string name="anti_aliasing_fxaa">FXAA</string>
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts -->
<string name="screen_layout_auto">خودکار</string> <string name="screen_layout_auto">خودکار</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">بنەڕەت (16:9)</string> <string name="ratio_default">بنەڕەت (16:9)</string>
<string name="ratio_force_four_three">ڕووبەری 4:3</string> <string name="ratio_force_four_three">ڕووبەری 4:3</string>
@ -330,12 +326,6 @@
<string name="theme_mode_light">ڕوناکی</string> <string name="theme_mode_light">ڕوناکی</string>
<string name="theme_mode_dark">تاریک</string> <string name="theme_mode_dark">تاریک</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">پاشبنەمای ڕەش</string> <string name="use_black_backgrounds">پاشبنەمای ڕەش</string>
<string name="use_black_backgrounds_description">لە کاتی بەکارهێنانی ڕووکاری تاریکدا، پاشبنەمای ڕەش دادەنێ.</string> <string name="use_black_backgrounds_description">لە کاتی بەکارهێنانی ڕووکاری تاریکدا، پاشبنەمای ڕەش دادەنێ.</string>

View File

@ -1,265 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="emulation_notification_channel_name">Emulace je aktivní</string>
<string name="notice_notification_channel_name">Upozornění a chyby</string>
<string name="notice_notification_channel_description">Ukáže oznámení v případě chyby.</string>
<string name="notification_permission_not_granted">Oznámení nejsou oprávněna!</string>
<!-- Setup strings -->
<string name="welcome">Vítejte!</string>
<string name="get_started">Začít</string>
<string name="keys">Klíče</string>
<string name="select_keys">Vybrat klíče</string>
<string name="games">Hry</string>
<string name="done">Hotovo</string>
<string name="done_description">Vše je připraveno.\nUžijte si vaše hry!</string>
<string name="text_continue">Pokračovat</string>
<string name="next">Další</string>
<string name="back">Zpět</string>
<string name="add_games">Přidat hry</string>
<string name="add_games_description">Vyber svoji složku se hrami</string>
<!-- Home strings -->
<string name="home_games">Hry</string>
<string name="home_search">Hledat</string>
<string name="home_settings">Nastavení</string>
<string name="empty_gamelist">Nebyly nalezeny žádné soubory nebo ještě nebyl vybrán žádný adresář s hrami.</string>
<string name="search_and_filter_games">Hledat a filtrovat hry</string>
<string name="select_games_folder">Vybrat složku s hrami</string>
<string name="manage_game_folders">Spravovat složky s hrami</string>
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
<string name="install_prod_keys">Instalovat prod.keys</string>
<string name="install_prod_keys_warning">Přeskočit přidávání klíčů?</string>
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
<string name="notifications">Oznámení</string>
<string name="give_permission">Udělit oprávnění</string>
<string name="notification_warning">Přeskočit udělení oprávnění k oznámení?</string>
<string name="notification_warning_description">yuzu vám nebude schopno oznámit důležité informace.</string>
<string name="permission_denied">Oprávnění zamítnuto</string>
<string name="permission_denied_description">Zamítnul jste toto oprávnění příliš mnohokrát, musíte manuálně udělit oprávnění v nastavení systému.</string>
<string name="about">O aplikaci</string>
<string name="about_description">Verze sestavení, titulky a více</string>
<string name="warning_help">Pomoc</string>
<string name="warning_skip">Přeskočit</string>
<string name="warning_cancel">Zrušit</string>
<string name="install_amiibo_keys">Instalovat Amiibo klíče</string>
<string name="install_amiibo_keys_description">Povinné použití Amiibo ve hře</string>
<string name="invalid_keys_file">Vybrané klíče jsou neplatné</string>
<string name="install_keys_success">Klíče úspěšně nainstalovány</string>
<string name="reading_keys_failure">Chyba při čtení šifrovacích klíčů</string>
<string name="invalid_keys_error">Neplatné šifrovací klíče</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="gpu_driver_manager">Správce ovladače GPU</string>
<string name="install_gpu_driver">Instalovat GPU ovladač</string>
<string name="advanced_settings">Pokročilé nastavení</string>
<string name="settings_description">Konfigurovat nastavení emulátoru</string>
<string name="search_recently_played">Nedávno hrané</string>
<string name="search_recently_added">Nedávno přidané</string>
<string name="search_homebrew">Homebrew</string>
<string name="open_user_folder">Otevřít yuzu složku</string>
<string name="open_user_folder_description">Spravovat soubory yuzu</string>
<string name="no_file_manager">Nenalezen žádný správce souborů</string>
<string name="notification_no_directory_link">Nepovedlo se otevřít yuzu složku</string>
<string name="manage_save_data">Spravovat data postupu ve hře</string>
<string name="manage_save_data_description">Data postupu nalezeny. Prosím vyberte možnost.</string>
<string name="import_export_saves_description">Importovat nebo exportovat data postupu</string>
<string name="save_file_imported_success">Uspěšně importováno</string>
<string name="save_file_invalid_zip_structure">Neplatná struktura dat postupu</string>
<string name="import_saves">Importovat</string>
<string name="export_saves">Exportovat</string>
<string name="install_firmware">Nainstalovat firmware</string>
<string name="firmware_installing">Instalování firmwaru</string>
<string name="firmware_installed_success">Firmware byl úspěšně nainstalován</string>
<string name="firmware_installed_failure">Instalace firmwaru selhala</string>
<string name="install_game_content">Nainstalovat obsah hry</string>
<string name="install_game_content_description">Nainstalovat aktualizace hry nebo DLC</string>
<string name="installing_game_content">Instalování obsahu...</string>
<string name="install_game_content_failure">Chyba při instalaci soubor(ů) do NAND</string>
<string name="manage_yuzu_data">Spravovat data yuzu</string>
<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>
<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="cabinet_nickname_and_owner">Nastavení přezdívky a vlastníka</string>
<!-- About screen strings -->
<string name="gaia_is_not_real">Gaia není skutečná</string>
<string name="copied_to_clipboard">Zkopírováno do schránky</string>
<string name="about_app_description">Open-source Switch emulátor</string>
<string name="contributors">Přispěvatelé</string>
<string name="contributors_description">Vyrobeno s \u2764 od yuzu týmu</string>
<string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
<string name="build">Číslo sestavení</string>
<string name="user_data">Uživatelská data</string>
<string name="exporting_user_data">Exportování uživatelských dat...</string>
<string name="importing_user_data">Importování uživatelských dat...</string>
<string name="import_user_data">Importovat uživatelská data</string>
<string name="invalid_yuzu_backup">Neplatná záloha yuzu</string>
<string name="user_data_export_success">Uživatelská data byla úspěšně exportována.</string>
<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="support_link">https://discord.gg/u77vRWY</string>
<string name="website_link">https://yuzu-emu.org/</string>
<string name="github_link">https://github.com/yuzu-emu</string>
<string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</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>
<string name="cpu_accuracy">CPU přesnost</string>
<string name="emulated_region">Emulovaná oblast</string>
<string name="emulated_language">Emulovaný jazyk</string>
<string name="use_custom_rtc">Vlastní RTC</string>
<!-- Graphics settings strings -->
<string name="renderer_accuracy">Úroveň přesnosti</string>
<string name="renderer_vsync">VSync režim</string>
<string name="renderer_screen_layout">Orientace</string>
<string name="renderer_aspect_ratio">Poměr stran</string>
<!-- Debug settings strings -->
<string name="cpu">CPU</string>
<string name="renderer_api">API</string>
<!-- Audio settings strings -->
<string name="audio_output_engine">Výstupní engine</string>
<string name="audio_volume">Hlasitost</string>
<string name="audio_volume_description">Udává hlasitost zvukového výstupu.</string>
<!-- Miscellaneous -->
<string name="slider_default">Výchozí</string>
<string name="ini_saved">Nastavení uložena</string>
<string name="gameid_saved">Uložena nastavení pro %1$s</string>
<string name="loading">Načítání...</string>
<string name="shutting_down">Vypínání...</string>
<string name="reset_setting_confirmation">Chcete obnovit toto nastavení zpět na jeho výchozí hodnotu?</string>
<string name="reset_to_default">Navrátit k výchozímu</string>
<string name="reset_all_settings">Resetovat všechna nastavení?</string>
<string name="reset_all_settings_description">Všechna pokročilá nastavení budou obnovena na jejich výchozí konfiguraci. Toto nelze vrátit zpět.</string>
<string name="close">Zavřít</string>
<string name="learn_more">Zjistit více</string>
<string name="auto">Automatické</string>
<string name="string_import">Importovat</string>
<string name="export">Exportovat</string>
<string name="install">Nainstalovat</string>
<string name="delete">Smazat</string>
<string name="export_success">Úspěšně exportováno</string>
<string name="start">Start</string>
<string name="clear">Vymazat</string>
<string name="custom">Vlastní</string>
<!-- GPU driver installation -->
<string name="select_gpu_driver">Vybrat GPU ovladač</string>
<string name="select_gpu_driver_title">Chcete nahradit váš aktuální ovladač GPU?</string>
<string name="select_gpu_driver_install">Nainstalovat</string>
<string name="select_gpu_driver_default">Výchozí</string>
<string name="select_gpu_driver_error">Vybrán neplatný ovladač</string>
<string name="driver_already_installed">Ovladač již nainstalován</string>
<string name="system_gpu_driver">Systémový ovladač GPU</string>
<string name="installing_driver">Instalování ovladače...</string>
<!-- Preferences Screen -->
<string name="preferences_settings">Nastavení</string>
<string name="preferences_general">Obecné</string>
<string name="preferences_system">Systém</string>
<string name="preferences_graphics">Grafika</string>
<string name="preferences_audio">Zvuk</string>
<string name="preferences_audio_description">Výstupní engine, hlasitost</string>
<string name="preferences_theme">Vzhled a barva</string>
<string name="preferences_debug">Ladění</string>
<!-- Game properties -->
<string name="info">Info</string>
<string name="path">Cesta</string>
<string name="developer">Vývojář</string>
<string name="version">Verze</string>
<string name="copy_details">Zkopírovat podrobnosti</string>
<string name="add_ons">Modifkace</string>
<string name="addons_game">Rozšíření: %1$s</string>
<string name="select_content_type">Typ obsahu</string>
<string name="updates_and_dlc">Aktualizace a DLC</string>
<string name="mods_and_cheats">Módy a cheaty</string>
<string name="addon_installed_successfully">Rozšíření úspěšně nainstalováno</string>
<string name="verifying_content">Ověřování obsahu...</string>
<string name="emulation_done">Hotovo</string>
<string name="emulation_control_scale">Měřítko</string>
<string name="emulation_control_opacity">Průhlednost</string>
<string name="touchscreen">Dotyková obrazovka</string>
<!-- Errors and warnings -->
<string name="abort_button">Přerušit</string>
<string name="continue_button">Pokračovat</string>
<string name="system_archive_not_found">Systémový Archív Nenalezen</string>
<string name="save_load_error">Ukládací/Načítací chyba</string>
<string name="fatal_error">Fatální Chyba</string>
<!-- Region Names -->
<string name="region_japan">Japonsko</string>
<string name="region_usa">USA</string>
<string name="region_europe">Evropa</string>
<string name="region_australia">Austrálie</string>
<string name="region_china">Čína</string>
<string name="region_korea">Korea</string>
<string name="region_taiwan">Taiwan</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_gigabyte">GB</string>
<!-- Renderer APIs -->
<string name="renderer_vulkan">Vulkan</string>
<string name="renderer_none">Žádné</string>
<!-- Renderer Accuracy -->
<string name="renderer_accuracy_normal">Normální</string>
<string name="renderer_accuracy_high">Vysoká</string>
<!-- Resolutions -->
<string name="resolution_half">0.5X (360p/540p)</string>
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
<string name="resolution_one">1X (720p/1080p)</string>
<string name="resolution_two">2X (1440p/2160p) (Pomalé)</string>
<string name="resolution_three">3X (2160p/3240p) (Pomalé)</string>
<string name="resolution_four">4X (2880p/4320p) (Pomalé)</string>
<string name="scaling_filter_bilinear">Bilineární</string>
<string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
<!-- Anti-Aliasing -->
<string name="anti_aliasing_none">Žádné</string>
<string name="anti_aliasing_fxaa">FXAA</string>
<string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts -->
<string name="screen_layout_auto">Automatické</string>
<!-- Aspect Ratios -->
<string name="ratio_default">Výchozí (16:9)</string>
<string name="ratio_force_four_three">Vynutit 4:3</string>
<string name="ratio_force_twenty_one_nine">Vynutit 21:9</string>
<!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">Přesné</string>
<string name="cpu_accuracy_unsafe">Nebezpečné</string>
<string name="gamepad_home">Home</string>
<string name="building_shaders">Budování shaderů</string>
<!-- Theme options -->
<string name="change_app_theme">Změnit vzhled aplikace</string>
<string name="theme_default">Výchozí</string>
<string name="theme_material_you">Material You</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Změnit styl vzhledu</string>
<string name="theme_mode_follow_system">Podle systému</string>
<string name="theme_mode_light">Světlé</string>
<string name="theme_mode_dark">Tmavé</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Černá pozadí</string>
<!-- Picture-In-Picture -->
<string name="picture_in_picture">Obraz v obraze</string>
<string name="mute">Ztlumit</string>
<string name="unmute">Vypnout ztlumení</string>
<!-- Licenses screen strings -->
<string name="licenses">Licence</string>
</resources>

View File

@ -34,7 +34,6 @@
<string name="empty_gamelist">Es wurden keine Dateien gefunden oder es wurde noch kein Spielverzeichnis ausgewählt.</string> <string name="empty_gamelist">Es wurden keine Dateien gefunden oder es wurde noch kein Spielverzeichnis ausgewählt.</string>
<string name="search_and_filter_games">Spiele suchen und filtern</string> <string name="search_and_filter_games">Spiele suchen und filtern</string>
<string name="select_games_folder">Spieleverzeichnis auswählen</string> <string name="select_games_folder">Spieleverzeichnis auswählen</string>
<string name="manage_game_folders">Spiele-Ordner verwalten</string>
<string name="select_games_folder_description">Erlaubt yuzu die Spieleliste zu füllen</string> <string name="select_games_folder_description">Erlaubt yuzu die Spieleliste zu füllen</string>
<string name="add_games_warning">Auswahl des Spieleverzeichnisses überspringen?</string> <string name="add_games_warning">Auswahl des Spieleverzeichnisses überspringen?</string>
<string name="add_games_warning_description">Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist.</string> <string name="add_games_warning_description">Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist.</string>
@ -68,11 +67,9 @@
<string name="invalid_keys_error">Ungültige Schlüssel</string> <string name="invalid_keys_error">Ungültige Schlüssel</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">Die ausgewählte Datei ist falsch oder beschädigt. Bitte kopieren Sie Ihre Schlüssel erneut.</string> <string name="install_keys_failure_description">Die ausgewählte Datei ist falsch oder beschädigt. Bitte kopieren Sie Ihre Schlüssel erneut.</string>
<string name="gpu_driver_manager">GPU-Treiber Verwaltung</string>
<string name="install_gpu_driver">GPU-Treiber installieren</string> <string name="install_gpu_driver">GPU-Treiber installieren</string>
<string name="install_gpu_driver_description">Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren</string> <string name="install_gpu_driver_description">Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren</string>
<string name="advanced_settings">Erweiterte Einstellungen</string> <string name="advanced_settings">Erweiterte Einstellungen</string>
<string name="advanced_settings_game">Erweiterte Einstellungen: %1$s</string>
<string name="settings_description">Emulatoreinstellungen konfigurieren</string> <string name="settings_description">Emulatoreinstellungen konfigurieren</string>
<string name="search_recently_played">Kürzlich gespielt</string> <string name="search_recently_played">Kürzlich gespielt</string>
<string name="search_recently_added">Kürzlich hinzugefügt</string> <string name="search_recently_added">Kürzlich hinzugefügt</string>
@ -86,11 +83,7 @@
<string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Dateimanagers.</string> <string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Dateimanagers.</string>
<string name="manage_save_data">Speicherdaten verwalten</string> <string name="manage_save_data">Speicherdaten verwalten</string>
<string name="manage_save_data_description">Speicherdaten gefunden. Bitte wähle unten eine Option aus.</string> <string name="manage_save_data_description">Speicherdaten gefunden. Bitte wähle unten eine Option aus.</string>
<string name="import_save_warning">Speicherdaten importieren</string>
<string name="import_save_warning_description">Das überschreibt alle existierenden Speicherdaten für dieses Spiel mit der ausgewählten Datei. Wirklich fortfahren?</string>
<string name="import_export_saves_description">Speicherdaten importieren oder exportieren</string> <string name="import_export_saves_description">Speicherdaten importieren oder exportieren</string>
<string name="save_files_importing">Importiere Speicherdaten...</string>
<string name="save_files_exporting">Exportiere Speicherdaten...</string>
<string name="save_file_imported_success">Erfolgreich importiert</string> <string name="save_file_imported_success">Erfolgreich importiert</string>
<string name="save_file_invalid_zip_structure">Ungültige Speicherverzeichnisstruktur</string> <string name="save_file_invalid_zip_structure">Ungültige Speicherverzeichnisstruktur</string>
<string name="save_file_invalid_zip_structure_description">Der erste Unterordnername muss die Titel-ID des Spiels sein.</string> <string name="save_file_invalid_zip_structure_description">Der erste Unterordnername muss die Titel-ID des Spiels sein.</string>
@ -105,17 +98,8 @@
<string name="share_log_description">Debug-Logs an yuzu zur Untersuchung absenden</string> <string name="share_log_description">Debug-Logs an yuzu zur Untersuchung absenden</string>
<string name="share_log_missing">Keine Log-Datei gefunden</string> <string name="share_log_missing">Keine Log-Datei gefunden</string>
<string name="install_game_content">Spiel installieren</string> <string name="install_game_content">Spiel installieren</string>
<string name="install_game_content_description">Spiel-Updates oder DLCs installieren</string> <string name="install_game_content_description">Spiel Update oder DLC installieren</string>
<string name="installing_game_content">Installiere...</string>
<string name="install_game_content_failed_count">%1$d Installationsfehler</string>
<string name="install_game_content_success_install">%1$d erfolgreich installiert</string>
<string name="install_game_content_success_overwrite">%1$d erfolgreich überschrieben</string>
<string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string> <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
<string name="manage_yuzu_data">yuzu-Daten Verwalten</string>
<string name="share_save_file">Speicherdaten teilen</string>
<string name="game_folders">Spiele-Ordner</string>
<string name="add_game_folder">Spiele-Ordner hinzufügen</string>
<string name="applets_error_firmware">Firmware nicht installiert</string>
<!-- About screen strings --> <!-- About screen strings -->
<string name="gaia_is_not_real">Gaia ist nicht real</string> <string name="gaia_is_not_real">Gaia ist nicht real</string>
<string name="copied_to_clipboard">In die Zwischenablage kopiert</string> <string name="copied_to_clipboard">In die Zwischenablage kopiert</string>
@ -126,10 +110,6 @@
<string name="licenses_description">Projekte, die yuzu für Android möglich machen </string> <string name="licenses_description">Projekte, die yuzu für Android möglich machen </string>
<string name="build">Build</string> <string name="build">Build</string>
<string name="user_data">Nutzerdaten</string> <string name="user_data">Nutzerdaten</string>
<string name="importing_user_data">Importiere Nutzerdaten...</string>
<string name="import_user_data">Nutzerdaten importieren</string>
<string name="user_data_export_success">Nutzerdaten erfolgreich exportiert</string>
<string name="user_data_import_success">Nutzerdaten erfolgreich importiert</string>
<string name="user_data_export_cancelled">Export abgebrochen</string> <string name="user_data_export_cancelled">Export abgebrochen</string>
<string name="support_link">https://discord.gg/u77vRWY</string> <string name="support_link">https://discord.gg/u77vRWY</string>
<string name="website_link">https://yuzu-emu.org/</string> <string name="website_link">https://yuzu-emu.org/</string>
@ -157,7 +137,7 @@
<string name="cpu_accuracy">CPU-Genauigkeit</string> <string name="cpu_accuracy">CPU-Genauigkeit</string>
<!-- System settings strings --> <!-- System settings strings -->
<string name="use_docked_mode">Gedockter Modus</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> <string name="use_docked_mode_description">Der Docked Modus erhöht die Auflösung, verringert die aber die Leistung. Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Leistung.</string>
<string name="emulated_region">Emulierte Region</string> <string name="emulated_region">Emulierte Region</string>
<string name="emulated_language">Emulierte Sprache</string> <string name="emulated_language">Emulierte Sprache</string>
<string name="select_rtc_date">RTC-Datum auswählen</string> <string name="select_rtc_date">RTC-Datum auswählen</string>
@ -165,12 +145,10 @@
<string name="use_custom_rtc">Benutzerdefinierte Echtzeituhr</string> <string name="use_custom_rtc">Benutzerdefinierte Echtzeituhr</string>
<!-- Graphics settings strings --> <!-- Graphics settings strings -->
<string name="renderer_accuracy">Genauigkeitsstufe</string> <string name="renderer_accuracy">Genauigkeitsstufe</string>
<string name="renderer_resolution">Auflösung (Mobil/Gedockt)</string>
<string name="renderer_vsync">VSync-Modus</string> <string name="renderer_vsync">VSync-Modus</string>
<string name="renderer_screen_layout">Orientierung</string> <string name="renderer_screen_layout">Orientierung</string>
<string name="renderer_aspect_ratio">Seitenverhältnis</string> <string name="renderer_aspect_ratio">Seitenverhältnis</string>
<string name="renderer_scaling_filter">Fensteranpassungsfilter</string> <string name="renderer_scaling_filter">Fensteranpassungsfilter</string>
<string name="renderer_anti_aliasing">Kantenglättung</string>
<string name="renderer_force_max_clock">Maximale Taktfrequenz erzwingen (nur Adreno)</string> <string name="renderer_force_max_clock">Maximale Taktfrequenz erzwingen (nur Adreno)</string>
<string name="renderer_force_max_clock_description">Erzwingt den Betrieb der GPU mit der maximal möglichen Taktfrequenz (Temperaturbeschränkungen werden weiterhin angewendet).</string> <string name="renderer_force_max_clock_description">Erzwingt den Betrieb der GPU mit der maximal möglichen Taktfrequenz (Temperaturbeschränkungen werden weiterhin angewendet).</string>
<string name="renderer_asynchronous_shaders">Asynchrone Shader nutzen</string> <string name="renderer_asynchronous_shaders">Asynchrone Shader nutzen</string>
@ -190,12 +168,9 @@
<string name="error_saving">Fehler beim Speichern von %1$s.ini: %2$s</string> <string name="error_saving">Fehler beim Speichern von %1$s.ini: %2$s</string>
<string name="unimplemented_menu">Unimplementiertes Menü</string> <string name="unimplemented_menu">Unimplementiertes Menü</string>
<string name="loading">Lädt...</string> <string name="loading">Lädt...</string>
<string name="shutting_down">Beendet...</string>
<string name="reset_setting_confirmation">Möchtest du diese Einstellung auf den Standardwert zurücksetzen?</string> <string name="reset_setting_confirmation">Möchtest du diese Einstellung auf den Standardwert zurücksetzen?</string>
<string name="reset_to_default">Auf Standard zurücksetzen</string> <string name="reset_to_default">Auf Standard zurücksetzen</string>
<string name="reset_to_default_description">Setzt alle erweiterten Einstellungen zurück</string>
<string name="reset_all_settings">Alle Einstellungen zurücksetzen?</string> <string name="reset_all_settings">Alle Einstellungen zurücksetzen?</string>
<string name="reset_all_settings_description">Alle erweiterten Einstellungen werden auf ihren Standardwert zurückgesetzt. Dies kann nicht rückgängig gemacht werden.</string>
<string name="settings_reset">Einstellungen zurückgesetzt</string> <string name="settings_reset">Einstellungen zurückgesetzt</string>
<string name="close">Schließen</string> <string name="close">Schließen</string>
<string name="learn_more">Mehr erfahren</string> <string name="learn_more">Mehr erfahren</string>
@ -207,20 +182,14 @@
<string name="export_failed">Export fehlgeschlagen</string> <string name="export_failed">Export fehlgeschlagen</string>
<string name="import_failed">Import fehlgeschlagen</string> <string name="import_failed">Import fehlgeschlagen</string>
<string name="cancelling">Abbrechen</string> <string name="cancelling">Abbrechen</string>
<string name="install">Installieren</string>
<string name="delete">Löschen</string>
<string name="edit">Bearbeiten</string>
<string name="export_success">Erfolgreich exportiert</string>
<string name="start">Start</string>
<string name="clear">Löschen</string>
<string name="custom">Benutzerdefiniert</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">GPU-Treiber auswählen</string> <string name="select_gpu_driver">GPU-Treiber auswählen</string>
<string name="select_gpu_driver_title">Möchtest du deinen aktuellen GPU-Treiber ersetzen?</string> <string name="select_gpu_driver_title">Möchtest du deinen aktuellen GPU-Treiber ersetzen?</string>
<string name="select_gpu_driver_install">Installieren</string> <string name="select_gpu_driver_install">Installieren</string>
<string name="select_gpu_driver_default">Standard</string> <string name="select_gpu_driver_default">Standard</string>
<string name="select_gpu_driver_use_default">Standard GPU-Treiber wird verwendet</string> <string name="select_gpu_driver_use_default">Standard GPU-Treiber wird verwendet</string>
<string name="driver_already_installed">Treiber bereits installiert</string> <string name="select_gpu_driver_error">Ungültiger Treiber ausgewählt, Standard-Treiber wird verwendet!</string>
<string name="system_gpu_driver">System GPU-Treiber</string> <string name="system_gpu_driver">System GPU-Treiber</string>
<string name="installing_driver">Treiber wird installiert...</string> <string name="installing_driver">Treiber wird installiert...</string>
@ -228,37 +197,11 @@
<string name="preferences_settings">Einstellungen</string> <string name="preferences_settings">Einstellungen</string>
<string name="preferences_general">Allgemein</string> <string name="preferences_general">Allgemein</string>
<string name="preferences_system">System</string> <string name="preferences_system">System</string>
<string name="preferences_system_description">Gedockter Modus, Region, Sprache</string>
<string name="preferences_graphics">Grafik</string> <string name="preferences_graphics">Grafik</string>
<string name="preferences_graphics_description">Genauigkeitsstufe, Auflösung, Shader-Cache</string>
<string name="preferences_audio">Audio</string> <string name="preferences_audio">Audio</string>
<string name="preferences_audio_description">Ausgabe-Engine, Lautstärke</string>
<string name="preferences_theme">Theme und Farbe</string> <string name="preferences_theme">Theme und Farbe</string>
<string name="preferences_debug">Debug</string> <string name="preferences_debug">Debug</string>
<!-- Game properties -->
<string name="info">Info</string>
<string name="info_description">Programm-ID, Entwickler, Version</string>
<string name="per_game_settings">Spieleinstellungen</string>
<string name="per_game_settings_description">Einstellungen für dieses Spiel ändern</string>
<string name="path">Pfad</string>
<string name="program_id">Programm-ID</string>
<string name="developer">Entwickler</string>
<string name="version">Version</string>
<string name="copy_details">Details kopieren</string>
<string name="add_ons">Add-ons</string>
<string name="add_ons_description">Mods, Updates und DLC aktivieren oder deaktivieren</string>
<string name="clear_shader_cache">Shader-Cache löschen</string>
<string name="clear_shader_cache_description">Löscht alle für dieses Spiel erstellten Shader</string>
<string name="cleared_shaders_successfully">Shader erfolgreich gelöscht</string>
<string name="addons_game">Add-ons: %1$s</string>
<string name="save_data">Speicherdaten</string>
<string name="save_data_description">Importiert oder exportiert Speicherdaten für dieses Spiel</string>
<string name="delete_save_data">Speicherdaten löschen</string>
<string name="delete_save_data_description">Löscht alle Speicherdaten für dieses Spiel</string>
<string name="delete_save_data_warning_description">Das löscht unwiederbringlich alle Speicherdaten für dieses Spiel. Wirklich fortfahren?</string>
<string name="save_data_deleted_successfully">Speicherdaten erfolgreich gelöscht</string>
<string name="invalid_directory">Ungültiges Verzeichnis</string>
<string name="addon_installed_successfully">Add-on erfolgreich installiert</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">Das ROM ist verschlüsselt</string> <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-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> Datei installiert ist, damit Spiele entschlüsselt werden können.]]></string>
@ -277,10 +220,7 @@
<string name="emulation_control_opacity">Transparenz</string> <string name="emulation_control_opacity">Transparenz</string>
<string name="emulation_touch_overlay_reset">Overlay zurücksetzen</string> <string name="emulation_touch_overlay_reset">Overlay zurücksetzen</string>
<string name="emulation_touch_overlay_edit">Overlay bearbeiten</string> <string name="emulation_touch_overlay_edit">Overlay bearbeiten</string>
<string name="emulation_pause">Emulation pausieren</string>
<string name="emulation_unpause">Emulation fortsetzen</string>
<string name="emulation_input_overlay">Overlay-Optionen</string> <string name="emulation_input_overlay">Overlay-Optionen</string>
<string name="touchscreen">Touchscreen</string>
<string name="load_settings">Lade Einstellungen...</string> <string name="load_settings">Lade Einstellungen...</string>
@ -308,7 +248,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Byte</string> <string name="memory_byte">Byte</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">KB</string> <string name="memory_kilobyte">KB</string>
<string name="memory_megabyte">MB</string> <string name="memory_megabyte">MB</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -352,10 +291,9 @@
<string name="anti_aliasing_fxaa">FXAA</string> <string name="anti_aliasing_fxaa">FXAA</string>
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <string name="screen_layout_portrait">Portrait</string>
<string name="screen_layout_auto">Auto</string> <string name="screen_layout_auto">Auto</string>
<string name="screen_layout_landscape">Horizontal</string>
<string name="screen_layout_portrait">Vertikal</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">Standard (16:9)</string> <string name="ratio_default">Standard (16:9)</string>
<string name="ratio_force_four_three">4:3 erzwingen</string> <string name="ratio_force_four_three">4:3 erzwingen</string>
@ -380,27 +318,22 @@
<string name="building_shaders">Shader werden erstellt</string> <string name="building_shaders">Shader werden erstellt</string>
<!-- Theme options --> <!-- Theme options -->
<string name="change_app_theme">Theme</string> <string name="change_app_theme">App-Thema ändern</string>
<string name="theme_default">Standard</string> <string name="theme_default">Standard</string>
<string name="theme_material_you">Material You</string> <string name="theme_material_you">Material You</string>
<!-- Theme Modes --> <!-- Theme Modes -->
<string name="change_theme_mode">Design</string> <string name="change_theme_mode">Themen-Modus ändern</string>
<string name="theme_mode_follow_system">System folgen</string> <string name="theme_mode_follow_system">System folgen</string>
<string name="theme_mode_light">Hell</string> <string name="theme_mode_light">Hell</string>
<string name="theme_mode_dark">Dunkel</string> <string name="theme_mode_dark">Dunkel</string>
<!-- Audio output engines -->
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Schwarze Hintergründe</string> <string name="use_black_backgrounds">Schwarze Hintergründe</string>
<string name="use_black_backgrounds_description">Bei Verwendung des dunklen Designs, schwarze Hintergründe verwenden.</string> <string name="use_black_backgrounds_description">Bei Verwendung des dunklen Themes, schwarze Hintergründe verwenden.</string>
<!-- Picture-In-Picture --> <!-- Picture-In-Picture -->
<string name="picture_in_picture">Bild im Bild</string> <string name="picture_in_picture">Bild im Bild</string>

View File

@ -4,7 +4,7 @@
<string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.&lt;br /&gt;&lt;br /&gt;Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..&lt;br /&gt;&lt;br /&gt;<![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.&lt;br /&gt;&lt;br /&gt;Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string>
<string name="emulation_notification_channel_name">Emulación activa</string> <string name="emulation_notification_channel_name">Emulación activa</string>
<string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string> <string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string>
<string name="emulation_notification_running">yuzu está ejecutándose</string> <string name="emulation_notification_running">yuzu esta ejecutándose</string>
<string name="notice_notification_channel_name">Avisos y errores</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="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> <string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string>
@ -34,7 +34,6 @@
<string name="empty_gamelist">No se ha encontrado ningún archivo o aún no se ha seleccionado ningún directorio de juegos.</string> <string name="empty_gamelist">No se ha encontrado ningún archivo o aún no se ha seleccionado ningún directorio de juegos.</string>
<string name="search_and_filter_games">Busca y filtra juegos</string> <string name="search_and_filter_games">Busca y filtra juegos</string>
<string name="select_games_folder">Seleccionar carpeta de juegos</string> <string name="select_games_folder">Seleccionar carpeta de juegos</string>
<string name="manage_game_folders">Gestionar carpetas de juegos</string>
<string name="select_games_folder_description">Permite que yuzu llene la lista de juegos</string> <string name="select_games_folder_description">Permite que yuzu llene la lista de juegos</string>
<string name="add_games_warning">¿Omitir la selección de la carpeta de juegos?</string> <string name="add_games_warning">¿Omitir la selección de la carpeta de juegos?</string>
<string name="add_games_warning_description">No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos.</string> <string name="add_games_warning_description">No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos.</string>
@ -45,23 +44,23 @@
<string name="install_prod_keys">Instalar prod.keys</string> <string name="install_prod_keys">Instalar prod.keys</string>
<string name="install_prod_keys_description">Requerido para descifrar juegos</string> <string name="install_prod_keys_description">Requerido para descifrar juegos</string>
<string name="install_prod_keys_warning">¿Omitir agregar claves?</string> <string name="install_prod_keys_warning">¿Omitir agregar claves?</string>
<string name="install_prod_keys_warning_description">Se requieren claves válidas para emular juegos. Solo las aplicaciones homebrew funcionarán si continúas.</string> <string name="install_prod_keys_warning_description">Se requieren claves válidas para emular juegos. Solo las aplicaciones homebrew funcionarán si continúas.</string>
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
<string name="notifications">Notificaciones</string> <string name="notifications">Notificaciones</string>
<string name="notifications_description">Otorga el permiso de notificación con el botón de abajo.</string> <string name="notifications_description">Otorgue el permiso de notificación con el botón de abajo.</string>
<string name="give_permission">Conceder permiso</string> <string name="give_permission">Conceder permiso</string>
<string name="notification_warning">¿Omitir conceder el permiso de notificación?</string> <string name="notification_warning">¿Omitir conceder el permiso de notificación?</string>
<string name="notification_warning_description">yuzu no podrá notificarte información importante.</string> <string name="notification_warning_description">yuzu no podrá notificarte información importante.</string>
<string name="permission_denied">Permiso denegado</string> <string name="permission_denied">Permiso denegado</string>
<string name="permission_denied_description">Se ha denegado este permiso demasiadas veces y ahora debes otorgarlo de forma manual en la configuración del sistema.</string> <string name="permission_denied_description">Negó este permiso demasiadas veces y ahora debe otorgarlo manualmente en la configuración del sistema.</string>
<string name="about">Acerca de</string> <string name="about">Acerca de</string>
<string name="about_description">Versión, créditos y más</string> <string name="about_description">Versión, créditos y más</string>
<string name="warning_help">Ayuda</string> <string name="warning_help">Ayuda</string>
<string name="warning_skip">Siguiente</string> <string name="warning_skip">Siguiente</string>
<string name="warning_cancel">Cancelar</string> <string name="warning_cancel">Cancelar</string>
<string name="install_amiibo_keys">Instalar claves de Amiibo</string> <string name="install_amiibo_keys">Instalar clave de Amiiboo</string>
<string name="install_amiibo_keys_description">Necesario para usar Amiibos en el juego</string> <string name="install_amiibo_keys_description">Necesario para usar Amiibo en el juego</string>
<string name="invalid_keys_file">Archivo de claves seleccionado no válido</string> <string name="invalid_keys_file">Archivo de claves seleccionado inválido</string>
<string name="install_keys_success">Claves instaladas correctamente</string> <string name="install_keys_success">Claves instaladas correctamente</string>
<string name="reading_keys_failure">Error al leer las claves de cifrado</string> <string name="reading_keys_failure">Error al leer las claves de cifrado</string>
<string name="install_prod_keys_failure_extension_description">Compruebe que el archivo de claves tenga una extensión .keys y pruebe otra vez.</string> <string name="install_prod_keys_failure_extension_description">Compruebe que el archivo de claves tenga una extensión .keys y pruebe otra vez.</string>
@ -69,7 +68,6 @@
<string name="invalid_keys_error">Claves de cifrado no válidas</string> <string name="invalid_keys_error">Claves de cifrado no válidas</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string> <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string>
<string name="gpu_driver_manager">Explorador de drivers de GPU</string>
<string name="install_gpu_driver">Instalar driver de GPU</string> <string name="install_gpu_driver">Instalar driver de GPU</string>
<string name="install_gpu_driver_description">Instale drivers alternativos para obtener un rendimiento o una precisión potencialmente mejores</string> <string name="install_gpu_driver_description">Instale drivers alternativos para obtener un rendimiento o una precisión potencialmente mejores</string>
<string name="advanced_settings">Opciones avanzadas</string> <string name="advanced_settings">Opciones avanzadas</string>
@ -87,11 +85,7 @@
<string name="notification_no_directory_link_description">Por favor, busque la carpeta user con el panel lateral del explorador de archivos de forma manual.</string> <string name="notification_no_directory_link_description">Por favor, busque la carpeta user con el panel lateral del explorador de archivos de forma manual.</string>
<string name="manage_save_data">Administrar datos de guardado</string> <string name="manage_save_data">Administrar datos de guardado</string>
<string name="manage_save_data_description">Guardar los datos encontrados. Por favor, seleccione una opción de abajo.</string> <string name="manage_save_data_description">Guardar los datos encontrados. Por favor, seleccione una opción de abajo.</string>
<string name="import_save_warning">Importar datos de guardado</string>
<string name="import_save_warning_description">Ésto sobreescribirá todos los datos de guardado existentes con el archivo proporcionado. ¿Está seguro de querer continuar?</string>
<string name="import_export_saves_description">Importar o exportar archivos de guardado</string> <string name="import_export_saves_description">Importar o exportar archivos de guardado</string>
<string name="save_files_importing">Importando archivos de guardado...</string>
<string name="save_files_exporting">Exportando archivos de guardado...</string>
<string name="save_file_imported_success">Importado correctamente</string> <string name="save_file_imported_success">Importado correctamente</string>
<string name="save_file_invalid_zip_structure">Estructura del directorio de guardado no válido</string> <string name="save_file_invalid_zip_structure">Estructura del directorio de guardado no válido</string>
<string name="save_file_invalid_zip_structure_description">El nombre de la primera subcarpeta debe ser el Title ID del juego.</string> <string name="save_file_invalid_zip_structure_description">El nombre de la primera subcarpeta debe ser el Title ID del juego.</string>
@ -101,7 +95,7 @@
<string name="install_firmware_description">El firmware debe estar en un archivo ZIP y es necesario para ejecutar algunos juegos</string> <string name="install_firmware_description">El firmware debe estar en un archivo ZIP y es necesario para ejecutar algunos juegos</string>
<string name="firmware_installing">Instalando firmware</string> <string name="firmware_installing">Instalando firmware</string>
<string name="firmware_installed_success">Firmware instalado con éxito</string> <string name="firmware_installed_success">Firmware instalado con éxito</string>
<string name="firmware_installed_failure">Error en la instalación de firmware</string> <string name="firmware_installed_failure">Falló la instalación de firmware</string>
<string name="firmware_installed_failure_description">Asegúrese de que los archivos nca del firmware estén en la raíz del zip e inténtelo de nuevo.</string> <string name="firmware_installed_failure_description">Asegúrese de que los archivos nca del firmware estén en la raíz del zip e inténtelo de nuevo.</string>
<string name="share_log">Compartir registros de depuración</string> <string name="share_log">Compartir registros de depuración</string>
<string name="share_log_description">Comparta el archivo de registro de yuzu para depurar problemas</string> <string name="share_log_description">Comparta el archivo de registro de yuzu para depurar problemas</string>
@ -121,43 +115,9 @@
<string name="custom_driver_not_supported">Drivers personalizados no soportados</string> <string name="custom_driver_not_supported">Drivers personalizados no soportados</string>
<string name="custom_driver_not_supported_description">En estos momentos, la carga de drivers personalizados no está disponible para este dispositivo..\n¡Comprueba esta opción en el futuro para ver si ya está añadido el soporte a ese dispositivo!</string> <string name="custom_driver_not_supported_description">En estos momentos, la carga de drivers personalizados no está disponible para este dispositivo..\n¡Comprueba esta opción en el futuro para ver si ya está añadido el soporte a ese dispositivo!</string>
<string name="manage_yuzu_data">Administrar datos de yuzu</string> <string name="manage_yuzu_data">Administrar datos de yuzu</string>
<string name="manage_yuzu_data_description">Importa/exporta el firmware, las claves, los datos de usuario, ¡y más!</string> <string name="manage_yuzu_data_description">Importa/exporta el firmware, las keys, los datos de usuario, ¡y más!</string>
<string name="share_save_file">Compartir archivo de guardado</string> <string name="share_save_file">Compartir archivo de guardado</string>
<string name="export_save_failed">Error al exportar el archivo de guardado</string> <string name="export_save_failed">La exportación del guardado falló</string>
<string name="game_folders">Carpetas de juegos</string>
<string name="deep_scan">Escaneo recursivo </string>
<string name="add_game_folder">Añadir carpeta con juegos</string>
<string name="folder_already_added">¡Está carpeta ya se había añadido!</string>
<string name="game_folder_properties">Propiedades de la carpeta de juegos</string>
<plurals name="saves_import_failed">
<item quantity="one">No se ha podido importar %d archivo de guardado.</item>
<item quantity="many">No se han podido importar %d archivos de guardado.</item>
<item quantity="other">No se han podido importar %d archivos de guardado.</item>
</plurals>
<plurals name="saves_import_success">
<item quantity="one">%d archivo de guardado importado con éxito.</item>
<item quantity="many">%d archivos de guardado importados con éxito.</item>
<item quantity="other">%d archivos de guardado importados con éxito.</item>
</plurals>
<string name="no_save_data_found">No hay archivos de guardado</string>
<!-- Applet launcher strings -->
<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="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>
<string name="mii_edit_applet_description">Mira y edita Mii con el editor del sistema</string>
<string name="cabinet_applet">Cabinet</string>
<string name="cabinet_applet_description">Edita y borra los datos guardado del amiibo</string>
<string name="cabinet_launcher">Ejecutador de Cabinet</string>
<string name="cabinet_nickname_and_owner">Configuración del apodo y propietario</string>
<string name="cabinet_game_data_eraser">Borrador de datos de juego</string>
<string name="cabinet_restorer">Restaurador</string>
<string name="cabinet_formatter">Formateador</string>
<!-- About screen strings --> <!-- About screen strings -->
<string name="gaia_is_not_real">Gaia no es real</string> <string name="gaia_is_not_real">Gaia no es real</string>
@ -201,7 +161,6 @@
<string name="frame_limit_enable_description">Limita la velocidad de emulación a un porcentaje específico de la velocidad normal.</string> <string name="frame_limit_enable_description">Limita la velocidad de emulación a un porcentaje específico de la velocidad normal.</string>
<string name="frame_limit_slider">Limitar porcentaje de velocidad</string> <string name="frame_limit_slider">Limitar porcentaje de velocidad</string>
<string name="frame_limit_slider_description">Especifica el porcentaje para limitar la velocidad de emulación. 100% es la velocidad normal. Valores más altos o bajos incrementarán o disminuirán el límite de velocidad.</string> <string name="frame_limit_slider_description">Especifica el porcentaje para limitar la velocidad de emulación. 100% es la velocidad normal. Valores más altos o bajos incrementarán o disminuirán el límite de velocidad.</string>
<string name="cpu_backend">Motor de CPU</string>
<string name="cpu_accuracy">Precisión de CPU</string> <string name="cpu_accuracy">Precisión de CPU</string>
<string name="value_with_units">%1$s%2$s</string> <string name="value_with_units">%1$s%2$s</string>
@ -227,13 +186,11 @@
<string name="renderer_force_max_clock">Forzar velocidad al máximo (solo Adreno)</string> <string name="renderer_force_max_clock">Forzar velocidad al máximo (solo Adreno)</string>
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string> <string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
<string name="renderer_asynchronous_shaders">Usar shaders asíncronos</string> <string name="renderer_asynchronous_shaders">Usar shaders asíncronos</string>
<string name="renderer_asynchronous_shaders_description">Compila shaders de manera asíncrona, reduce los parones pero puede introducir fallos.</string> <string name="renderer_asynchronous_shaders_description">Compila shaders de manera asíncrona, reduciendo los parones, pero puede introducir fallos.</string>
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string> <string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string> <string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
<string name="use_disk_shader_cache">Caché de shaders en disco</string> <string name="use_disk_shader_cache">Caché de shaders en disco</string>
<string name="use_disk_shader_cache_description">Reduce los parones almacenando y cargando shaders generados.</string> <string name="use_disk_shader_cache_description">Reduce los parones almacenando y cargando shaders generados.</string>
<string name="anisotropic_filtering">Filtrado anisotrópico</string>
<string name="anisotropic_filtering_description">Mejora la calidad de las texturas al ser observadas desde ángulos oblicuos</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">CPU</string> <string name="cpu">CPU</string>
@ -260,7 +217,6 @@
<string name="shutting_down">Saliendo...</string> <string name="shutting_down">Saliendo...</string>
<string name="reset_setting_confirmation">¿Desea restablecer esta configuración a su valor predeterminado?</string> <string name="reset_setting_confirmation">¿Desea restablecer esta configuración a su valor predeterminado?</string>
<string name="reset_to_default">Restablecer a predeterminado</string> <string name="reset_to_default">Restablecer a predeterminado</string>
<string name="reset_to_default_description">Reinicia todos los ajustes avanzados</string>
<string name="reset_all_settings">¿Restablecer todas las configuraciones?</string> <string name="reset_all_settings">¿Restablecer todas las configuraciones?</string>
<string name="reset_all_settings_description">Todas las opciones avanzadas se restablecerán a su configuración predeterminada. Esta acción no se puede deshacer.</string> <string name="reset_all_settings_description">Todas las opciones avanzadas se restablecerán a su configuración predeterminada. Esta acción no se puede deshacer.</string>
<string name="settings_reset">Reiniciar la configuracion</string> <string name="settings_reset">Reiniciar la configuracion</string>
@ -274,24 +230,14 @@
<string name="export_failed">La exportación falló</string> <string name="export_failed">La exportación falló</string>
<string name="import_failed">La importación falló</string> <string name="import_failed">La importación falló</string>
<string name="cancelling">Cancelando</string> <string name="cancelling">Cancelando</string>
<string name="install">Instalar</string>
<string name="delete">Borrar</string>
<string name="edit">Editar</string>
<string name="export_success">Exportado correctamente</string>
<string name="start">Comenzar</string>
<string name="clear">Limpiar</string>
<string name="global">Global</string>
<string name="custom">Perzonalizado</string>
<string name="notice">Aviso</string>
<string name="import_complete">La importación se completó</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">Seleccionar driver GPU</string> <string name="select_gpu_driver">Seleccionar driver GPU</string>
<string name="select_gpu_driver_title">¿Quiere reemplazar el driver de GPU actual?</string> <string name="select_gpu_driver_title">¿Quiere reemplazar el driver de GPU actual?</string>
<string name="select_gpu_driver_install">Instalar</string> <string name="select_gpu_driver_install">Instalar</string>
<string name="select_gpu_driver_default">Predeterminado</string> <string name="select_gpu_driver_default">Predeterminado</string>
<string name="select_gpu_driver_use_default">Usando el driver de GPU por defecto </string> <string name="select_gpu_driver_use_default">Usando el driver de GPU por defecto </string>
<string name="select_gpu_driver_error">Driver no válido seleccionado</string> <string name="select_gpu_driver_error">¡Driver no válido, utilizando el predeterminado del sistema!</string>
<string name="driver_already_installed">Driver ya instalado</string>
<string name="system_gpu_driver">Driver GPU del sistema</string> <string name="system_gpu_driver">Driver GPU del sistema</string>
<string name="installing_driver">Instalando driver...</string> <string name="installing_driver">Instalando driver...</string>
@ -299,52 +245,11 @@
<string name="preferences_settings">Ajustes</string> <string name="preferences_settings">Ajustes</string>
<string name="preferences_general">General</string> <string name="preferences_general">General</string>
<string name="preferences_system">Sistema</string> <string name="preferences_system">Sistema</string>
<string name="preferences_system_description">Modo en Dock, región, idioma</string>
<string name="preferences_graphics">Gráficos</string> <string name="preferences_graphics">Gráficos</string>
<string name="preferences_graphics_description">Nivel de precisión, resolución, caché de shaders</string>
<string name="preferences_audio">Audio</string> <string name="preferences_audio">Audio</string>
<string name="preferences_audio_description">Motor de salida, volumen</string>
<string name="preferences_theme">Tema y color</string> <string name="preferences_theme">Tema y color</string>
<string name="preferences_debug">Depuración</string> <string name="preferences_debug">Depuración</string>
<string name="preferences_debug_description">CPU/GPU debug, API gráfica, fastMEM</string>
<!-- Game properties -->
<string name="info">Información</string>
<string name="info_description">ID de programa, desarrollador, versión</string>
<string name="per_game_settings">Configuración por juego</string>
<string name="per_game_settings_description">Editar opciones específicas para este juego</string>
<string name="launch_options">Ejecutar configuración</string>
<string name="path">Ruta</string>
<string name="program_id">ID de programa</string>
<string name="developer">Desarrollador</string>
<string name="version">Versión</string>
<string name="copy_details">Copiar detalles</string>
<string name="add_ons">Extras/Add-ons</string>
<string name="add_ons_description">Activa/desactiva mods, actualizaciones y DLC</string>
<string name="clear_shader_cache">Limpiar la caché de shaders</string>
<string name="clear_shader_cache_description">Elimina todos los shaders construidos mientras se jugaba al juego</string>
<string name="clear_shader_cache_warning_description">Experimentarás más parones mientras que la caché de shaders se regenera</string>
<string name="cleared_shaders_successfully">Shaders limpiados con éxito</string>
<string name="addons_game">Addons: %1$s</string>
<string name="save_data">Datos de guardado</string>
<string name="save_data_description">Controla los datos de guardado de este juego</string>
<string name="delete_save_data">Borrar datos de guardado</string>
<string name="delete_save_data_description">Elimina todos los datos de guardado de este juego</string>
<string name="delete_save_data_warning_description">Ésto elimina de manera permanente todos los datos de guardado de este juego. ¿Seguro que quieres continuar?</string>
<string name="save_data_deleted_successfully">Datos de guardado eliminados con éxito</string>
<string name="select_content_type">Tipo de contenido</string>
<string name="updates_and_dlc">Actualizaciones y DLC</string>
<string name="mods_and_cheats">Mods y trucos</string>
<string name="addon_notice">Aviso importante de addons</string>
<!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
<string name="addon_notice_description">Para instalar mods y trucos, debes seleccionar una carpeta que contiene los directorios cheats/, romfs/, o exefs/ . ¡No podemos confirmar si éstos serán compatibles con tu juego, así que ten cuidado!</string>
<string name="invalid_directory">Directorio no válido</string>
<!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
<string name="invalid_directory_description">Por favor, asegúrese de que el directorio que ha selecionado incluye las carpetas cheats/, romfs/, o exefs/ e inténtelo de nuevo.</string>
<string name="addon_installed_successfully">Addon instalado con éxito</string>
<string name="verifying_content">Verificando contenido...</string>
<string name="content_install_notice">Aviso importante de contenido</string>
<string name="content_install_notice_description">El contenido seleccionado no es de este juego.\n¿Instalar de todas maneras?</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">Su ROM está encriptada</string> <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_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>
@ -372,7 +277,6 @@
<string name="emulation_pause">Pausar emulación</string> <string name="emulation_pause">Pausar emulación</string>
<string name="emulation_unpause">Despausar emulación</string> <string name="emulation_unpause">Despausar emulación</string>
<string name="emulation_input_overlay">Opciones de overlay</string> <string name="emulation_input_overlay">Opciones de overlay</string>
<string name="touchscreen">Pantalla táctil</string>
<string name="load_settings">Cargando configuración...</string> <string name="load_settings">Cargando configuración...</string>
@ -404,7 +308,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Byte</string> <string name="memory_byte">Byte</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">KB</string> <string name="memory_kilobyte">KB</string>
<string name="memory_megabyte">MB</string> <string name="memory_megabyte">MB</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -449,13 +352,9 @@
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">Auto</string>
<string name="screen_layout_sensor_landscape">Sensor paisaje</string>
<string name="screen_layout_landscape">Paisaje</string> <string name="screen_layout_landscape">Paisaje</string>
<string name="screen_layout_reverse_landscape">Paisaje inverso</string>
<string name="screen_layout_sensor_portrait">Sensor retrato</string>
<string name="screen_layout_portrait">Retrato</string> <string name="screen_layout_portrait">Retrato</string>
<string name="screen_layout_reverse_portrait">Retrato inverso</string> <string name="screen_layout_auto">Auto</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">Predeterminado (16:9)</string> <string name="ratio_default">Predeterminado (16:9)</string>
@ -464,10 +363,6 @@
<string name="ratio_force_sixteen_ten">Forzar 16:10</string> <string name="ratio_force_sixteen_ten">Forzar 16:10</string>
<string name="ratio_stretch">Ajustar a la ventana</string> <string name="ratio_stretch">Ajustar a la ventana</string>
<!-- CPU Backend -->
<string name="cpu_backend_dynarmic">DynARMic (lento)</string>
<string name="cpu_backend_nce">Ejecución nativa de código (NCE)</string>
<!-- CPU Accuracy --> <!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">Preciso</string> <string name="cpu_accuracy_accurate">Preciso</string>
<string name="cpu_accuracy_unsafe">Impreciso</string> <string name="cpu_accuracy_unsafe">Impreciso</string>
@ -496,15 +391,8 @@
<string name="theme_mode_dark">Oscuro</string> <string name="theme_mode_dark">Oscuro</string>
<!-- Audio output engines --> <!-- Audio output engines -->
<string name="oboe">oboe</string>
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">x2</string>
<string name="multiplier_four">x4</string>
<string name="multiplier_eight">x8</string>
<string name="multiplier_sixteen">x16</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Fondos oscuros</string> <string name="use_black_backgrounds">Fondos oscuros</string>
<string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string> <string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string>

View File

@ -34,7 +34,6 @@
<string name="empty_gamelist">Aucun fichier n\'a été trouvé ou aucun répertoire de jeu n\'a encore été sélectionné.</string> <string name="empty_gamelist">Aucun fichier n\'a été trouvé ou aucun répertoire de jeu n\'a encore été sélectionné.</string>
<string name="search_and_filter_games">Rechercher et filtrer les jeux</string> <string name="search_and_filter_games">Rechercher et filtrer les jeux</string>
<string name="select_games_folder">Sélectionner le dossier des jeux</string> <string name="select_games_folder">Sélectionner le dossier des jeux</string>
<string name="manage_game_folders">Gérer les dossiers de jeux</string>
<string name="select_games_folder_description">Permet à yuzu de remplir la liste des jeux</string> <string name="select_games_folder_description">Permet à yuzu de remplir la liste des jeux</string>
<string name="add_games_warning">Ne pas sélectionner le dossier des jeux ?</string> <string name="add_games_warning">Ne pas sélectionner le dossier des jeux ?</string>
<string name="add_games_warning_description">Les jeux ne seront pas affichés dans la liste des jeux si aucun dossier n\'est sélectionné.</string> <string name="add_games_warning_description">Les jeux ne seront pas affichés dans la liste des jeux si aucun dossier n\'est sélectionné.</string>
@ -48,7 +47,7 @@
<string name="install_prod_keys_warning_description">Des clés valides sont nécessaires pour émuler des jeux commerciaux. Seules les applications homebrew fonctionneront si vous continuez.</string> <string name="install_prod_keys_warning_description">Des clés valides sont nécessaires pour émuler des jeux commerciaux. Seules les applications homebrew fonctionneront si vous continuez.</string>
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
<string name="notifications">Notifications</string> <string name="notifications">Notifications</string>
<string name="notifications_description">Accorder la permission de notification avec le bouton ci-dessous.</string> <string name="notifications_description">Accordez l\'autorisation de notification avec le bouton ci-dessous.</string>
<string name="give_permission">Accorder la permission</string> <string name="give_permission">Accorder la permission</string>
<string name="notification_warning">Ne pas accorder la permission de notification ?</string> <string name="notification_warning">Ne pas accorder la permission de notification ?</string>
<string name="notification_warning_description">yuzu ne pourra pas vous communiquer d\'informations importantes.</string> <string name="notification_warning_description">yuzu ne pourra pas vous communiquer d\'informations importantes.</string>
@ -69,7 +68,6 @@
<string name="invalid_keys_error">Clés de chiffrement invalides</string> <string name="invalid_keys_error">Clés de chiffrement invalides</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string> <string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string>
<string name="gpu_driver_manager">Gestionnaire de pilotes du GPU</string>
<string name="install_gpu_driver">Installer le pilote du GPU</string> <string name="install_gpu_driver">Installer le pilote du GPU</string>
<string name="install_gpu_driver_description">Installer des pilotes alternatifs pour des performances ou une précision potentiellement meilleures</string> <string name="install_gpu_driver_description">Installer des pilotes alternatifs pour des performances ou une précision potentiellement meilleures</string>
<string name="advanced_settings">Paramètres avancés</string> <string name="advanced_settings">Paramètres avancés</string>
@ -87,11 +85,7 @@
<string name="notification_no_directory_link_description">Veuillez localiser manuellement le dossier utilisateur avec le panneau latéral du gestionnaire de fichiers.</string> <string name="notification_no_directory_link_description">Veuillez localiser manuellement le dossier utilisateur avec le panneau latéral du gestionnaire de fichiers.</string>
<string name="manage_save_data">Gérer les données de sauvegarde</string> <string name="manage_save_data">Gérer les données de sauvegarde</string>
<string name="manage_save_data_description">Données de sauvegarde trouvées. Veuillez sélectionner une option ci-dessous.</string> <string name="manage_save_data_description">Données de sauvegarde trouvées. Veuillez sélectionner une option ci-dessous.</string>
<string name="import_save_warning">Importer les données de sauvegarde</string>
<string name="import_save_warning_description">Cela écrasera toutes les données de sauvegarde existantes avec le fichier fourni. Êtes-vous sûr de vouloir continuer ?</string>
<string name="import_export_saves_description">Importer ou exporter des fichiers de sauvegarde</string> <string name="import_export_saves_description">Importer ou exporter des fichiers de sauvegarde</string>
<string name="save_files_importing">Importation des fichiers de sauvegarde...</string>
<string name="save_files_exporting">Exportation des fichiers de sauvegarde...</string>
<string name="save_file_imported_success">Importé avec succès</string> <string name="save_file_imported_success">Importé avec succès</string>
<string name="save_file_invalid_zip_structure">Structure de répertoire de sauvegarde non valide</string> <string name="save_file_invalid_zip_structure">Structure de répertoire de sauvegarde non valide</string>
<string name="save_file_invalid_zip_structure_description">Le nom du premier sous-dossier doit être l\'identifiant du titre du jeu.</string> <string name="save_file_invalid_zip_structure_description">Le nom du premier sous-dossier doit être l\'identifiant du titre du jeu.</string>
@ -124,40 +118,6 @@
<string name="manage_yuzu_data_description">Importer/exporter le firmware, les clés, les données utilisateur, et bien plus encore !</string> <string name="manage_yuzu_data_description">Importer/exporter le firmware, les clés, les données utilisateur, et bien plus encore !</string>
<string name="share_save_file">Partager le fichier de sauvegarde</string> <string name="share_save_file">Partager le fichier de sauvegarde</string>
<string name="export_save_failed">Échec de l\'exportation de la sauvegarde</string> <string name="export_save_failed">Échec de l\'exportation de la sauvegarde</string>
<string name="game_folders">Dossiers de jeux</string>
<string name="deep_scan">Analyse approfondie</string>
<string name="add_game_folder">Ajouter un dossier de jeu</string>
<string name="folder_already_added">Ce dossier a déjà été ajouté !</string>
<string name="game_folder_properties">Propriétés du dossier du jeu</string>
<plurals name="saves_import_failed">
<item quantity="one">Échec de l\'importation de %d sauvegarde</item>
<item quantity="many">Échec de l\'importation de %d sauvegardes </item>
<item quantity="other">Échec de l\'importation de %d sauvegardes</item>
</plurals>
<plurals name="saves_import_success">
<item quantity="one">%d sauvegarde importée avec succès</item>
<item quantity="many">%d sauvegardes importées avec succès</item>
<item quantity="other">%d sauvegardes importées avec succès</item>
</plurals>
<string name="no_save_data_found">Aucune donnée de sauvegarde trouvée</string>
<!-- Applet launcher strings -->
<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="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>
<string name="mii_edit_applet_description">Visualiser et modifier les Miis avec l\'éditeur système.</string>
<string name="cabinet_applet">Cabinet</string>
<string name="cabinet_applet_description">Modifier et supprimer des données stockées sur un amiibo</string>
<string name="cabinet_launcher">Cabinet</string>
<string name="cabinet_nickname_and_owner">Paramètres du surnom et du propriétaire</string>
<string name="cabinet_game_data_eraser">Effaceur de données de jeu</string>
<string name="cabinet_restorer">Restaurateur</string>
<string name="cabinet_formatter">Formateur</string>
<!-- About screen strings --> <!-- About screen strings -->
<string name="gaia_is_not_real">Gaia n\'est pas réel</string> <string name="gaia_is_not_real">Gaia n\'est pas réel</string>
@ -197,11 +157,10 @@
<string name="are_you_interested">Es tu intéressé ?</string> <string name="are_you_interested">Es tu intéressé ?</string>
<!-- General settings strings --> <!-- General settings strings -->
<string name="frame_limit_enable">Limiter la vitesse</string> <string name="frame_limit_enable">Limitation de vitesse</string>
<string name="frame_limit_enable_description">Limiter la vitesse d\'émulation à un pourcentage spécifié de la vitesse normale</string> <string name="frame_limit_enable_description">Limiter la vitesse d\'émulation à un pourcentage spécifié de la vitesse normale</string>
<string name="frame_limit_slider">Limiter le pourcentage de vitesse</string> <string name="frame_limit_slider">Limite en pourcentage de vitesse</string>
<string name="frame_limit_slider_description">Spécifier le pourcentage pour limiter la vitesse d\'émulation. 100% correspond à la vitesse normale. Des valeurs plus élevées ou plus basses augmenteront ou diminueront la limite de vitesse.</string> <string name="frame_limit_slider_description">Spécifier le pourcentage pour limiter la vitesse d\'émulation. 100% correspond à la vitesse normale. Des valeurs plus élevées ou plus basses augmenteront ou diminueront la limite de vitesse.</string>
<string name="cpu_backend">Backend du CPU</string>
<string name="cpu_accuracy">Précision du CPU</string> <string name="cpu_accuracy">Précision du CPU</string>
<string name="value_with_units">%1$s%2$s</string> <string name="value_with_units">%1$s%2$s</string>
@ -232,8 +191,6 @@
<string name="renderer_reactive_flushing_description">Améliore la précision du rendu dans certains jeux au détriment des performances.</string> <string name="renderer_reactive_flushing_description">Améliore la précision du rendu dans certains jeux au détriment des performances.</string>
<string name="use_disk_shader_cache">Utiliser les shader cache</string> <string name="use_disk_shader_cache">Utiliser les shader cache</string>
<string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant localement les shaders générés</string> <string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant localement les shaders générés</string>
<string name="anisotropic_filtering">Filtrage anisotropique</string>
<string name="anisotropic_filtering_description">Améliore la qualité des textures lorsqu\'elles sont visualisées sous des angles obliques</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">CPU</string> <string name="cpu">CPU</string>
@ -260,8 +217,7 @@
<string name="shutting_down">Extinction en cours...</string> <string name="shutting_down">Extinction en cours...</string>
<string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string> <string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string>
<string name="reset_to_default">Réinitialiser par défaut</string> <string name="reset_to_default">Réinitialiser par défaut</string>
<string name="reset_to_default_description">Réinitialiser tous les paramètres avancés</string> <string name="reset_all_settings">Réinitialiser tous les réglages ?</string>
<string name="reset_all_settings">Réinitialiser tous les paramètres ?</string>
<string name="reset_all_settings_description">Tous les paramètres avancés seront réinitialisés à leur configuration par défaut. Ça ne peut pas être annulé.</string> <string name="reset_all_settings_description">Tous les paramètres avancés seront réinitialisés à leur configuration par défaut. Ça ne peut pas être annulé.</string>
<string name="settings_reset">Paramètres réinitialisés</string> <string name="settings_reset">Paramètres réinitialisés</string>
<string name="close">Fermer</string> <string name="close">Fermer</string>
@ -274,24 +230,14 @@
<string name="export_failed">L\'exportation a échoué</string> <string name="export_failed">L\'exportation a échoué</string>
<string name="import_failed">L\'importation a échoué</string> <string name="import_failed">L\'importation a échoué</string>
<string name="cancelling">Annulation</string> <string name="cancelling">Annulation</string>
<string name="install">Installer</string>
<string name="delete">Supprimer</string>
<string name="edit">Éditer</string>
<string name="export_success">Exportation réussie</string>
<string name="start">Start</string>
<string name="clear">Effacer</string>
<string name="global">Global</string>
<string name="custom">Personnalisé</string>
<string name="notice">Avis</string>
<string name="import_complete">Importation terminée</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">Sélectionner le pilote du GPU</string> <string name="select_gpu_driver">Sélectionner le pilote du GPU</string>
<string name="select_gpu_driver_title">Souhaitez vous remplacer votre pilote actuel ?</string> <string name="select_gpu_driver_title">Souhaitez vous remplacer votre pilote actuel ?</string>
<string name="select_gpu_driver_install">Installer</string> <string name="select_gpu_driver_install">Installer</string>
<string name="select_gpu_driver_default">Par défaut</string> <string name="select_gpu_driver_default">Par défaut</string>
<string name="select_gpu_driver_use_default">Utilisation du pilote du GPU par défaut</string> <string name="select_gpu_driver_use_default">Utilisation du pilote du GPU par défaut</string>
<string name="select_gpu_driver_error">Pilote non valide sélectionné</string> <string name="select_gpu_driver_error">Pilote non valide sélectionné, utilisation du paramètre par défaut du système !</string>
<string name="driver_already_installed">Pilote déjà installé</string>
<string name="system_gpu_driver">Pilote du GPU du système</string> <string name="system_gpu_driver">Pilote du GPU du système</string>
<string name="installing_driver">Installation du pilote...</string> <string name="installing_driver">Installation du pilote...</string>
@ -299,52 +245,11 @@
<string name="preferences_settings">Paramètres</string> <string name="preferences_settings">Paramètres</string>
<string name="preferences_general">Général</string> <string name="preferences_general">Général</string>
<string name="preferences_system">Système</string> <string name="preferences_system">Système</string>
<string name="preferences_system_description">Mode TV, région, langue</string>
<string name="preferences_graphics">Vidéo</string> <string name="preferences_graphics">Vidéo</string>
<string name="preferences_graphics_description">Niveau de précision, résolution, cache de shaders</string>
<string name="preferences_audio">Audio</string> <string name="preferences_audio">Audio</string>
<string name="preferences_audio_description">Moteur de sortie, volume</string>
<string name="preferences_theme">Thème et couleur</string> <string name="preferences_theme">Thème et couleur</string>
<string name="preferences_debug">Débogage</string> <string name="preferences_debug">Débogage</string>
<string name="preferences_debug_description">Débogage CPU/GPU, API graphique, fastmem</string>
<!-- Game properties -->
<string name="info">Info</string>
<string name="info_description">ID du programme, développeur, version</string>
<string name="per_game_settings">Paramètres spécifiques au jeu</string>
<string name="per_game_settings_description">Modifier les paramètres spécifiques à ce jeu</string>
<string name="launch_options">Lancer la configuration</string>
<string name="path">Chemin</string>
<string name="program_id">ID du programme</string>
<string name="developer">Développeur</string>
<string name="version">Version</string>
<string name="copy_details">Copier les détails</string>
<string name="add_ons">Extensions</string>
<string name="add_ons_description">Activer les mods, mises à jour et DLC</string>
<string name="clear_shader_cache">Effacer le cache des shaders</string>
<string name="clear_shader_cache_description">Supprime tous les shaders générés en jouant à ce jeu</string>
<string name="clear_shader_cache_warning_description">Vous risquez de rencontrer davantage de saccades pendant que le cache des shaders se régénère.</string>
<string name="cleared_shaders_successfully">Shaders effacés avec succès</string>
<string name="addons_game">Addons : %1$s</string>
<string name="save_data">Données de sauvegarde</string>
<string name="save_data_description">Gérer les données de sauvegarde spécifiques à ce jeu</string>
<string name="delete_save_data">Supprimer les données de sauvegarde</string>
<string name="delete_save_data_description">Supprime toutes les données de sauvegarde spécifiques à ce jeu</string>
<string name="delete_save_data_warning_description">Cela supprime de manière irréversible toutes les données de sauvegarde de ce jeu. Êtes-vous sûr de vouloir continuer ?</string>
<string name="save_data_deleted_successfully">Données de sauvegarde supprimées avec succès</string>
<string name="select_content_type">Type de contenu</string>
<string name="updates_and_dlc">Mises à jour et DLC</string>
<string name="mods_and_cheats">Mods et cheats</string>
<string name="addon_notice">Notification importante concernant l\'addon</string>
<!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
<string name="addon_notice_description">Pour installer des mods et des cheats, vous devez sélectionner un dossier contenant un répertoire cheats/, romfs/ ou exefs/. Nous ne pouvons pas garantir leur compatibilité avec votre jeu, alors soyez prudent !</string>
<string name="invalid_directory">Répertoire non valide</string>
<!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
<string name="invalid_directory_description">Veuillez vous assurer que le répertoire que vous avez sélectionné contient un dossier cheats/, romfs/ ou exefs/, puis réessayez.</string>
<string name="addon_installed_successfully">Addon installé avec succès</string>
<string name="verifying_content">Vérification du contenu...</string>
<string name="content_install_notice">Avis d\'installation du contenu</string>
<string name="content_install_notice_description">Le contenu que vous avez sélectionné ne correspond pas à ce jeu.\nInstaller quand même ?</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">Votre ROM est cryptée</string> <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_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>
@ -372,7 +277,6 @@
<string name="emulation_pause">Mettre en pause l\'émulation</string> <string name="emulation_pause">Mettre en pause l\'émulation</string>
<string name="emulation_unpause">Reprendre l\'émulation</string> <string name="emulation_unpause">Reprendre l\'émulation</string>
<string name="emulation_input_overlay">Options de l\'overlay</string> <string name="emulation_input_overlay">Options de l\'overlay</string>
<string name="touchscreen">Écran tactile</string>
<string name="load_settings">Chargement des paramètres…</string> <string name="load_settings">Chargement des paramètres…</string>
@ -404,7 +308,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Octet</string> <string name="memory_byte">Octet</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">Ko</string> <string name="memory_kilobyte">Ko</string>
<string name="memory_megabyte">Mo</string> <string name="memory_megabyte">Mo</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -449,13 +352,9 @@
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">Auto</string>
<string name="screen_layout_sensor_landscape">Paysage</string>
<string name="screen_layout_landscape">Paysage</string> <string name="screen_layout_landscape">Paysage</string>
<string name="screen_layout_reverse_landscape">Paysage inversé</string>
<string name="screen_layout_sensor_portrait">Portrait</string>
<string name="screen_layout_portrait">Portrait</string> <string name="screen_layout_portrait">Portrait</string>
<string name="screen_layout_reverse_portrait">Portrait inversé</string> <string name="screen_layout_auto">Auto</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">Par défaut (16:9)</string> <string name="ratio_default">Par défaut (16:9)</string>
@ -464,10 +363,6 @@
<string name="ratio_force_sixteen_ten">Forcer le 16:10</string> <string name="ratio_force_sixteen_ten">Forcer le 16:10</string>
<string name="ratio_stretch">Étirer à la fenêtre</string> <string name="ratio_stretch">Étirer à la fenêtre</string>
<!-- CPU Backend -->
<string name="cpu_backend_dynarmic">Dynarmic (Lent)</string>
<string name="cpu_backend_nce">Exécution de code natif (NCE)</string>
<!-- CPU Accuracy --> <!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">Précis</string> <string name="cpu_accuracy_accurate">Précis</string>
<string name="cpu_accuracy_unsafe">Risqué</string> <string name="cpu_accuracy_unsafe">Risqué</string>
@ -496,15 +391,8 @@
<string name="theme_mode_dark">Sombre</string> <string name="theme_mode_dark">Sombre</string>
<!-- Audio output engines --> <!-- Audio output engines -->
<string name="oboe">oboe</string>
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Arrière-plan noir</string> <string name="use_black_backgrounds">Arrière-plan noir</string>
<string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir.</string> <string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir.</string>

View File

@ -34,7 +34,6 @@
<string name="empty_gamelist">לא נמצאו קבצים או לנבחרה ספריית קבצים בינתיים.</string> <string name="empty_gamelist">לא נמצאו קבצים או לנבחרה ספריית קבצים בינתיים.</string>
<string name="search_and_filter_games">חפש וסנן משחקים</string> <string name="search_and_filter_games">חפש וסנן משחקים</string>
<string name="select_games_folder">בחר תיקיית משחקים</string> <string name="select_games_folder">בחר תיקיית משחקים</string>
<string name="manage_game_folders">נהל את תיקיית המשחקים</string>
<string name="select_games_folder_description">אפשר ל yuzu לאכלס את רשימת המשחקים</string> <string name="select_games_folder_description">אפשר ל yuzu לאכלס את רשימת המשחקים</string>
<string name="add_games_warning">לדלג על בחירת תיקיית המשחקים?</string> <string name="add_games_warning">לדלג על בחירת תיקיית המשחקים?</string>
<string name="add_games_warning_description">משחקים לא יוצגו ברשימת המשחקים אם לנבחרה תיקיית משחקים.</string> <string name="add_games_warning_description">משחקים לא יוצגו ברשימת המשחקים אם לנבחרה תיקיית משחקים.</string>
@ -69,7 +68,6 @@
<string name="invalid_keys_error">מפתחות הצפנה לא חוקיים</string> <string name="invalid_keys_error">מפתחות הצפנה לא חוקיים</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">קבוץ שנבחר מושחת או לא נכון. בבקשה הוצא מחדש את המפתחות שלך.</string> <string name="install_keys_failure_description">קבוץ שנבחר מושחת או לא נכון. בבקשה הוצא מחדש את המפתחות שלך.</string>
<string name="gpu_driver_manager">מנהל הדרייברים של המעבד הגרפי</string>
<string name="install_gpu_driver">התקן דרייבר למעבד הגרפי</string> <string name="install_gpu_driver">התקן דרייבר למעבד הגרפי</string>
<string name="install_gpu_driver_description">התקן דרייברים אחרים בשביל סיכוי לביצועים או דיוק גבוההים יותר</string> <string name="install_gpu_driver_description">התקן דרייברים אחרים בשביל סיכוי לביצועים או דיוק גבוההים יותר</string>
<string name="advanced_settings">הגדרות מתקדמות</string> <string name="advanced_settings">הגדרות מתקדמות</string>
@ -88,7 +86,6 @@
<string name="manage_save_data">נהל מידע שמור</string> <string name="manage_save_data">נהל מידע שמור</string>
<string name="manage_save_data_description">מידע שמור לא נמצא. בבקשה בחר/י אופציה מלמטה</string> <string name="manage_save_data_description">מידע שמור לא נמצא. בבקשה בחר/י אופציה מלמטה</string>
<string name="import_export_saves_description">יבא או יצא קבצי שמירה</string> <string name="import_export_saves_description">יבא או יצא קבצי שמירה</string>
<string name="save_files_exporting">מייצא קבצי שמירה...</string>
<string name="save_file_imported_success">יובא בהצלחה</string> <string name="save_file_imported_success">יובא בהצלחה</string>
<string name="save_file_invalid_zip_structure">מבנה ספריית השמירות לא חוקי</string> <string name="save_file_invalid_zip_structure">מבנה ספריית השמירות לא חוקי</string>
<string name="save_file_invalid_zip_structure_description">התת תיקייה הראשונה חייב להיות ה title ID של המשחק</string> <string name="save_file_invalid_zip_structure_description">התת תיקייה הראשונה חייב להיות ה title ID של המשחק</string>
@ -121,28 +118,6 @@
<string name="manage_yuzu_data_description">יבא/יצא firmware, keys, מידע של משתמש ועוד!</string> <string name="manage_yuzu_data_description">יבא/יצא firmware, keys, מידע של משתמש ועוד!</string>
<string name="share_save_file">שתף קובץ שמירה</string> <string name="share_save_file">שתף קובץ שמירה</string>
<string name="export_save_failed">נכשל בייצוא שמירה</string> <string name="export_save_failed">נכשל בייצוא שמירה</string>
<string name="game_folders">תיקיית משחקים</string>
<string name="deep_scan">סריקה עמוקה</string>
<string name="add_game_folder">הוסף תיקיית משחקים</string>
<string name="folder_already_added">התיקייה הזו נוספה כבר!</string>
<string name="game_folder_properties">מאפייני תיקיית משחקים</string>
<!-- Applet launcher strings -->
<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="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 --> <!-- About screen strings -->
<string name="gaia_is_not_real">Gaia לא אמיתית</string> <string name="gaia_is_not_real">Gaia לא אמיתית</string>
@ -186,7 +161,6 @@
<string name="frame_limit_enable_description">מגביל את מהירות האמולציה לאחוז מהירות המבוקש מהמהירות הרגילה.</string> <string name="frame_limit_enable_description">מגביל את מהירות האמולציה לאחוז מהירות המבוקש מהמהירות הרגילה.</string>
<string name="frame_limit_slider">הגבל את אחוז המהירות</string> <string name="frame_limit_slider">הגבל את אחוז המהירות</string>
<string name="frame_limit_slider_description">מדייק את אחוז מהירות האמולציה. 100% זה מהירות רגילה. ערכים גדולים או קטנים יאיצו או יאטו את מהירות האמולציה.</string> <string name="frame_limit_slider_description">מדייק את אחוז מהירות האמולציה. 100% זה מהירות רגילה. ערכים גדולים או קטנים יאיצו או יאטו את מהירות האמולציה.</string>
<string name="cpu_backend">קצה האחורי של המעבד</string>
<string name="cpu_accuracy">דיוק המעבד</string> <string name="cpu_accuracy">דיוק המעבד</string>
<string name="value_with_units">%1$s%2$s</string> <string name="value_with_units">%1$s%2$s</string>
@ -211,38 +185,23 @@
<string name="renderer_anti_aliasing">שיטת Anti-aliasing</string> <string name="renderer_anti_aliasing">שיטת Anti-aliasing</string>
<string name="renderer_force_max_clock">החזק מהירות שעון מקסימלית (רק ל Adreno)</string> <string name="renderer_force_max_clock">החזק מהירות שעון מקסימלית (רק ל Adreno)</string>
<string name="renderer_force_max_clock_description">מכריח לדחוף את מהירויות המעבד הגרפי למקסימום (הגבלות חום ימשיכו לתפקד).</string> <string name="renderer_force_max_clock_description">מכריח לדחוף את מהירויות המעבד הגרפי למקסימום (הגבלות חום ימשיכו לתפקד).</string>
<string name="renderer_asynchronous_shaders">השתמש בשיידרים אסינכרונים</string>
<string name="renderer_asynchronous_shaders_description">מקמפל שיידרים בצורה אסנכרונית, מפחית תקיעות אך עלול לגרום לבעיות גרפיות.</string>
<string name="renderer_reactive_flushing">השתמש בהבהוב תגובתי</string>
<string name="renderer_reactive_flushing_description">משפר את הדיוק של האמולציה במשחקים מסויימים במחיר של ביצועים.</string> <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 --> <!-- Debug settings strings -->
<string name="cpu">מעבד</string> <string name="cpu">מעבד</string>
<string name="cpu_debug_mode">דיבאגינג למעבד</string>
<string name="cpu_debug_mode_description">מכניס את המעבד למצב דיבאג איטי</string> <string name="cpu_debug_mode_description">מכניס את המעבד למצב דיבאג איטי</string>
<string name="gpu">מעבד גרפי</string> <string name="gpu">מעבד גרפי</string>
<string name="renderer_api">ממשק תוכנה</string>
<string name="renderer_debug">דיבאגינג בגרפיקה</string>
<string name="renderer_debug_description">קובע את ממשק התוכנה של הגרפיקות למצב דיבאגינג איטי.</string>
<string name="fastmem">Fastmem</string>
<!-- Audio settings strings --> <!-- Audio settings strings -->
<string name="audio_output_engine">מנוע פלט</string> <string name="audio_output_engine">מנוע פלט</string>
<string name="audio_volume">עוצמת שמע</string> <string name="audio_volume">עוצמת שמע</string>
<string name="audio_volume_description">מציין את עוצמת האודיו שיוצא.</string>
<!-- Miscellaneous --> <!-- Miscellaneous -->
<string name="slider_default">ברירת מחדל</string> <string name="slider_default">ברירת מחדל</string>
<string name="ini_saved">הגדרות שמורות</string> <string name="ini_saved">הגדרות שמורות</string>
<string name="gameid_saved">הגדרות שמורות עבור %1$s</string> <string name="gameid_saved">הגדרות שמורות עבור %1$s</string>
<string name="error_saving">תקלה בשמירת %1$s.ini: %2$s</string> <string name="error_saving">תקלה בשמירת %1$s.ini: %2$s</string>
<string name="unimplemented_menu">תפריט שלא יושם</string>
<string name="loading">טוען...</string> <string name="loading">טוען...</string>
<string name="shutting_down">כיבוי...</string> <string name="shutting_down">כיבוי...</string>
<string name="reset_setting_confirmation">אתה מעוניין לאפס את ההגדרה הזו חזרה לברירת המחדל?</string> <string name="reset_setting_confirmation">אתה מעוניין לאפס את ההגדרה הזו חזרה לברירת המחדל?</string>
<string name="reset_to_default">אפס לברירת המחדל</string> <string name="reset_to_default">אפס לברירת המחדל</string>
<string name="reset_to_default_description">מאפס את כל ההגדרות המתקדמות.</string>
<string name="reset_all_settings">לאפס את כל ההגדרות?</string> <string name="reset_all_settings">לאפס את כל ההגדרות?</string>
<string name="reset_all_settings_description">כל ההגדרות המתקדמות יאופסו לברירת המחדל. לא ניתן לבטל פעולה זו.</string> <string name="reset_all_settings_description">כל ההגדרות המתקדמות יאופסו לברירת המחדל. לא ניתן לבטל פעולה זו.</string>
<string name="settings_reset">אפס הגדרות</string> <string name="settings_reset">אפס הגדרות</string>
@ -250,26 +209,19 @@
<string name="learn_more">למד עוד</string> <string name="learn_more">למד עוד</string>
<string name="auto">אוטומטי</string> <string name="auto">אוטומטי</string>
<string name="submit">שלח</string> <string name="submit">שלח</string>
<string name="string_null">ריק</string>
<string name="string_import">ייבוא</string> <string name="string_import">ייבוא</string>
<string name="export">ייצוא</string> <string name="export">ייצוא</string>
<string name="export_failed">ייצוא נכשל</string> <string name="export_failed">ייצוא נכשל</string>
<string name="import_failed">ייבוא נכשל</string> <string name="import_failed">ייבוא נכשל</string>
<string name="cancelling">מבטל</string> <string name="cancelling">מבטל</string>
<string name="install">התקן</string>
<string name="delete">מחק</string>
<string name="edit">ערוך</string>
<string name="export_success">יוצא בהצלחה</string>
<string name="start">התחלה</string>
<string name="clear">נקה</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">בחר דרייבר למעבד הגרפי</string> <string name="select_gpu_driver">בחר דרייבר למעבד הגרפי</string>
<string name="select_gpu_driver_title">אתה מעוניין להחליף את הדרייבר של המעבד הגרפי שלך?</string> <string name="select_gpu_driver_title">אתה מעוניין להחליף את הדרייבר של המעבד הגרפי שלך?</string>
<string name="select_gpu_driver_install">התקן</string> <string name="select_gpu_driver_install">התקן</string>
<string name="select_gpu_driver_default">ברירת מחדל</string> <string name="select_gpu_driver_default">ברירת מחדל</string>
<string name="select_gpu_driver_use_default">משתמש בדרייבר ברירת המחדל של המעבד הגרפי</string> <string name="select_gpu_driver_use_default">משתמש בדרייבר ברירת המחדל של המעבד הגרפי</string>
<string name="select_gpu_driver_error">נבחר דרייבר לא חוקי</string> <string name="select_gpu_driver_error">דרייבר לא חוקי נבחר, משתמש בברירת המחדל של המערכת!</string>
<string name="driver_already_installed">הדרייבר כבר מותקן</string>
<string name="system_gpu_driver">דרייבר של המעבד הגרפי של המערכת</string> <string name="system_gpu_driver">דרייבר של המעבד הגרפי של המערכת</string>
<string name="installing_driver">מתקין דרייבר...</string> <string name="installing_driver">מתקין דרייבר...</string>
@ -277,27 +229,11 @@
<string name="preferences_settings">הגדרות</string> <string name="preferences_settings">הגדרות</string>
<string name="preferences_general">כללי</string> <string name="preferences_general">כללי</string>
<string name="preferences_system">מערכת</string> <string name="preferences_system">מערכת</string>
<string name="preferences_system_description">מצב מעוגן, איזור, שפה</string>
<string name="preferences_graphics">גרפיקה</string> <string name="preferences_graphics">גרפיקה</string>
<string name="preferences_graphics_description">רמת דיוק, רזולוציה, מטמון שיידרים</string>
<string name="preferences_audio">שמע</string> <string name="preferences_audio">שמע</string>
<string name="preferences_audio_description">מנוע פלט, עוצמת שמע</string>
<string name="preferences_theme">צבע ונושא</string> <string name="preferences_theme">צבע ונושא</string>
<string name="preferences_debug">דיבאג</string>
<string name="preferences_debug_description">דיבאגינג עבור מעבד/מעבד גרפי, ממשק תוכנה עבור הגרפיקות, fastmem</string>
<!-- Game properties -->
<string name="info">מידע</string>
<string name="path">דרך</string>
<string name="developer">מפתח</string>
<string name="version">גרסה</string>
<string name="add_ons">תוספים</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">המשחק שלך מוצפן</string> <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_video_core">התרחשה בעיה באתחול של ליבת הווידאו</string>
<string name="loader_error_video_core_description">זה בדרך כלל נגרם על ידי דרייבר לא מתאים עבור המעבד הגרפי. התקנת דרייבר אשר מתאים למעבד הגרפי יכול לפתור את הבעיה הזו.</string>
<string name="loader_error_invalid_format">אין אפשרות לטעון את המשחק</string> <string name="loader_error_invalid_format">אין אפשרות לטעון את המשחק</string>
<string name="loader_error_file_not_found">קובץ המשחק לא קיים</string> <string name="loader_error_file_not_found">קובץ המשחק לא קיים</string>
@ -305,22 +241,10 @@
<string name="emulation_exit">צא מהאמולציה</string> <string name="emulation_exit">צא מהאמולציה</string>
<string name="emulation_done">סיום</string> <string name="emulation_done">סיום</string>
<string name="emulation_fps_counter">סופר FPS</string> <string name="emulation_fps_counter">סופר FPS</string>
<string name="emulation_toggle_controls">החלפת בקרים</string>
<string name="emulation_rel_stick_center">מרכז ג׳ויסטיק יחסי</string>
<string name="emulation_dpad_slide">החלקת D-pad</string>
<string name="emulation_haptics">רטט מגע</string>
<string name="emulation_show_overlay">הצג את שכבת-העל</string>
<string name="emulation_toggle_all">החלף הכל</string>
<string name="emulation_control_adjust">התאם את שכבת-העל</string>
<string name="emulation_control_scale">קנה מידה</string> <string name="emulation_control_scale">קנה מידה</string>
<string name="emulation_control_opacity">שקיפות</string> <string name="emulation_control_opacity">שקיפות</string>
<string name="emulation_touch_overlay_reset">אפס את שכבת-העל</string>
<string name="emulation_touch_overlay_edit">ערוך שכבת-על</string>
<string name="emulation_pause">עצור אמולציה</string> <string name="emulation_pause">עצור אמולציה</string>
<string name="emulation_unpause">המשך אמולציה</string> <string name="emulation_unpause">המשך אמולציה</string>
<string name="emulation_input_overlay">אופציות עבור שכבת-על</string>
<string name="touchscreen">מסך מגע</string>
<string name="load_settings">טוען הגדרות...</string> <string name="load_settings">טוען הגדרות...</string>
<!-- Software keyboard --> <!-- Software keyboard -->
@ -334,8 +258,6 @@
<string name="system_archive_general">ארכיון מערכת</string> <string name="system_archive_general">ארכיון מערכת</string>
<string name="save_load_error">בעיית שמירה/טעינה</string> <string name="save_load_error">בעיית שמירה/טעינה</string>
<string name="fatal_error">שגיאה חמורה</string> <string name="fatal_error">שגיאה חמורה</string>
<string name="fatal_error_message">שגיאה חמורה התרחשה. בדוק את היומן לפרטים./nהמשך הסימולציה עשוי לגרום לקריסות ולבאגים.</string>
<string name="performance_warning">כיבוי הגדרה זו ישפיע משמעותית על ביצועי הסימולציה! לחוויה הטובה ביותר, מומלץ להשאיר את הגדרה זו מופעלת.</string>
<string name="device_memory_inadequate">RAM המכשיר: %1$s/nמומלץ: %2$s</string> <string name="device_memory_inadequate">RAM המכשיר: %1$s/nמומלץ: %2$s</string>
<string name="memory_formatted">%1$s%2$s</string> <string name="memory_formatted">%1$s%2$s</string>
<string name="no_game_present">אין משחק שניתן להריץ!</string> <string name="no_game_present">אין משחק שניתן להריץ!</string>
@ -351,7 +273,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">בייט</string> <string name="memory_byte">בייט</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">KB</string> <string name="memory_kilobyte">KB</string>
<string name="memory_megabyte">MB</string> <string name="memory_megabyte">MB</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -376,17 +297,12 @@
<string name="resolution_three">3X (2160p/3240p) (איטי)</string> <string name="resolution_three">3X (2160p/3240p) (איטי)</string>
<string name="resolution_four">4X (2880p/4320p) (איטי)</string> <string name="resolution_four">4X (2880p/4320p) (איטי)</string>
<!-- Renderer VSync -->
<string name="renderer_vsync_immediate">מיידי (כבוי)</string>
<string name="renderer_vsync_mailbox">תיבת דואר</string> <string name="renderer_vsync_mailbox">תיבת דואר</string>
<string name="renderer_vsync_fifo">FIFO (On)</string> <string name="renderer_vsync_fifo">FIFO (On)</string>
<string name="renderer_vsync_fifo_relaxed">FIFO נינוח</string> <string name="renderer_vsync_fifo_relaxed">FIFO נינוח</string>
<!-- Scaling Filters --> <!-- Scaling Filters -->
<string name="scaling_filter_nearest_neighbor">השכן הקרוב ביותר</string> <string name="scaling_filter_nearest_neighbor">השכן הקרוב ביותר</string>
<string name="scaling_filter_bilinear">ביליניארי</string>
<string name="scaling_filter_bicubic">Bicubic</string>
<string name="scaling_filter_gaussian">Gaussian</string>
<string name="scaling_filter_scale_force">ScaleForce</string> <string name="scaling_filter_scale_force">ScaleForce</string>
<string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string> <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
@ -396,9 +312,10 @@
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">אוטומטי</string>
<string name="screen_layout_landscape">לרוחב</string> <string name="screen_layout_landscape">לרוחב</string>
<string name="screen_layout_portrait">לאורך</string> <string name="screen_layout_portrait">לאורך</string>
<string name="screen_layout_auto">אוטומטי</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">ברירת מחדל (16:9)</string> <string name="ratio_default">ברירת מחדל (16:9)</string>
<string name="ratio_force_four_three">הכרח 4:3</string> <string name="ratio_force_four_three">הכרח 4:3</string>
@ -406,10 +323,6 @@
<string name="ratio_force_sixteen_ten">הכרח 16:10</string> <string name="ratio_force_sixteen_ten">הכרח 16:10</string>
<string name="ratio_stretch">הרחב לגודל המסך</string> <string name="ratio_stretch">הרחב לגודל המסך</string>
<!-- CPU Backend -->
<string name="cpu_backend_dynarmic">דינמי (איטי)</string>
<string name="cpu_backend_nce">ביצוע קוד מקורי (NCE)</string>
<!-- CPU Accuracy --> <!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">מדויק</string> <string name="cpu_accuracy_accurate">מדויק</string>
<string name="cpu_accuracy_unsafe">לא בטוח</string> <string name="cpu_accuracy_unsafe">לא בטוח</string>
@ -422,10 +335,6 @@
<string name="gamepad_home">בית</string> <string name="gamepad_home">בית</string>
<string name="gamepad_screenshot">צילום מסך</string> <string name="gamepad_screenshot">צילום מסך</string>
<!-- Disk shader cache -->
<string name="preparing_shaders">מכין שיידרים</string>
<string name="building_shaders">בונה שיידרים</string>
<!-- Theme options --> <!-- Theme options -->
<string name="change_app_theme">שנה את נושא האפליקצייה</string> <string name="change_app_theme">שנה את נושא האפליקצייה</string>
<string name="theme_default">ברירת מחדל</string> <string name="theme_default">ברירת מחדל</string>
@ -437,14 +346,9 @@
<string name="theme_mode_light">בהיר</string> <string name="theme_mode_light">בהיר</string>
<string name="theme_mode_dark">כהה</string> <string name="theme_mode_dark">כהה</string>
<!-- Audio output engines -->
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">רקעים שחורים</string> <string name="use_black_backgrounds">רקעים שחורים</string>
<string name="use_black_backgrounds_description">כשמתשמשים במצב כהה, שם רקעים שחורים.</string> <string name="use_black_backgrounds_description">כשמתשמשים במצב כהה, שם רקעים שחורים.</string>

View File

@ -35,7 +35,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="empty_gamelist">Nem található fájl, vagy még nincs kiválasztva könyvtár.</string> <string name="empty_gamelist">Nem található fájl, vagy még nincs kiválasztva könyvtár.</string>
<string name="search_and_filter_games">Játékok keresése és szűrése</string> <string name="search_and_filter_games">Játékok keresése és szűrése</string>
<string name="select_games_folder">Játékmappa kiválasztása</string> <string name="select_games_folder">Játékmappa kiválasztása</string>
<string name="manage_game_folders">Játékmappák kezelése</string>
<string name="add_games_warning">Kihagyod a játékok mappa kiválasztását?</string> <string name="add_games_warning">Kihagyod a játékok mappa kiválasztását?</string>
<string name="add_games_warning_description">A játékok nem jelennek meg a Játékok listában, ha egy mappa nincs kijelölve.</string> <string name="add_games_warning_description">A játékok nem jelennek meg a Játékok listában, ha egy mappa nincs kijelölve.</string>
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
@ -69,7 +68,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="invalid_keys_error">Érvénytelen titkosítókulcsok</string> <string name="invalid_keys_error">Érvénytelen titkosítókulcsok</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">A kiválasztott fájl helytelen, vagy sérült. Állíts össze egy új kulcsot.</string> <string name="install_keys_failure_description">A kiválasztott fájl helytelen, vagy sérült. Állíts össze egy új kulcsot.</string>
<string name="gpu_driver_manager">GPU illesztőprogram-kezelő</string>
<string name="install_gpu_driver">GPU illesztőprogram telepítése</string> <string name="install_gpu_driver">GPU illesztőprogram telepítése</string>
<string name="install_gpu_driver_description">Alternatív illesztőprogramok telepítése az esetlegesen elérhető teljesítmény és pontosság érdekében</string> <string name="install_gpu_driver_description">Alternatív illesztőprogramok telepítése az esetlegesen elérhető teljesítmény és pontosság érdekében</string>
<string name="advanced_settings">Haladó beállítások</string> <string name="advanced_settings">Haladó beállítások</string>
@ -86,11 +84,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="notification_no_directory_link_description">Kérjük, manuálisan keresd meg a felhasználói mappát a fájlkezelő oldalsó paneljével.</string> <string name="notification_no_directory_link_description">Kérjük, manuálisan keresd meg a felhasználói mappát a fájlkezelő oldalsó paneljével.</string>
<string name="manage_save_data">Mentésadatok kezelése</string> <string name="manage_save_data">Mentésadatok kezelése</string>
<string name="manage_save_data_description">Mentés található. Kérjük, válassz egyet az alábbi opciók közül.</string> <string name="manage_save_data_description">Mentés található. Kérjük, válassz egyet az alábbi opciók közül.</string>
<string name="import_save_warning">Mentési fájlok importálása</string>
<string name="import_save_warning_description">Ezzel felülírod a fájlban lévő mentett adatokat. Biztosan szeretnéd folytatni?</string>
<string name="import_export_saves_description">Mentési fájlok importálás vagy exportálása</string> <string name="import_export_saves_description">Mentési fájlok importálás vagy exportálása</string>
<string name="save_files_importing">Mentési fájlok importálása...</string>
<string name="save_files_exporting">Mentési fájlok exportálása...</string>
<string name="save_file_imported_success">Sikeresen importálva</string> <string name="save_file_imported_success">Sikeresen importálva</string>
<string name="save_file_invalid_zip_structure">Érvénytelen mentési könyvtárstruktúra</string> <string name="save_file_invalid_zip_structure">Érvénytelen mentési könyvtárstruktúra</string>
<string name="save_file_invalid_zip_structure_description">Az első almappa neve a játék azonosítója kell, hogy legyen.</string> <string name="save_file_invalid_zip_structure_description">Az első almappa neve a játék azonosítója kell, hogy legyen.</string>
@ -123,38 +117,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="manage_yuzu_data_description">Firmware, kulcsok, felhasználói adatok és egyebek importálása/exportálása</string> <string name="manage_yuzu_data_description">Firmware, kulcsok, felhasználói adatok és egyebek importálása/exportálása</string>
<string name="share_save_file">Mentési fájl megosztása</string> <string name="share_save_file">Mentési fájl megosztása</string>
<string name="export_save_failed">A mentés exportálása sikertelen</string> <string name="export_save_failed">A mentés exportálása sikertelen</string>
<string name="game_folders">Játékmappák</string>
<string name="deep_scan">Mély szkennelés</string>
<string name="add_game_folder">Játékmappa hozzáadása</string>
<string name="folder_already_added">Ez a mappa már hozzá lett adva!</string>
<string name="game_folder_properties">Játékmappa tulajdonságok</string>
<plurals name="saves_import_failed">
<item quantity="one">%dmentés importálása sikertelen</item>
<item quantity="other">%dmentés importálása sikertelen</item>
</plurals>
<plurals name="saves_import_success">
<item quantity="one">%dmentés sikeresen importálva</item>
<item quantity="other">%dmentés sikeresen importálva</item>
</plurals>
<string name="no_save_data_found">Nem található mentett adat</string>
<!-- Applet launcher strings -->
<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="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>
<string name="mii_edit_applet_description">Miik megtekintése és szerkesztése a rendszerszerkesztővel</string>
<string name="cabinet_applet">Kabinet</string>
<string name="cabinet_applet_description">Amiibon tárolt adatok szerkesztése és törlése</string>
<string name="cabinet_launcher">Kabinet indító</string>
<string name="cabinet_nickname_and_owner">Becenév és tulajdonos beállítások</string>
<string name="cabinet_game_data_eraser">Játékadat eltávolító</string>
<string name="cabinet_restorer">Helyreállító</string>
<string name="cabinet_formatter">Formázó</string>
<!-- About screen strings --> <!-- About screen strings -->
<string name="gaia_is_not_real">Gaia nem valódi</string> <string name="gaia_is_not_real">Gaia nem valódi</string>
@ -196,7 +158,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</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> <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>
<string name="frame_limit_slider">Sebességkorlát százaléka</string> <string name="frame_limit_slider">Sebességkorlát százaléka</string>
<string name="frame_limit_slider_description">Az emuláció sebességét határozza meg. 100% a normál sebesség. A magasabb értékek növelik, az alacsonyabbak csökkentik a sebességkorlátot.</string> <string name="frame_limit_slider_description">Az emuláció sebességét határozza meg. 100% a normál sebesség. A magasabb értékek növelik, az alacsonyabbak csökkentik a sebességkorlátot.</string>
<string name="cpu_backend">CPU backend</string>
<string name="cpu_accuracy">CPU pontosság</string> <string name="cpu_accuracy">CPU pontosság</string>
<string name="value_with_units">%1$s%2$s</string> <string name="value_with_units">%1$s%2$s</string>
@ -227,7 +188,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="renderer_reactive_flushing_description">Javítja a renderelési pontosságot néhány játékban a teljesítmény rovására.</string> <string name="renderer_reactive_flushing_description">Javítja a renderelési pontosságot néhány játékban a teljesítmény rovására.</string>
<string name="use_disk_shader_cache">Lemez árnyékoló gyorsítótár</string> <string name="use_disk_shader_cache">Lemez árnyékoló gyorsítótár</string>
<string name="use_disk_shader_cache_description">Csökkenti az akadásokat azáltal, hogy helyileg tárolja és tölti be a generált árnyékolókat.</string> <string name="use_disk_shader_cache_description">Csökkenti az akadásokat azáltal, hogy helyileg tárolja és tölti be a generált árnyékolókat.</string>
<string name="anisotropic_filtering">Anizotropikus szűrés</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">CPU</string> <string name="cpu">CPU</string>
<string name="cpu_debug_mode">CPU hibakeresés</string> <string name="cpu_debug_mode">CPU hibakeresés</string>
@ -235,9 +196,9 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="gpu">GPU</string> <string name="gpu">GPU</string>
<string name="renderer_api">API</string> <string name="renderer_api">API</string>
<string name="renderer_debug">Grafikai hibakeresés</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="renderer_debug_description">Lassú hibakeresési módba állítja a grafikus API-t .</string>
<!-- Audio settings strings --> <!-- Audio settings strings -->
<string name="audio_output_engine">Kimeneti motor</string> <string name="audio_output_engine">Kimeneti rendszer</string>
<string name="audio_volume">Hangerő</string> <string name="audio_volume">Hangerő</string>
<string name="audio_volume_description">Hangkimenet hangerejének megadása</string> <string name="audio_volume_description">Hangkimenet hangerejének megadása</string>
@ -251,7 +212,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="shutting_down">Leállítás...</string> <string name="shutting_down">Leállítás...</string>
<string name="reset_setting_confirmation">Szeretnéd visszaállítani a beállítások az alapértelmezett értékekre?</string> <string name="reset_setting_confirmation">Szeretnéd visszaállítani a beállítások az alapértelmezett értékekre?</string>
<string name="reset_to_default">Alaphelyzetbe állítás</string> <string name="reset_to_default">Alaphelyzetbe állítás</string>
<string name="reset_to_default_description">Visszaállítja a haladó beállításokat</string>
<string name="reset_all_settings">Alaphelyzetbe állítod a beállításokat?</string> <string name="reset_all_settings">Alaphelyzetbe állítod a beállításokat?</string>
<string name="reset_all_settings_description">Minden haladó beállítás vissza lesz állítva az alapértelmezett konfigurációra. Ez a művelet nem vonható vissza.</string> <string name="reset_all_settings_description">Minden haladó beállítás vissza lesz állítva az alapértelmezett konfigurációra. Ez a művelet nem vonható vissza.</string>
<string name="settings_reset">Beállítások alaphelyzetbe állítva</string> <string name="settings_reset">Beállítások alaphelyzetbe állítva</string>
@ -259,24 +219,12 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="learn_more">Tudj meg többet</string> <string name="learn_more">Tudj meg többet</string>
<string name="auto">Automatikus</string> <string name="auto">Automatikus</string>
<string name="submit">Küldés</string> <string name="submit">Küldés</string>
<string name="string_null">Null</string> <string name="string_null">Nulla</string>
<string name="string_import">Importálás</string> <string name="string_import">Importálás</string>
<string name="export">Exportálás</string> <string name="export">Exportálás</string>
<string name="export_failed">Exportálás sikertelen</string> <string name="export_failed">Exportálás sikertelen</string>
<string name="import_failed">Importálás sikertelen</string> <string name="import_failed">Importálás sikertelen</string>
<string name="cancelling">Megszakítás</string> <string name="cancelling">Megszakítás</string>
<string name="install">Telepítés</string>
<string name="delete">Törlés</string>
<string name="edit">Szerkesztés</string>
<string name="export_success">Sikeresen exportálva</string>
<string name="start">Start</string>
<string name="clear">Törlés</string>
<string name="global">Globális</string>
<string name="custom">Egyéni</string>
<string name="notice">Értesítés</string>
<string name="import_complete">Importálás befejezve</string>
<string name="more_options">További opciók</string>
<string name="use_global_setting">Globális beállítás használata</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">Válassz GPU illesztőprogramot</string> <string name="select_gpu_driver">Válassz GPU illesztőprogramot</string>
@ -284,8 +232,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="select_gpu_driver_install">Telepítés</string> <string name="select_gpu_driver_install">Telepítés</string>
<string name="select_gpu_driver_default">Alapértelmezett</string> <string name="select_gpu_driver_default">Alapértelmezett</string>
<string name="select_gpu_driver_use_default">Alapértelmezett GPU illesztőprogram használata</string> <string name="select_gpu_driver_use_default">Alapértelmezett GPU illesztőprogram használata</string>
<string name="select_gpu_driver_error">Érvénytelen illesztőprogram kiválasztva</string> <string name="select_gpu_driver_error">Érvénytelen driver kiválasztva, a rendszer alapértelmezett lesz használva!</string>
<string name="driver_already_installed">Az illesztőprogram már telepítve van</string>
<string name="system_gpu_driver">Rendszer GPU illesztőprogram</string> <string name="system_gpu_driver">Rendszer GPU illesztőprogram</string>
<string name="installing_driver">Illesztőprogram telepítése...</string> <string name="installing_driver">Illesztőprogram telepítése...</string>
@ -293,54 +240,10 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="preferences_settings">Beállítások</string> <string name="preferences_settings">Beállítások</string>
<string name="preferences_general">Általános</string> <string name="preferences_general">Általános</string>
<string name="preferences_system">Rendszer</string> <string name="preferences_system">Rendszer</string>
<string name="preferences_system_description">Dokkolt mód, régió, nyelv</string>
<string name="preferences_graphics">Grafika</string> <string name="preferences_graphics">Grafika</string>
<string name="preferences_graphics_description">Pontossági szint, felbontás, árnyékoló gyorsítótár</string>
<string name="preferences_audio">Hang</string> <string name="preferences_audio">Hang</string>
<string name="preferences_audio_description">Kimeneti motor, hangerő</string>
<string name="preferences_theme">Téma és színek</string> <string name="preferences_theme">Téma és színek</string>
<string name="preferences_debug">Hibakeresés</string> <string name="preferences_debug">Hibakeresés</string>
<string name="preferences_debug_description">CPU/GPU hibakeresés, grafikus API, fastmem</string>
<!-- Game properties -->
<string name="info">Infó</string>
<string name="info_description">Program ID, fejlesztő, verzió</string>
<string name="per_game_settings">Játékonkénti beállítások</string>
<string name="per_game_settings_description">Játékspecifikus beállítások szerkesztése</string>
<string name="launch_options">Indítási konfiguráció</string>
<string name="path">Útvonal</string>
<string name="program_id">Program ID</string>
<string name="developer">Fejlesztő</string>
<string name="version">Verzió</string>
<string name="copy_details">Részletek másolása</string>
<string name="add_ons">Kiegészítők</string>
<string name="add_ons_description">Modok, frissítések és DLC váltása</string>
<string name="clear_shader_cache">Árnyékoló gyorsítótár ürítése</string>
<string name="clear_shader_cache_description">Eltávolítja a játék által létrehozott árnyékolókat.</string>
<string name="clear_shader_cache_warning_description">Az árnyékoló gyorsítótár regenerálódása során több akadozást fogsz tapasztalni.</string>
<string name="cleared_shaders_successfully">Árnyékolók sikeresen ürítve</string>
<string name="addons_game">Kiegészítők: %1$s</string>
<string name="save_data">Mentett adatok</string>
<string name="save_data_description">Játékspecifikus mentett adatok kezelése</string>
<string name="delete_save_data">Mentett adatok törlése</string>
<string name="delete_save_data_description">Eltávolítja az összes játékhoz tartozó mentett adatot.</string>
<string name="delete_save_data_warning_description">Ez helyreállíthatatlanul eltávolítja a játék összes mentett adatát. Biztosan szeretnéd folytatni?</string>
<string name="save_data_deleted_successfully">Mentett adatok sikeresen törölve</string>
<string name="select_content_type">Tartalom típusa</string>
<string name="updates_and_dlc">Frissítések és DLC</string>
<string name="mods_and_cheats">Modok és csalások</string>
<string name="addon_notice">Fontos kiegészítő értesítés</string>
<!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
<string name="addon_notice_description">A modok és csalások telepítéséhez olyan mappát válassz, amely tartalmaz cheats/, romfs/ vagy exefs/ könyvtárat. Nem tudjuk garantálni, hogy ezek kompatibilisek lesznek a játékoddal, ezért légy óvatos!</string>
<string name="invalid_directory">Érvénytelen könyvtár</string>
<!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
<string name="invalid_directory_description">Kérjük, győződj meg róla, hogy a kiválasztott könyvtár tartalmazza a cheats/, romfs/ vagy exefs/ mappát, majd próbáld újra.</string>
<string name="addon_installed_successfully">Kiegészítő sikeresen telepítve</string>
<string name="verifying_content">Tartalom ellenőrzése...</string>
<string name="content_install_notice">Tartalom telepítési értesítés</string>
<string name="content_install_notice_description">A kiválasztott tartalom nem ehhez a játékhoz tartozik.\nÍgy is telepíted?</string>
<string name="confirm_uninstall">Eltávolítás megerősítése</string>
<string name="confirm_uninstall_description">Biztosan törölni szeretnéd ezt a kiegészítőt?</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">ROM titkosítva</string> <string name="loader_error_encrypted">ROM titkosítva</string>
@ -367,7 +270,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="emulation_pause">Emuláció szünetelése</string> <string name="emulation_pause">Emuláció szünetelése</string>
<string name="emulation_unpause">Emuláció folytatása</string> <string name="emulation_unpause">Emuláció folytatása</string>
<string name="emulation_input_overlay">Átfedés beállításai</string> <string name="emulation_input_overlay">Átfedés beállításai</string>
<string name="touchscreen">Érintőképernyő</string>
<string name="load_settings">Beállítások betöltése...</string> <string name="load_settings">Beállítások betöltése...</string>
@ -399,7 +301,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Bájt</string> <string name="memory_byte">Bájt</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">KB</string> <string name="memory_kilobyte">KB</string>
<string name="memory_megabyte">MB</string> <string name="memory_megabyte">MB</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -444,11 +345,9 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">Automatikus</string>
<string name="screen_layout_landscape">Fekvő</string> <string name="screen_layout_landscape">Fekvő</string>
<string name="screen_layout_reverse_landscape">Fekvő (fejjel lefelé)</string>
<string name="screen_layout_portrait">Álló</string> <string name="screen_layout_portrait">Álló</string>
<string name="screen_layout_reverse_portrait">Álló (fejjel lefelé)</string> <string name="screen_layout_auto">Automatikus</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">Alapértelmezett (16:9)</string> <string name="ratio_default">Alapértelmezett (16:9)</string>
@ -457,8 +356,6 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="ratio_force_sixteen_ten">16:10 kényszerítése</string> <string name="ratio_force_sixteen_ten">16:10 kényszerítése</string>
<string name="ratio_stretch">Ablakhoz nyújtás</string> <string name="ratio_stretch">Ablakhoz nyújtás</string>
<!-- CPU Backend -->
<string name="cpu_backend_dynarmic">Dinamikus (lassú)</string>
<!-- CPU Accuracy --> <!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">Pontos</string> <string name="cpu_accuracy_accurate">Pontos</string>
<string name="cpu_accuracy_unsafe">Nem biztonságos</string> <string name="cpu_accuracy_unsafe">Nem biztonságos</string>
@ -485,15 +382,8 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
<string name="theme_mode_dark">Sötét</string> <string name="theme_mode_dark">Sötét</string>
<!-- Audio output engines --> <!-- Audio output engines -->
<string name="oboe">oboe</string>
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Fekete háttér</string> <string name="use_black_backgrounds">Fekete háttér</string>
<string name="use_black_backgrounds_description">Sötét téma használatakor fekete háttér használata.</string> <string name="use_black_backgrounds_description">Sötét téma használatakor fekete háttér használata.</string>

View File

@ -17,7 +17,7 @@
<string name="keys_description">Seleziona il tuo file &lt;b>prod.keys&lt;/b> con il pulsante in basso.</string> <string name="keys_description">Seleziona il tuo file &lt;b>prod.keys&lt;/b> con il pulsante in basso.</string>
<string name="select_keys">Seleziona le chiavi</string> <string name="select_keys">Seleziona le chiavi</string>
<string name="games">Giochi</string> <string name="games">Giochi</string>
<string name="games_description">Seleziona la cartella dei &lt;b>giochi&lt;/b> con il pulsante in basso.</string> <string name="games_description">Seleziona la cartella &lt;b>Games&lt;/b> con il pulsante in basso.</string>
<string name="done">Fatto</string> <string name="done">Fatto</string>
<string name="done_description">È tutto pronto.\nDivertiti a giocare!</string> <string name="done_description">È tutto pronto.\nDivertiti a giocare!</string>
<string name="text_continue">Continua</string> <string name="text_continue">Continua</string>
@ -33,7 +33,7 @@
<string name="home_settings">Impostazioni</string> <string name="home_settings">Impostazioni</string>
<string name="empty_gamelist">Non sono stati trovati file o non è stata ancora selezionata alcuna directory di gioco.</string> <string name="empty_gamelist">Non sono stati trovati file o non è stata ancora selezionata alcuna directory di gioco.</string>
<string name="search_and_filter_games">Cerca e filtra i giochi</string> <string name="search_and_filter_games">Cerca e filtra i giochi</string>
<string name="select_games_folder">Seleziona la cartella dei giochi</string> <string name="select_games_folder">Seleziona la cartella di gioco</string>
<string name="select_games_folder_description">Consente a yuzu di popolare l\'elenco dei giochi</string> <string name="select_games_folder_description">Consente a yuzu di popolare l\'elenco dei giochi</string>
<string name="add_games_warning">Saltare la selezione della cartella dei giochi?</string> <string name="add_games_warning">Saltare la selezione della cartella dei giochi?</string>
<string name="add_games_warning_description">I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata.</string> <string name="add_games_warning_description">I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata.</string>
@ -68,7 +68,6 @@
<string name="invalid_keys_error">Chiavi di crittografia non valide</string> <string name="invalid_keys_error">Chiavi di crittografia non valide</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string> <string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string>
<string name="gpu_driver_manager">Gestore driver GPU</string>
<string name="install_gpu_driver">Installa i driver GPU</string> <string name="install_gpu_driver">Installa i driver GPU</string>
<string name="install_gpu_driver_description">Installa driver alternativi per potenziali prestazioni migliori o accuratezza.</string> <string name="install_gpu_driver_description">Installa driver alternativi per potenziali prestazioni migliori o accuratezza.</string>
<string name="advanced_settings">Impostazioni avanzate</string> <string name="advanced_settings">Impostazioni avanzate</string>
@ -119,23 +118,6 @@
<string name="manage_yuzu_data_description">Importa/Esporta il firmware, le keys, i dati utente, e altro!</string> <string name="manage_yuzu_data_description">Importa/Esporta il firmware, le keys, i dati utente, e altro!</string>
<string name="share_save_file">Condividi i tuoi dati di salvataggio</string> <string name="share_save_file">Condividi i tuoi dati di salvataggio</string>
<string name="export_save_failed">Errore durante l\'esportazione del salvataggio</string> <string name="export_save_failed">Errore durante l\'esportazione del salvataggio</string>
<!-- Applet launcher strings -->
<string name="applets">Avvia applet</string>
<string name="applets_description">Avvia applet di sistema usando il firmware installato</string>
<string name="applets_error_firmware">Firmware non installato</string>
<string name="applets_error_applet">Applet non disponibile</string>
<string name="applets_error_description"><![CDATA[Assicurati che il file <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> e il <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">firmware</a> siano installati e riprova.]]></string>
<string name="album_applet">Album</string>
<string name="album_applet_description">Visualizza le immagini salvate nella cartella screenshots dell\'utente con il visualizzatore immagini di sistema</string>
<string name="mii_edit_applet">Modifica Mii</string>
<string name="mii_edit_applet_description">Visualizza e modifica Mii con l\'editor di sistema</string>
<string name="cabinet_applet">Cabinet</string>
<string name="cabinet_applet_description">Modifica ed elimina i dati salvati sugli amiibo</string>
<string name="cabinet_launcher">Avvia Cabinet</string>
<string name="cabinet_nickname_and_owner">Impostazioni nickname e proprietario</string>
<string name="cabinet_game_data_eraser">Cancella dati di gioco</string>
<string name="cabinet_restorer">Ripristina</string>
<string name="cabinet_formatter">Formatta</string>
<!-- About screen strings --> <!-- About screen strings -->
<string name="gaia_is_not_real">Gaia non è reale</string> <string name="gaia_is_not_real">Gaia non è reale</string>
@ -209,6 +191,7 @@
<string name="renderer_reactive_flushing_description">Migliora l\'accuratezza della grafica in alcuni giochi, al costo delle performance.</string> <string name="renderer_reactive_flushing_description">Migliora l\'accuratezza della grafica in alcuni giochi, al costo delle performance.</string>
<string name="use_disk_shader_cache">Usa la cache delle shader</string> <string name="use_disk_shader_cache">Usa la cache delle shader</string>
<string name="use_disk_shader_cache_description">Riduce lo stuttering caricando le shader già compilate all\'avvio.</string> <string name="use_disk_shader_cache_description">Riduce lo stuttering caricando le shader già compilate all\'avvio.</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">CPU</string> <string name="cpu">CPU</string>
<string name="cpu_debug_mode">Debug della CPU</string> <string name="cpu_debug_mode">Debug della CPU</string>
@ -247,19 +230,14 @@
<string name="export_failed">Esportazione Fallita</string> <string name="export_failed">Esportazione Fallita</string>
<string name="import_failed">Importazione Fallita</string> <string name="import_failed">Importazione Fallita</string>
<string name="cancelling">Cancellazione</string> <string name="cancelling">Cancellazione</string>
<string name="install">Installa</string>
<string name="delete">Elimina</string>
<string name="start">Start</string>
<string name="clear">Cancella</string>
<string name="custom">Personalizzato</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">Seleziona il driver della GPU</string> <string name="select_gpu_driver">Seleziona il driver della GPU</string>
<string name="select_gpu_driver_title">Vuoi sostituire il driver della tua GPU attuale?</string> <string name="select_gpu_driver_title">Vuoi sostituire il driver della tua GPU attuale?</string>
<string name="select_gpu_driver_install">Installa</string> <string name="select_gpu_driver_install">Installa</string>
<string name="select_gpu_driver_default">Predefinito</string> <string name="select_gpu_driver_default">Predefinito</string>
<string name="select_gpu_driver_use_default">Utilizza il driver predefinito della GPU.</string> <string name="select_gpu_driver_use_default">Utilizza il driver predefinito della GPU.</string>
<string name="select_gpu_driver_error">Driver selezionato non valido</string> <string name="select_gpu_driver_error">Il driver selezionato è invalido, è in utilizzo quello predefinito di sistema!</string>
<string name="driver_already_installed">Driver già installato</string>
<string name="system_gpu_driver">Driver GPU del sistema</string> <string name="system_gpu_driver">Driver GPU del sistema</string>
<string name="installing_driver">Installando i driver...</string> <string name="installing_driver">Installando i driver...</string>
@ -271,12 +249,7 @@
<string name="preferences_audio">Audio</string> <string name="preferences_audio">Audio</string>
<string name="preferences_theme">Tema e colori</string> <string name="preferences_theme">Tema e colori</string>
<string name="preferences_debug">Debug</string> <string name="preferences_debug">Debug</string>
<!-- Game properties -->
<string name="info">Info</string>
<string name="path">Percorso</string>
<string name="developer">Sviluppatore</string>
<string name="version">Versione</string>
<string name="add_ons">Add-on</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">La tua ROM è criptata</string> <string name="loader_error_encrypted">La tua ROM è criptata</string>
<string name="loader_error_encrypted_roms_description"><![CDATA[Segui la nostra guida per fare il <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">dump delle tue cartucce di gioco</a>oppure <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">dei titoli già installati</a>.]]></string> <string name="loader_error_encrypted_roms_description"><![CDATA[Segui la nostra guida per fare il <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">dump delle tue cartucce di gioco</a>oppure <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">dei titoli già installati</a>.]]></string>
@ -290,21 +263,20 @@
<string name="emulation_exit">Arresta emulazione</string> <string name="emulation_exit">Arresta emulazione</string>
<string name="emulation_done">Fatto</string> <string name="emulation_done">Fatto</string>
<string name="emulation_fps_counter">Contatore FPS</string> <string name="emulation_fps_counter">Contatore FPS</string>
<string name="emulation_toggle_controls">Attiva/disattiva comandi</string> <string name="emulation_toggle_controls">Controlli a interruttore</string>
<string name="emulation_rel_stick_center">Centro relativo degli Stick</string> <string name="emulation_rel_stick_center">Centro relativo degli Stick</string>
<string name="emulation_dpad_slide">DPad A Scorrimento</string> <string name="emulation_dpad_slide">DPad A Scorrimento</string>
<string name="emulation_haptics">Feedback Aptico</string> <string name="emulation_haptics">Feedback Aptico</string>
<string name="emulation_show_overlay">Mostra l\'overlay</string> <string name="emulation_show_overlay">Mostra l\'Overlay</string>
<string name="emulation_toggle_all">Attiva/Disattiva tutto</string> <string name="emulation_toggle_all">Attiva/Disattiva tutto</string>
<string name="emulation_control_adjust">Regola l\'overlay</string> <string name="emulation_control_adjust">Modifica l\'Overlay</string>
<string name="emulation_control_scale">Scala</string> <string name="emulation_control_scale">Scala</string>
<string name="emulation_control_opacity">Opacità</string> <string name="emulation_control_opacity">Opacità</string>
<string name="emulation_touch_overlay_reset">Reimposta l\'overlay</string> <string name="emulation_touch_overlay_reset">Reimposta l\'Overlay</string>
<string name="emulation_touch_overlay_edit">Modifica l\'overlay</string> <string name="emulation_touch_overlay_edit">Modifica l\'Overlay</string>
<string name="emulation_pause">Sospendi l\'emulazione</string> <string name="emulation_pause">Sospendi l\'emulazione</string>
<string name="emulation_unpause">Riprendi l\'emulazione</string> <string name="emulation_unpause">Riprendi l\'emulazione</string>
<string name="emulation_input_overlay">Opzioni overlay</string> <string name="emulation_input_overlay">Opzioni overlay</string>
<string name="touchscreen">Touchscreen</string>
<string name="load_settings">Carico le impostazioni...</string> <string name="load_settings">Carico le impostazioni...</string>
@ -336,7 +308,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Byte</string> <string name="memory_byte">Byte</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">Kb</string> <string name="memory_kilobyte">Kb</string>
<string name="memory_megabyte">Mb</string> <string name="memory_megabyte">Mb</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -381,9 +352,10 @@
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">Automatico</string>
<string name="screen_layout_landscape">Layout Orizzontale</string> <string name="screen_layout_landscape">Layout Orizzontale</string>
<string name="screen_layout_portrait">Layout Verticale</string> <string name="screen_layout_portrait">Layout Verticale</string>
<string name="screen_layout_auto">Automatico</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">Predefinito (16:9)</string> <string name="ratio_default">Predefinito (16:9)</string>
<string name="ratio_force_four_three">Forza 4:3</string> <string name="ratio_force_four_three">Forza 4:3</string>
@ -418,14 +390,9 @@
<string name="theme_mode_light">Chiaro</string> <string name="theme_mode_light">Chiaro</string>
<string name="theme_mode_dark">Scuro</string> <string name="theme_mode_dark">Scuro</string>
<!-- Audio output engines -->
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Sfondi neri</string> <string name="use_black_backgrounds">Sfondi neri</string>
<string name="use_black_backgrounds_description">Quando utilizzi il tema scuro, applica sfondi neri.</string> <string name="use_black_backgrounds_description">Quando utilizzi il tema scuro, applica sfondi neri.</string>

View File

@ -39,7 +39,7 @@
<string name="add_games_warning_description">フォルダを選択しないと、ゲームがリストに表示されません。</string> <string name="add_games_warning_description">フォルダを選択しないと、ゲームがリストに表示されません。</string>
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
<string name="home_search_games">ゲームを検索</string> <string name="home_search_games">ゲームを検索</string>
<string name="search_settings">設定を検索</string> <string name="search_settings">検索設定</string>
<string name="games_dir_selected">フォルダを選択しました</string> <string name="games_dir_selected">フォルダを選択しました</string>
<string name="install_prod_keys">prod.keys</string> <string name="install_prod_keys">prod.keys</string>
<string name="install_prod_keys_description">製品版ゲームの復号化に必要です</string> <string name="install_prod_keys_description">製品版ゲームの復号化に必要です</string>
@ -68,7 +68,6 @@
<string name="invalid_keys_error">暗号化キーが無効</string> <string name="invalid_keys_error">暗号化キーが無効</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">ファイルが間違っているか破損しています。キーを再ダンプしてください。</string> <string name="install_keys_failure_description">ファイルが間違っているか破損しています。キーを再ダンプしてください。</string>
<string name="gpu_driver_manager">GPUドライバーの管理</string>
<string name="install_gpu_driver">GPUドライバー</string> <string name="install_gpu_driver">GPUドライバー</string>
<string name="install_gpu_driver_description">代替ドライバーをインストールしてパフォーマンスや精度を向上させます</string> <string name="install_gpu_driver_description">代替ドライバーをインストールしてパフォーマンスや精度を向上させます</string>
<string name="advanced_settings">高度な設定</string> <string name="advanced_settings">高度な設定</string>
@ -112,9 +111,6 @@
<string name="custom_driver_not_supported">カスタムドライバはサポートされていません</string> <string name="custom_driver_not_supported">カスタムドライバはサポートされていません</string>
<string name="manage_yuzu_data">yuzu データを管理</string> <string name="manage_yuzu_data">yuzu データを管理</string>
<string name="share_save_file">セーブファイルを共有</string> <string name="share_save_file">セーブファイルを共有</string>
<string name="applets_error_firmware">ファームウェア未インストール</string>
<string name="album_applet">アルバム</string>
<string name="cabinet_nickname_and_owner">ニックネームと所有者の設定</string>
<!-- About screen strings --> <!-- About screen strings -->
<string name="gaia_is_not_real">ガイアは実在しない</string> <string name="gaia_is_not_real">ガイアは実在しない</string>
<string name="copied_to_clipboard">クリップボードにコピーしました</string> <string name="copied_to_clipboard">クリップボードにコピーしました</string>
@ -182,9 +178,10 @@
<string name="renderer_reactive_flushing_description">一部のゲームにおいて、パフォーマンスを犠牲にしながらも、レンダリング精度を向上させます。</string> <string name="renderer_reactive_flushing_description">一部のゲームにおいて、パフォーマンスを犠牲にしながらも、レンダリング精度を向上させます。</string>
<string name="use_disk_shader_cache">ディスクシェーダーキャッシュ</string> <string name="use_disk_shader_cache">ディスクシェーダーキャッシュ</string>
<string name="use_disk_shader_cache_description">生成したシェーダーを端末に保存して読み込み、コマ落ちを軽減します。</string> <string name="use_disk_shader_cache_description">生成したシェーダーを端末に保存して読み込み、コマ落ちを軽減します。</string>
<!-- Debug settings strings --> <!-- Debug settings strings -->
<string name="cpu">CPU</string> <string name="cpu">CPU</string>
<string name="cpu_debug_mode">CPUデバッグ</string> <string name="cpu_debug_mode">CPU デバッギン</string>
<string name="gpu">GPU</string> <string name="gpu">GPU</string>
<string name="renderer_api">API</string> <string name="renderer_api">API</string>
<string name="renderer_debug">グラフィックデバッグ</string> <string name="renderer_debug">グラフィックデバッグ</string>
@ -218,17 +215,14 @@
<string name="export_failed">エクスポート失敗</string> <string name="export_failed">エクスポート失敗</string>
<string name="import_failed">インポート失敗</string> <string name="import_failed">インポート失敗</string>
<string name="cancelling">キャンセル中</string> <string name="cancelling">キャンセル中</string>
<string name="install">インストール</string>
<string name="delete">削除</string>
<string name="start">開始</string>
<string name="clear">クリア</string>
<string name="custom">カスタム</string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">GPUドライバを選択</string> <string name="select_gpu_driver">GPUドライバを選択</string>
<string name="select_gpu_driver_title">現在のGPUドライバを置き換えますか</string> <string name="select_gpu_driver_title">現在のGPUドライバを置き換えますか</string>
<string name="select_gpu_driver_install">インストール</string> <string name="select_gpu_driver_install">インストール</string>
<string name="select_gpu_driver_default">デフォルト</string> <string name="select_gpu_driver_default">デフォルト</string>
<string name="select_gpu_driver_use_default">デフォルトのドライバを使用します</string> <string name="select_gpu_driver_use_default">デフォルトのドライバを使用します</string>
<string name="select_gpu_driver_error">選択されたドライバが無効、システムのデフォルトを使用します!</string>
<string name="system_gpu_driver">システムのGPUドライバ</string> <string name="system_gpu_driver">システムのGPUドライバ</string>
<string name="installing_driver">インストール中…</string> <string name="installing_driver">インストール中…</string>
@ -240,12 +234,7 @@
<string name="preferences_audio">サウンド</string> <string name="preferences_audio">サウンド</string>
<string name="preferences_theme">テーマと色</string> <string name="preferences_theme">テーマと色</string>
<string name="preferences_debug">デバッグ</string> <string name="preferences_debug">デバッグ</string>
<!-- Game properties -->
<string name="info">情報</string>
<string name="path">パス</string>
<string name="developer">開発元</string>
<string name="version">バージョン</string>
<string name="add_ons">アドオン</string>
<!-- ROM loading errors --> <!-- ROM loading errors -->
<string name="loader_error_encrypted">ROMが暗号化されています</string> <string name="loader_error_encrypted">ROMが暗号化されています</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-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> ファイルがインストールされていることを確認してください。]]></string>
@ -272,7 +261,6 @@
<string name="emulation_pause">一時停止</string> <string name="emulation_pause">一時停止</string>
<string name="emulation_unpause">再開</string> <string name="emulation_unpause">再開</string>
<string name="emulation_input_overlay">表示オプション</string> <string name="emulation_input_overlay">表示オプション</string>
<string name="touchscreen">タッチスクリーン</string>
<string name="load_settings">設定をロード中…</string> <string name="load_settings">設定をロード中…</string>
@ -304,7 +292,6 @@
<!-- Memory Sizes --> <!-- Memory Sizes -->
<string name="memory_byte">Byte</string> <string name="memory_byte">Byte</string>
<string name="memory_byte_shorthand">B</string>
<string name="memory_kilobyte">KB</string> <string name="memory_kilobyte">KB</string>
<string name="memory_megabyte">MB</string> <string name="memory_megabyte">MB</string>
<string name="memory_gigabyte">GB</string> <string name="memory_gigabyte">GB</string>
@ -349,9 +336,10 @@
<string name="anti_aliasing_smaa">SMAA</string> <string name="anti_aliasing_smaa">SMAA</string>
<!-- Screen Layouts --> <!-- Screen Layouts -->
<string name="screen_layout_auto">自動</string>
<string name="screen_layout_landscape">横長</string> <string name="screen_layout_landscape">横長</string>
<string name="screen_layout_portrait">縦長</string> <string name="screen_layout_portrait">縦長</string>
<string name="screen_layout_auto">自動</string>
<!-- Aspect Ratios --> <!-- Aspect Ratios -->
<string name="ratio_default">デフォルト (16:9)</string> <string name="ratio_default">デフォルト (16:9)</string>
<string name="ratio_force_four_three">強制 4:3</string> <string name="ratio_force_four_three">強制 4:3</string>
@ -386,14 +374,9 @@
<string name="theme_mode_light">ライト</string> <string name="theme_mode_light">ライト</string>
<string name="theme_mode_dark">ダーク</string> <string name="theme_mode_dark">ダーク</string>
<!-- Audio output engines -->
<string name="cubeb">cubeb</string> <string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme --> <!-- Black backgrounds theme -->
<string name="use_black_backgrounds">完全な黒を使用</string> <string name="use_black_backgrounds">完全な黒を使用</string>
<string name="use_black_backgrounds_description">ダークテーマの背景色に黒が適用されます。</string> <string name="use_black_backgrounds_description">ダークテーマの背景色に黒が適用されます。</string>

Some files were not shown because too many files have changed in this diff Show More