summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/android/app/build.gradle.kts15
-rw-r--r--src/android/app/debug.keystorebin0 -> 2105 bytes
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt65
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt21
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt35
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt25
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt10
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt54
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt34
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt45
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt33
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt29
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt10
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt (renamed from src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt)44
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Addon.kt10
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt42
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameVerificationResult.kt15
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/InstallResult.kt15
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt16
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt29
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt101
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt80
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt21
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt5
-rw-r--r--src/android/app/src/main/jni/android_common/android_common.cpp16
-rw-r--r--src/android/app/src/main/jni/android_common/android_common.h7
-rw-r--r--src/android/app/src/main/jni/android_settings.h1
-rw-r--r--src/android/app/src/main/jni/id_cache.cpp101
-rw-r--r--src/android/app/src/main/jni/id_cache.h17
-rw-r--r--src/android/app/src/main/jni/native.cpp165
-rw-r--r--src/android/app/src/main/jni/native.h2
-rw-r--r--src/android/app/src/main/res/drawable/ic_lock.xml9
-rw-r--r--src/android/app/src/main/res/drawable/ic_shortcut.xml9
-rw-r--r--src/android/app/src/main/res/layout-w600dp/fragment_game_properties.xml35
-rw-r--r--src/android/app/src/main/res/layout/card_home_option.xml6
-rw-r--r--src/android/app/src/main/res/layout/dialog_progress_bar.xml30
-rw-r--r--src/android/app/src/main/res/layout/fragment_game_info.xml8
-rw-r--r--src/android/app/src/main/res/layout/fragment_game_properties.xml40
-rw-r--r--src/android/app/src/main/res/layout/list_item_addon.xml32
-rw-r--r--src/android/app/src/main/res/layout/list_item_setting.xml2
-rw-r--r--src/android/app/src/main/res/layout/list_item_setting_switch.xml2
-rw-r--r--src/android/app/src/main/res/menu/menu_driver_manager.xml9
-rw-r--r--src/android/app/src/main/res/menu/menu_in_game.xml5
-rw-r--r--src/android/app/src/main/res/values-ar/strings.xml193
-rw-r--r--src/android/app/src/main/res/values-ckb/strings.xml18
-rw-r--r--src/android/app/src/main/res/values-cs/strings.xml265
-rw-r--r--src/android/app/src/main/res/values-de/strings.xml89
-rw-r--r--src/android/app/src/main/res/values-es/strings.xml142
-rw-r--r--src/android/app/src/main/res/values-fr/strings.xml128
-rw-r--r--src/android/app/src/main/res/values-he/strings.xml106
-rw-r--r--src/android/app/src/main/res/values-hu/strings.xml122
-rw-r--r--src/android/app/src/main/res/values-it/strings.xml61
-rw-r--r--src/android/app/src/main/res/values-ja/strings.xml35
-rw-r--r--src/android/app/src/main/res/values-ko/strings.xml209
-rw-r--r--src/android/app/src/main/res/values-nb/strings.xml23
-rw-r--r--src/android/app/src/main/res/values-pl/strings.xml24
-rw-r--r--src/android/app/src/main/res/values-pt-rBR/strings.xml360
-rw-r--r--src/android/app/src/main/res/values-pt-rPT/strings.xml120
-rw-r--r--src/android/app/src/main/res/values-ru/strings.xml124
-rw-r--r--src/android/app/src/main/res/values-uk/strings.xml23
-rw-r--r--src/android/app/src/main/res/values-vi/strings.xml24
-rw-r--r--src/android/app/src/main/res/values-zh-rCN/strings.xml124
-rw-r--r--src/android/app/src/main/res/values-zh-rTW/strings.xml210
-rw-r--r--src/android/app/src/main/res/values/strings.xml17
-rw-r--r--src/common/fs/file.h2
-rw-r--r--src/core/CMakeLists.txt17
-rw-r--r--src/core/file_sys/patch_manager.cpp43
-rw-r--r--src/core/file_sys/patch_manager.h17
-rw-r--r--src/core/hle/service/acc/profile_manager.cpp17
-rw-r--r--src/core/hle/service/acc/profile_manager.h1
-rw-r--r--src/core/hle/service/hid/hid.cpp3
-rw-r--r--src/core/hle/service/hid/hid_server.cpp334
-rw-r--r--src/core/hle/service/hid/hid_server.h1
-rw-r--r--src/core/hle/service/hid/hid_system_server.cpp102
-rw-r--r--src/core/hle/service/hid/hid_system_server.h6
-rw-r--r--src/core/hle/service/nfc/common/device.cpp5
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.cpp16
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.h4
-rw-r--r--src/core/hle/service/set/private_settings.h72
-rw-r--r--src/core/hle/service/set/setting_formats/appln_settings.cpp (renamed from src/core/hle/service/set/appln_settings.cpp)8
-rw-r--r--src/core/hle/service/set/setting_formats/appln_settings.h (renamed from src/core/hle/service/set/appln_settings.h)17
-rw-r--r--src/core/hle/service/set/setting_formats/device_settings.cpp (renamed from src/core/hle/service/set/device_settings.cpp)2
-rw-r--r--src/core/hle/service/set/setting_formats/device_settings.h (renamed from src/core/hle/service/set/device_settings.h)16
-rw-r--r--src/core/hle/service/set/setting_formats/private_settings.cpp (renamed from src/core/hle/service/set/private_settings.cpp)2
-rw-r--r--src/core/hle/service/set/setting_formats/private_settings.h39
-rw-r--r--src/core/hle/service/set/setting_formats/system_settings.cpp (renamed from src/core/hle/service/set/system_settings.cpp)8
-rw-r--r--src/core/hle/service/set/setting_formats/system_settings.h (renamed from src/core/hle/service/set/system_settings.h)496
-rw-r--r--src/core/hle/service/set/settings_server.h61
-rw-r--r--src/core/hle/service/set/settings_types.h451
-rw-r--r--src/core/hle/service/set/system_settings_server.cpp218
-rw-r--r--src/core/hle/service/set/system_settings_server.h48
-rw-r--r--src/core/hle/service/vi/display/vi_display.cpp11
-rw-r--r--src/core/hle/service/vi/display/vi_display.h3
-rw-r--r--src/core/hle/service/vi/layer/vi_layer.h9
-rw-r--r--src/core/hle/service/vi/vi.cpp14
-rw-r--r--src/frontend_common/CMakeLists.txt1
-rw-r--r--src/frontend_common/content_manager.h371
-rw-r--r--src/hid_core/frontend/emulated_controller.cpp46
-rw-r--r--src/hid_core/frontend/emulated_controller.h20
-rw-r--r--src/hid_core/resource_manager.cpp123
-rw-r--r--src/hid_core/resource_manager.h25
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp2
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.h6
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_pad.cpp13
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_pad.h6
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp42
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_vibration_handler.h12
-rw-r--r--src/hid_core/resources/applet_resource.cpp19
-rw-r--r--src/hid_core/resources/applet_resource.h1
-rw-r--r--src/hid_core/resources/hid_firmware_settings.cpp35
-rw-r--r--src/hid_core/resources/hid_firmware_settings.h12
-rw-r--r--src/hid_core/resources/npad/npad.cpp312
-rw-r--r--src/hid_core/resources/npad/npad.h61
-rw-r--r--src/hid_core/resources/npad/npad_types.h6
-rw-r--r--src/hid_core/resources/npad/npad_vibration.cpp4
-rw-r--r--src/hid_core/resources/npad/npad_vibration.h2
-rw-r--r--src/hid_core/resources/vibration/gc_vibration_device.cpp56
-rw-r--r--src/hid_core/resources/vibration/gc_vibration_device.h10
-rw-r--r--src/hid_core/resources/vibration/n64_vibration_device.cpp57
-rw-r--r--src/hid_core/resources/vibration/n64_vibration_device.h8
-rw-r--r--src/hid_core/resources/vibration/vibration_base.cpp4
-rw-r--r--src/hid_core/resources/vibration/vibration_base.h10
-rw-r--r--src/hid_core/resources/vibration/vibration_device.cpp72
-rw-r--r--src/hid_core/resources/vibration/vibration_device.h16
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp76
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_instructions.h2
-rw-r--r--src/video_core/renderer_vulkan/vk_present_manager.cpp2
-rw-r--r--src/yuzu/CMakeLists.txt2
-rw-r--r--src/yuzu/configuration/configure_per_game_addons.cpp7
-rw-r--r--src/yuzu/configuration/configure_vibration.cpp8
-rw-r--r--src/yuzu/game_list_worker.cpp11
-rw-r--r--src/yuzu/main.cpp328
-rw-r--r--src/yuzu/main.h13
137 files changed, 5441 insertions, 2099 deletions
diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts
index 06e59d1ac..188ef9469 100644
--- a/src/android/app/build.gradle.kts
+++ b/src/android/app/build.gradle.kts
@@ -82,8 +82,8 @@ android {
82 } 82 }
83 83
84 val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE") 84 val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
85 if (keystoreFile != null) { 85 signingConfigs {
86 signingConfigs { 86 if (keystoreFile != null) {
87 create("release") { 87 create("release") {
88 storeFile = file(keystoreFile) 88 storeFile = file(keystoreFile)
89 storePassword = System.getenv("ANDROID_KEYSTORE_PASS") 89 storePassword = System.getenv("ANDROID_KEYSTORE_PASS")
@@ -91,6 +91,12 @@ android {
91 keyPassword = System.getenv("ANDROID_KEYSTORE_PASS") 91 keyPassword = System.getenv("ANDROID_KEYSTORE_PASS")
92 } 92 }
93 } 93 }
94 create("default") {
95 storeFile = file("$projectDir/debug.keystore")
96 storePassword = "android"
97 keyAlias = "androiddebugkey"
98 keyPassword = "android"
99 }
94 } 100 }
95 101
96 // Define build types, which are orthogonal to product flavors. 102 // Define build types, which are orthogonal to product flavors.
@@ -101,7 +107,7 @@ android {
101 signingConfig = if (keystoreFile != null) { 107 signingConfig = if (keystoreFile != null) {
102 signingConfigs.getByName("release") 108 signingConfigs.getByName("release")
103 } else { 109 } else {
104 signingConfigs.getByName("debug") 110 signingConfigs.getByName("default")
105 } 111 }
106 112
107 resValue("string", "app_name_suffixed", "yuzu") 113 resValue("string", "app_name_suffixed", "yuzu")
@@ -118,7 +124,7 @@ android {
118 register("relWithDebInfo") { 124 register("relWithDebInfo") {
119 isDefault = true 125 isDefault = true
120 resValue("string", "app_name_suffixed", "yuzu Debug Release") 126 resValue("string", "app_name_suffixed", "yuzu Debug Release")
121 signingConfig = signingConfigs.getByName("debug") 127 signingConfig = signingConfigs.getByName("default")
122 isMinifyEnabled = true 128 isMinifyEnabled = true
123 isDebuggable = true 129 isDebuggable = true
124 proguardFiles( 130 proguardFiles(
@@ -133,6 +139,7 @@ android {
133 // Signed by debug key disallowing distribution on Play Store. 139 // Signed by debug key disallowing distribution on Play Store.
134 // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. 140 // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
135 debug { 141 debug {
142 signingConfig = signingConfigs.getByName("default")
136 resValue("string", "app_name_suffixed", "yuzu Debug") 143 resValue("string", "app_name_suffixed", "yuzu Debug")
137 isDebuggable = true 144 isDebuggable = true
138 isJniDebuggable = true 145 isJniDebuggable = true
diff --git a/src/android/app/debug.keystore b/src/android/app/debug.keystore
new file mode 100644
index 000000000..e4e194af9
--- /dev/null
+++ b/src/android/app/debug.keystore
Binary files differ
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt
index b7556e353..c408485c6 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt
@@ -21,6 +21,9 @@ import org.yuzu.yuzu_emu.utils.DocumentsTree
21import org.yuzu.yuzu_emu.utils.FileUtil 21import org.yuzu.yuzu_emu.utils.FileUtil
22import org.yuzu.yuzu_emu.utils.Log 22import org.yuzu.yuzu_emu.utils.Log
23import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable 23import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable
24import org.yuzu.yuzu_emu.model.InstallResult
25import org.yuzu.yuzu_emu.model.Patch
26import org.yuzu.yuzu_emu.model.GameVerificationResult
24 27
25/** 28/**
26 * Class which contains methods that interact 29 * Class which contains methods that interact
@@ -235,9 +238,12 @@ object NativeLibrary {
235 /** 238 /**
236 * Installs a nsp or xci file to nand 239 * Installs a nsp or xci file to nand
237 * @param filename String representation of file uri 240 * @param filename String representation of file uri
238 * @param extension Lowercase string representation of file extension without "." 241 * @return int representation of [InstallResult]
239 */ 242 */
240 external fun installFileToNand(filename: String, extension: String): Int 243 external fun installFileToNand(
244 filename: String,
245 callback: (max: Long, progress: Long) -> Boolean
246 ): Int
241 247
242 external fun doesUpdateMatchProgram(programId: String, updatePath: String): Boolean 248 external fun doesUpdateMatchProgram(programId: String, updatePath: String): Boolean
243 249
@@ -535,9 +541,49 @@ object NativeLibrary {
535 * 541 *
536 * @param path Path to game file. Can be a [Uri]. 542 * @param path Path to game file. Can be a [Uri].
537 * @param programId String representation of a game's program ID 543 * @param programId String representation of a game's program ID
538 * @return Array of pairs where the first value is the name of an addon and the second is the version 544 * @return Array of available patches
539 */ 545 */
540 external fun getAddonsForFile(path: String, programId: String): Array<Pair<String, String>>? 546 external fun getPatchesForFile(path: String, programId: String): Array<Patch>?
547
548 /**
549 * Removes an update for a given [programId]
550 * @param programId String representation of a game's program ID
551 */
552 external fun removeUpdate(programId: String)
553
554 /**
555 * Removes all DLC for a [programId]
556 * @param programId String representation of a game's program ID
557 */
558 external fun removeDLC(programId: String)
559
560 /**
561 * Removes a mod installed for a given [programId]
562 * @param programId String representation of a game's program ID
563 * @param name The name of a mod as given by [getPatchesForFile]. This corresponds with the name
564 * of the mod's directory in a game's load folder.
565 */
566 external fun removeMod(programId: String, name: String)
567
568 /**
569 * Verifies all installed content
570 * @param callback UI callback for verification progress. Return true in the callback to cancel.
571 * @return Array of content that failed verification. Successful if empty.
572 */
573 external fun verifyInstalledContents(
574 callback: (max: Long, progress: Long) -> Boolean
575 ): Array<String>
576
577 /**
578 * Verifies the contents of a game
579 * @param path String path to a game
580 * @param callback UI callback for verification progress. Return true in the callback to cancel.
581 * @return Int that is meant to be converted to a [GameVerificationResult]
582 */
583 external fun verifyGameContents(
584 path: String,
585 callback: (max: Long, progress: Long) -> Boolean
586 ): Int
541 587
542 /** 588 /**
543 * Gets the save location for a specific game 589 * Gets the save location for a specific game
@@ -609,15 +655,4 @@ object NativeLibrary {
609 const val RELEASED = 0 655 const val RELEASED = 0
610 const val PRESSED = 1 656 const val PRESSED = 1
611 } 657 }
612
613 /**
614 * Result from installFileToNand
615 */
616 object InstallFileToNandResult {
617 const val Success = 0
618 const val SuccessFileOverwritten = 1
619 const val Error = 2
620 const val ErrorBaseGame = 3
621 const val ErrorFilenameExtension = 4
622 }
623} 658}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt
index 94c151325..ff254d9b7 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt
@@ -6,27 +6,32 @@ package org.yuzu.yuzu_emu.adapters
6import android.view.LayoutInflater 6import android.view.LayoutInflater
7import android.view.ViewGroup 7import android.view.ViewGroup
8import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding 8import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding
9import org.yuzu.yuzu_emu.model.Addon 9import org.yuzu.yuzu_emu.model.Patch
10import org.yuzu.yuzu_emu.model.AddonViewModel
10import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 11import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
11 12
12class AddonAdapter : AbstractDiffAdapter<Addon, AddonAdapter.AddonViewHolder>() { 13class AddonAdapter(val addonViewModel: AddonViewModel) :
14 AbstractDiffAdapter<Patch, AddonAdapter.AddonViewHolder>() {
13 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddonViewHolder { 15 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddonViewHolder {
14 ListItemAddonBinding.inflate(LayoutInflater.from(parent.context), parent, false) 16 ListItemAddonBinding.inflate(LayoutInflater.from(parent.context), parent, false)
15 .also { return AddonViewHolder(it) } 17 .also { return AddonViewHolder(it) }
16 } 18 }
17 19
18 inner class AddonViewHolder(val binding: ListItemAddonBinding) : 20 inner class AddonViewHolder(val binding: ListItemAddonBinding) :
19 AbstractViewHolder<Addon>(binding) { 21 AbstractViewHolder<Patch>(binding) {
20 override fun bind(model: Addon) { 22 override fun bind(model: Patch) {
21 binding.root.setOnClickListener { 23 binding.root.setOnClickListener {
22 binding.addonSwitch.isChecked = !binding.addonSwitch.isChecked 24 binding.addonCheckbox.isChecked = !binding.addonCheckbox.isChecked
23 } 25 }
24 binding.title.text = model.title 26 binding.title.text = model.name
25 binding.version.text = model.version 27 binding.version.text = model.version
26 binding.addonSwitch.setOnCheckedChangeListener { _, checked -> 28 binding.addonCheckbox.setOnCheckedChangeListener { _, checked ->
27 model.enabled = checked 29 model.enabled = checked
28 } 30 }
29 binding.addonSwitch.isChecked = model.enabled 31 binding.addonCheckbox.isChecked = model.enabled
32 binding.buttonDelete.setOnClickListener {
33 addonViewModel.setAddonToDelete(model)
34 }
30 } 35 }
31 } 36 }
32} 37}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
index e26c2e0ab..b4f4d950f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
@@ -3,9 +3,6 @@
3 3
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.content.Intent
7import android.graphics.Bitmap
8import android.graphics.drawable.LayerDrawable
9import android.net.Uri 6import android.net.Uri
10import android.text.TextUtils 7import android.text.TextUtils
11import android.view.LayoutInflater 8import android.view.LayoutInflater
@@ -15,10 +12,6 @@ import android.widget.Toast
15import androidx.appcompat.app.AppCompatActivity 12import androidx.appcompat.app.AppCompatActivity
16import androidx.core.content.pm.ShortcutInfoCompat 13import androidx.core.content.pm.ShortcutInfoCompat
17import androidx.core.content.pm.ShortcutManagerCompat 14import androidx.core.content.pm.ShortcutManagerCompat
18import androidx.core.content.res.ResourcesCompat
19import androidx.core.graphics.drawable.IconCompat
20import androidx.core.graphics.drawable.toBitmap
21import androidx.core.graphics.drawable.toDrawable
22import androidx.documentfile.provider.DocumentFile 15import androidx.documentfile.provider.DocumentFile
23import androidx.lifecycle.ViewModelProvider 16import androidx.lifecycle.ViewModelProvider
24import androidx.lifecycle.lifecycleScope 17import androidx.lifecycle.lifecycleScope
@@ -30,7 +23,6 @@ import kotlinx.coroutines.withContext
30import org.yuzu.yuzu_emu.HomeNavigationDirections 23import org.yuzu.yuzu_emu.HomeNavigationDirections
31import org.yuzu.yuzu_emu.R 24import org.yuzu.yuzu_emu.R
32import org.yuzu.yuzu_emu.YuzuApplication 25import org.yuzu.yuzu_emu.YuzuApplication
33import org.yuzu.yuzu_emu.activities.EmulationActivity
34import org.yuzu.yuzu_emu.databinding.CardGameBinding 26import org.yuzu.yuzu_emu.databinding.CardGameBinding
35import org.yuzu.yuzu_emu.model.Game 27import org.yuzu.yuzu_emu.model.Game
36import org.yuzu.yuzu_emu.model.GamesViewModel 28import org.yuzu.yuzu_emu.model.GamesViewModel
@@ -89,36 +81,13 @@ class GameAdapter(private val activity: AppCompatActivity) :
89 ) 81 )
90 .apply() 82 .apply()
91 83
92 val openIntent =
93 Intent(YuzuApplication.appContext, EmulationActivity::class.java).apply {
94 action = Intent.ACTION_VIEW
95 data = Uri.parse(game.path)
96 }
97
98 activity.lifecycleScope.launch { 84 activity.lifecycleScope.launch {
99 withContext(Dispatchers.IO) { 85 withContext(Dispatchers.IO) {
100 val layerDrawable = ResourcesCompat.getDrawable(
101 YuzuApplication.appContext.resources,
102 R.drawable.shortcut,
103 null
104 ) as LayerDrawable
105 layerDrawable.setDrawableByLayerId(
106 R.id.shortcut_foreground,
107 GameIconUtils.getGameIcon(activity, game)
108 .toDrawable(YuzuApplication.appContext.resources)
109 )
110 val inset = YuzuApplication.appContext.resources
111 .getDimensionPixelSize(R.dimen.icon_inset)
112 layerDrawable.setLayerInset(1, inset, inset, inset, inset)
113 val shortcut = 86 val shortcut =
114 ShortcutInfoCompat.Builder(YuzuApplication.appContext, game.path) 87 ShortcutInfoCompat.Builder(YuzuApplication.appContext, game.path)
115 .setShortLabel(game.title) 88 .setShortLabel(game.title)
116 .setIcon( 89 .setIcon(GameIconUtils.getShortcutIcon(activity, game))
117 IconCompat.createWithAdaptiveBitmap( 90 .setIntent(game.launchIntent)
118 layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
119 )
120 )
121 .setIntent(openIntent)
122 .build() 91 .build()
123 ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut) 92 ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut)
124 } 93 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
index 16fb87614..71be2d0b2 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
@@ -23,7 +23,8 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
23 THEME("theme"), 23 THEME("theme"),
24 THEME_MODE("theme_mode"), 24 THEME_MODE("theme_mode"),
25 OVERLAY_SCALE("control_scale"), 25 OVERLAY_SCALE("control_scale"),
26 OVERLAY_OPACITY("control_opacity"); 26 OVERLAY_OPACITY("control_opacity"),
27 LOCK_DRAWER("lock_drawer");
27 28
28 override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal) 29 override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
29 30
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt
index 816336820..adb65812c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt
@@ -74,7 +74,7 @@ class AddonsFragment : Fragment() {
74 74
75 binding.listAddons.apply { 75 binding.listAddons.apply {
76 layoutManager = LinearLayoutManager(requireContext()) 76 layoutManager = LinearLayoutManager(requireContext())
77 adapter = AddonAdapter() 77 adapter = AddonAdapter(addonViewModel)
78 } 78 }
79 79
80 viewLifecycleOwner.lifecycleScope.apply { 80 viewLifecycleOwner.lifecycleScope.apply {
@@ -110,6 +110,21 @@ class AddonsFragment : Fragment() {
110 } 110 }
111 } 111 }
112 } 112 }
113 launch {
114 repeatOnLifecycle(Lifecycle.State.STARTED) {
115 addonViewModel.addonToDelete.collect {
116 if (it != null) {
117 MessageDialogFragment.newInstance(
118 requireActivity(),
119 titleId = R.string.confirm_uninstall,
120 descriptionId = R.string.confirm_uninstall_description,
121 positiveAction = { addonViewModel.onDeleteAddon(it) }
122 ).show(parentFragmentManager, MessageDialogFragment.TAG)
123 addonViewModel.setAddonToDelete(null)
124 }
125 }
126 }
127 }
113 } 128 }
114 129
115 binding.buttonInstall.setOnClickListener { 130 binding.buttonInstall.setOnClickListener {
@@ -156,22 +171,22 @@ class AddonsFragment : Fragment() {
156 descriptionId = R.string.invalid_directory_description 171 descriptionId = R.string.invalid_directory_description
157 ) 172 )
158 if (isValid) { 173 if (isValid) {
159 IndeterminateProgressDialogFragment.newInstance( 174 ProgressDialogFragment.newInstance(
160 requireActivity(), 175 requireActivity(),
161 R.string.installing_game_content, 176 R.string.installing_game_content,
162 false 177 false
163 ) { 178 ) { progressCallback, _ ->
164 val parentDirectoryName = externalAddonDirectory.name 179 val parentDirectoryName = externalAddonDirectory.name
165 val internalAddonDirectory = 180 val internalAddonDirectory =
166 File(args.game.addonDir + parentDirectoryName) 181 File(args.game.addonDir + parentDirectoryName)
167 try { 182 try {
168 externalAddonDirectory.copyFilesTo(internalAddonDirectory) 183 externalAddonDirectory.copyFilesTo(internalAddonDirectory, progressCallback)
169 } catch (_: Exception) { 184 } catch (_: Exception) {
170 return@newInstance errorMessage 185 return@newInstance errorMessage
171 } 186 }
172 addonViewModel.refreshAddons() 187 addonViewModel.refreshAddons()
173 return@newInstance getString(R.string.addon_installed_successfully) 188 return@newInstance getString(R.string.addon_installed_successfully)
174 }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG) 189 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
175 } else { 190 } else {
176 errorMessage.show(parentFragmentManager, MessageDialogFragment.TAG) 191 errorMessage.show(parentFragmentManager, MessageDialogFragment.TAG)
177 } 192 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
index 9dabb9c41..bf017cd7c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
@@ -75,7 +75,7 @@ class DriverManagerFragment : Fragment() {
75 driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global) 75 driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global)
76 binding.toolbarDrivers.setOnMenuItemClickListener { 76 binding.toolbarDrivers.setOnMenuItemClickListener {
77 when (it.itemId) { 77 when (it.itemId) {
78 R.id.menu_driver_clear -> { 78 R.id.menu_driver_use_global -> {
79 StringSetting.DRIVER_PATH.global = true 79 StringSetting.DRIVER_PATH.global = true
80 driverViewModel.updateDriverList() 80 driverViewModel.updateDriverList()
81 (binding.listDrivers.adapter as DriverAdapter) 81 (binding.listDrivers.adapter as DriverAdapter)
@@ -93,7 +93,7 @@ class DriverManagerFragment : Fragment() {
93 repeatOnLifecycle(Lifecycle.State.STARTED) { 93 repeatOnLifecycle(Lifecycle.State.STARTED) {
94 driverViewModel.showClearButton.collect { 94 driverViewModel.showClearButton.collect {
95 binding.toolbarDrivers.menu 95 binding.toolbarDrivers.menu
96 .findItem(R.id.menu_driver_clear).isVisible = it 96 .findItem(R.id.menu_driver_use_global).isVisible = it
97 } 97 }
98 } 98 }
99 } 99 }
@@ -173,11 +173,11 @@ class DriverManagerFragment : Fragment() {
173 return@registerForActivityResult 173 return@registerForActivityResult
174 } 174 }
175 175
176 IndeterminateProgressDialogFragment.newInstance( 176 ProgressDialogFragment.newInstance(
177 requireActivity(), 177 requireActivity(),
178 R.string.installing_driver, 178 R.string.installing_driver,
179 false 179 false
180 ) { 180 ) { _, _ ->
181 val driverPath = 181 val driverPath =
182 "${GpuDriverHelper.driverStoragePath}${FileUtil.getFilename(result)}" 182 "${GpuDriverHelper.driverStoragePath}${FileUtil.getFilename(result)}"
183 val driverFile = File(driverPath) 183 val driverFile = File(driverPath)
@@ -213,6 +213,6 @@ class DriverManagerFragment : Fragment() {
213 } 213 }
214 } 214 }
215 return@newInstance Any() 215 return@newInstance Any()
216 }.show(childFragmentManager, IndeterminateProgressDialogFragment.TAG) 216 }.show(childFragmentManager, ProgressDialogFragment.TAG)
217 } 217 }
218} 218}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
index 47767454a..2a97ae14d 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
@@ -182,11 +182,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
182 } 182 }
183 183
184 override fun onDrawerOpened(drawerView: View) { 184 override fun onDrawerOpened(drawerView: View) {
185 // No op 185 binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
186 } 186 }
187 187
188 override fun onDrawerClosed(drawerView: View) { 188 override fun onDrawerClosed(drawerView: View) {
189 // No op 189 binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt())
190 } 190 }
191 191
192 override fun onDrawerStateChanged(newState: Int) { 192 override fun onDrawerStateChanged(newState: Int) {
@@ -196,6 +196,28 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
196 binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) 196 binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
197 binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text = 197 binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text =
198 game.title 198 game.title
199
200 binding.inGameMenu.menu.findItem(R.id.menu_lock_drawer).apply {
201 val lockMode = IntSetting.LOCK_DRAWER.getInt()
202 val titleId = if (lockMode == DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
203 R.string.unlock_drawer
204 } else {
205 R.string.lock_drawer
206 }
207 val iconId = if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED) {
208 R.drawable.ic_unlock
209 } else {
210 R.drawable.ic_lock
211 }
212
213 title = getString(titleId)
214 icon = ResourcesCompat.getDrawable(
215 resources,
216 iconId,
217 requireContext().theme
218 )
219 }
220
199 binding.inGameMenu.setNavigationItemSelectedListener { 221 binding.inGameMenu.setNavigationItemSelectedListener {
200 when (it.itemId) { 222 when (it.itemId) {
201 R.id.menu_pause_emulation -> { 223 R.id.menu_pause_emulation -> {
@@ -242,6 +264,32 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
242 true 264 true
243 } 265 }
244 266
267 R.id.menu_lock_drawer -> {
268 when (IntSetting.LOCK_DRAWER.getInt()) {
269 DrawerLayout.LOCK_MODE_UNLOCKED -> {
270 IntSetting.LOCK_DRAWER.setInt(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
271 it.title = resources.getString(R.string.unlock_drawer)
272 it.icon = ResourcesCompat.getDrawable(
273 resources,
274 R.drawable.ic_lock,
275 requireContext().theme
276 )
277 }
278
279 DrawerLayout.LOCK_MODE_LOCKED_CLOSED -> {
280 IntSetting.LOCK_DRAWER.setInt(DrawerLayout.LOCK_MODE_UNLOCKED)
281 it.title = resources.getString(R.string.lock_drawer)
282 it.icon = ResourcesCompat.getDrawable(
283 resources,
284 R.drawable.ic_unlock,
285 requireContext().theme
286 )
287 }
288 }
289 NativeConfig.saveGlobalConfig()
290 true
291 }
292
245 R.id.menu_exit -> { 293 R.id.menu_exit -> {
246 emulationState.stop() 294 emulationState.stop()
247 emulationViewModel.setIsEmulationStopping(true) 295 emulationViewModel.setIsEmulationStopping(true)
@@ -326,7 +374,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
326 repeatOnLifecycle(Lifecycle.State.CREATED) { 374 repeatOnLifecycle(Lifecycle.State.CREATED) {
327 emulationViewModel.emulationStarted.collectLatest { 375 emulationViewModel.emulationStarted.collectLatest {
328 if (it) { 376 if (it) {
329 binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) 377 binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt())
330 ViewUtils.showView(binding.surfaceInputOverlay) 378 ViewUtils.showView(binding.surfaceInputOverlay)
331 ViewUtils.hideView(binding.loadingIndicator) 379 ViewUtils.hideView(binding.loadingIndicator)
332 380
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
index fa2a4c9f9..5aa3f453f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
@@ -21,8 +21,10 @@ import androidx.fragment.app.activityViewModels
21import androidx.navigation.findNavController 21import androidx.navigation.findNavController
22import androidx.navigation.fragment.navArgs 22import androidx.navigation.fragment.navArgs
23import com.google.android.material.transition.MaterialSharedAxis 23import com.google.android.material.transition.MaterialSharedAxis
24import org.yuzu.yuzu_emu.NativeLibrary
24import org.yuzu.yuzu_emu.R 25import org.yuzu.yuzu_emu.R
25import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding 26import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
27import org.yuzu.yuzu_emu.model.GameVerificationResult
26import org.yuzu.yuzu_emu.model.HomeViewModel 28import org.yuzu.yuzu_emu.model.HomeViewModel
27import org.yuzu.yuzu_emu.utils.GameMetadata 29import org.yuzu.yuzu_emu.utils.GameMetadata
28 30
@@ -101,6 +103,38 @@ class GameInfoFragment : Fragment() {
101 """.trimIndent() 103 """.trimIndent()
102 copyToClipboard(args.game.title, details) 104 copyToClipboard(args.game.title, details)
103 } 105 }
106
107 buttonVerifyIntegrity.setOnClickListener {
108 ProgressDialogFragment.newInstance(
109 requireActivity(),
110 R.string.verifying,
111 true
112 ) { progressCallback, _ ->
113 val result = GameVerificationResult.from(
114 NativeLibrary.verifyGameContents(
115 args.game.path,
116 progressCallback
117 )
118 )
119 return@newInstance when (result) {
120 GameVerificationResult.Success ->
121 MessageDialogFragment.newInstance(
122 titleId = R.string.verify_success,
123 descriptionId = R.string.operation_completed_successfully
124 )
125 GameVerificationResult.Failed ->
126 MessageDialogFragment.newInstance(
127 titleId = R.string.verify_failure,
128 descriptionId = R.string.verify_failure_description
129 )
130 GameVerificationResult.NotImplemented ->
131 MessageDialogFragment.newInstance(
132 titleId = R.string.verify_no_result,
133 descriptionId = R.string.verify_no_result_description
134 )
135 }
136 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
137 }
104 } 138 }
105 139
106 setInsets() 140 setInsets()
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
index b04d1208f..582df0133 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
@@ -4,6 +4,8 @@
4package org.yuzu.yuzu_emu.fragments 4package org.yuzu.yuzu_emu.fragments
5 5
6import android.annotation.SuppressLint 6import android.annotation.SuppressLint
7import android.content.pm.ShortcutInfo
8import android.content.pm.ShortcutManager
7import android.os.Bundle 9import android.os.Bundle
8import android.text.TextUtils 10import android.text.TextUtils
9import android.view.LayoutInflater 11import android.view.LayoutInflater
@@ -44,7 +46,6 @@ import org.yuzu.yuzu_emu.utils.FileUtil
44import org.yuzu.yuzu_emu.utils.GameIconUtils 46import org.yuzu.yuzu_emu.utils.GameIconUtils
45import org.yuzu.yuzu_emu.utils.GpuDriverHelper 47import org.yuzu.yuzu_emu.utils.GpuDriverHelper
46import org.yuzu.yuzu_emu.utils.MemoryUtil 48import org.yuzu.yuzu_emu.utils.MemoryUtil
47import java.io.BufferedInputStream
48import java.io.BufferedOutputStream 49import java.io.BufferedOutputStream
49import java.io.File 50import java.io.File
50 51
@@ -85,6 +86,24 @@ class GamePropertiesFragment : Fragment() {
85 view.findNavController().popBackStack() 86 view.findNavController().popBackStack()
86 } 87 }
87 88
89 val shortcutManager = requireActivity().getSystemService(ShortcutManager::class.java)
90 binding.buttonShortcut.isEnabled = shortcutManager.isRequestPinShortcutSupported
91 binding.buttonShortcut.setOnClickListener {
92 viewLifecycleOwner.lifecycleScope.launch {
93 withContext(Dispatchers.IO) {
94 val shortcut = ShortcutInfo.Builder(requireContext(), args.game.title)
95 .setShortLabel(args.game.title)
96 .setIcon(
97 GameIconUtils.getShortcutIcon(requireActivity(), args.game)
98 .toIcon(requireContext())
99 )
100 .setIntent(args.game.launchIntent)
101 .build()
102 shortcutManager.requestPinShortcut(shortcut, null)
103 }
104 }
105 }
106
88 GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen) 107 GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen)
89 binding.title.text = args.game.title 108 binding.title.text = args.game.title
90 binding.title.postDelayed( 109 binding.title.postDelayed(
@@ -357,27 +376,17 @@ class GamePropertiesFragment : Fragment() {
357 return@registerForActivityResult 376 return@registerForActivityResult
358 } 377 }
359 378
360 val inputZip = requireContext().contentResolver.openInputStream(result)
361 val savesFolder = File(args.game.saveDir) 379 val savesFolder = File(args.game.saveDir)
362 val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/") 380 val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/")
363 cacheSaveDir.mkdir() 381 cacheSaveDir.mkdir()
364 382
365 if (inputZip == null) { 383 ProgressDialogFragment.newInstance(
366 Toast.makeText(
367 YuzuApplication.appContext,
368 getString(R.string.fatal_error),
369 Toast.LENGTH_LONG
370 ).show()
371 return@registerForActivityResult
372 }
373
374 IndeterminateProgressDialogFragment.newInstance(
375 requireActivity(), 384 requireActivity(),
376 R.string.save_files_importing, 385 R.string.save_files_importing,
377 false 386 false
378 ) { 387 ) { _, _ ->
379 try { 388 try {
380 FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheSaveDir) 389 FileUtil.unzipToInternalStorage(result.toString(), cacheSaveDir)
381 val files = cacheSaveDir.listFiles() 390 val files = cacheSaveDir.listFiles()
382 var savesFolderFile: File? = null 391 var savesFolderFile: File? = null
383 if (files != null) { 392 if (files != null) {
@@ -422,7 +431,7 @@ class GamePropertiesFragment : Fragment() {
422 Toast.LENGTH_LONG 431 Toast.LENGTH_LONG
423 ).show() 432 ).show()
424 } 433 }
425 }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG) 434 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
426 } 435 }
427 436
428 /** 437 /**
@@ -436,11 +445,11 @@ class GamePropertiesFragment : Fragment() {
436 return@registerForActivityResult 445 return@registerForActivityResult
437 } 446 }
438 447
439 IndeterminateProgressDialogFragment.newInstance( 448 ProgressDialogFragment.newInstance(
440 requireActivity(), 449 requireActivity(),
441 R.string.save_files_exporting, 450 R.string.save_files_exporting,
442 false 451 false
443 ) { 452 ) { _, _ ->
444 val saveLocation = args.game.saveDir 453 val saveLocation = args.game.saveDir
445 val zipResult = FileUtil.zipFromInternalStorage( 454 val zipResult = FileUtil.zipFromInternalStorage(
446 File(saveLocation), 455 File(saveLocation),
@@ -452,6 +461,6 @@ class GamePropertiesFragment : Fragment() {
452 TaskState.Completed -> getString(R.string.export_success) 461 TaskState.Completed -> getString(R.string.export_success)
453 TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed) 462 TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed)
454 } 463 }
455 }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG) 464 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
456 } 465 }
457} 466}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
index 6ddd758e6..aefae2938 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
@@ -32,6 +32,7 @@ import org.yuzu.yuzu_emu.BuildConfig
32import org.yuzu.yuzu_emu.HomeNavigationDirections 32import org.yuzu.yuzu_emu.HomeNavigationDirections
33import org.yuzu.yuzu_emu.NativeLibrary 33import org.yuzu.yuzu_emu.NativeLibrary
34import org.yuzu.yuzu_emu.R 34import org.yuzu.yuzu_emu.R
35import org.yuzu.yuzu_emu.YuzuApplication
35import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter 36import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter
36import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding 37import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding
37import org.yuzu.yuzu_emu.features.DocumentProvider 38import org.yuzu.yuzu_emu.features.DocumentProvider
@@ -142,6 +143,38 @@ class HomeSettingsFragment : Fragment() {
142 ) 143 )
143 add( 144 add(
144 HomeSetting( 145 HomeSetting(
146 R.string.verify_installed_content,
147 R.string.verify_installed_content_description,
148 R.drawable.ic_check_circle,
149 {
150 ProgressDialogFragment.newInstance(
151 requireActivity(),
152 titleId = R.string.verifying,
153 cancellable = true
154 ) { progressCallback, _ ->
155 val result = NativeLibrary.verifyInstalledContents(progressCallback)
156 return@newInstance if (result.isEmpty()) {
157 MessageDialogFragment.newInstance(
158 titleId = R.string.verify_success,
159 descriptionId = R.string.operation_completed_successfully
160 )
161 } else {
162 val failedNames = result.joinToString("\n")
163 val errorMessage = YuzuApplication.appContext.getString(
164 R.string.verification_failed_for,
165 failedNames
166 )
167 MessageDialogFragment.newInstance(
168 titleId = R.string.verify_failure,
169 descriptionString = errorMessage
170 )
171 }
172 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
173 }
174 )
175 )
176 add(
177 HomeSetting(
145 R.string.share_log, 178 R.string.share_log,
146 R.string.share_log_description, 179 R.string.share_log_description,
147 R.drawable.ic_log, 180 R.drawable.ic_log,
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt
index 5b4bf2c9f..7df8e6bf4 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt
@@ -34,7 +34,6 @@ import org.yuzu.yuzu_emu.model.TaskState
34import org.yuzu.yuzu_emu.ui.main.MainActivity 34import org.yuzu.yuzu_emu.ui.main.MainActivity
35import org.yuzu.yuzu_emu.utils.DirectoryInitialization 35import org.yuzu.yuzu_emu.utils.DirectoryInitialization
36import org.yuzu.yuzu_emu.utils.FileUtil 36import org.yuzu.yuzu_emu.utils.FileUtil
37import java.io.BufferedInputStream
38import java.io.BufferedOutputStream 37import java.io.BufferedOutputStream
39import java.io.File 38import java.io.File
40import java.math.BigInteger 39import java.math.BigInteger
@@ -195,26 +194,20 @@ class InstallableFragment : Fragment() {
195 return@registerForActivityResult 194 return@registerForActivityResult
196 } 195 }
197 196
198 val inputZip = requireContext().contentResolver.openInputStream(result)
199 val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/") 197 val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/")
200 cacheSaveDir.mkdir() 198 cacheSaveDir.mkdir()
201 199
202 if (inputZip == null) { 200 ProgressDialogFragment.newInstance(
203 Toast.makeText(
204 YuzuApplication.appContext,
205 getString(R.string.fatal_error),
206 Toast.LENGTH_LONG
207 ).show()
208 return@registerForActivityResult
209 }
210
211 IndeterminateProgressDialogFragment.newInstance(
212 requireActivity(), 201 requireActivity(),
213 R.string.save_files_importing, 202 R.string.save_files_importing,
214 false 203 false
215 ) { 204 ) { progressCallback, _ ->
216 try { 205 try {
217 FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheSaveDir) 206 FileUtil.unzipToInternalStorage(
207 result.toString(),
208 cacheSaveDir,
209 progressCallback
210 )
218 val files = cacheSaveDir.listFiles() 211 val files = cacheSaveDir.listFiles()
219 var successfulImports = 0 212 var successfulImports = 0
220 var failedImports = 0 213 var failedImports = 0
@@ -287,7 +280,7 @@ class InstallableFragment : Fragment() {
287 Toast.LENGTH_LONG 280 Toast.LENGTH_LONG
288 ).show() 281 ).show()
289 } 282 }
290 }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG) 283 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
291 } 284 }
292 285
293 private val exportSaves = registerForActivityResult( 286 private val exportSaves = registerForActivityResult(
@@ -297,11 +290,11 @@ class InstallableFragment : Fragment() {
297 return@registerForActivityResult 290 return@registerForActivityResult
298 } 291 }
299 292
300 IndeterminateProgressDialogFragment.newInstance( 293 ProgressDialogFragment.newInstance(
301 requireActivity(), 294 requireActivity(),
302 R.string.save_files_exporting, 295 R.string.save_files_exporting,
303 false 296 false
304 ) { 297 ) { _, _ ->
305 val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/") 298 val cacheSaveDir = File("${requireContext().cacheDir.path}/saves/")
306 cacheSaveDir.mkdir() 299 cacheSaveDir.mkdir()
307 300
@@ -338,6 +331,6 @@ class InstallableFragment : Fragment() {
338 TaskState.Completed -> getString(R.string.export_success) 331 TaskState.Completed -> getString(R.string.export_success)
339 TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed) 332 TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed)
340 } 333 }
341 }.show(parentFragmentManager, IndeterminateProgressDialogFragment.TAG) 334 }.show(parentFragmentManager, ProgressDialogFragment.TAG)
342 } 335 }
343} 336}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt
index 32062b6fe..620d8db7c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt
@@ -69,7 +69,7 @@ class MessageDialogFragment : DialogFragment() {
69 private const val HELP_LINK = "Link" 69 private const val HELP_LINK = "Link"
70 70
71 fun newInstance( 71 fun newInstance(
72 activity: FragmentActivity, 72 activity: FragmentActivity? = null,
73 titleId: Int = 0, 73 titleId: Int = 0,
74 titleString: String = "", 74 titleString: String = "",
75 descriptionId: Int = 0, 75 descriptionId: Int = 0,
@@ -86,9 +86,11 @@ class MessageDialogFragment : DialogFragment() {
86 putString(DESCRIPTION_STRING, descriptionString) 86 putString(DESCRIPTION_STRING, descriptionString)
87 putInt(HELP_LINK, helpLinkId) 87 putInt(HELP_LINK, helpLinkId)
88 } 88 }
89 ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply { 89 if (activity != null) {
90 clear() 90 ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply {
91 this.positiveAction = positiveAction 91 clear()
92 this.positiveAction = positiveAction
93 }
92 } 94 }
93 dialog.arguments = bundle 95 dialog.arguments = bundle
94 return dialog 96 return dialog
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt
index 8847e5531..d201cb80c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt
@@ -23,11 +23,13 @@ import org.yuzu.yuzu_emu.R
23import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding 23import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
24import org.yuzu.yuzu_emu.model.TaskViewModel 24import org.yuzu.yuzu_emu.model.TaskViewModel
25 25
26class IndeterminateProgressDialogFragment : DialogFragment() { 26class ProgressDialogFragment : DialogFragment() {
27 private val taskViewModel: TaskViewModel by activityViewModels() 27 private val taskViewModel: TaskViewModel by activityViewModels()
28 28
29 private lateinit var binding: DialogProgressBarBinding 29 private lateinit var binding: DialogProgressBarBinding
30 30
31 private val PROGRESS_BAR_RESOLUTION = 1000
32
31 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 33 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
32 val titleId = requireArguments().getInt(TITLE) 34 val titleId = requireArguments().getInt(TITLE)
33 val cancellable = requireArguments().getBoolean(CANCELLABLE) 35 val cancellable = requireArguments().getBoolean(CANCELLABLE)
@@ -61,6 +63,7 @@ class IndeterminateProgressDialogFragment : DialogFragment() {
61 63
62 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 64 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
63 super.onViewCreated(view, savedInstanceState) 65 super.onViewCreated(view, savedInstanceState)
66 binding.message.isSelected = true
64 viewLifecycleOwner.lifecycleScope.apply { 67 viewLifecycleOwner.lifecycleScope.apply {
65 launch { 68 launch {
66 repeatOnLifecycle(Lifecycle.State.CREATED) { 69 repeatOnLifecycle(Lifecycle.State.CREATED) {
@@ -97,6 +100,35 @@ class IndeterminateProgressDialogFragment : DialogFragment() {
97 } 100 }
98 } 101 }
99 } 102 }
103 launch {
104 repeatOnLifecycle(Lifecycle.State.CREATED) {
105 taskViewModel.progress.collect {
106 if (it != 0.0) {
107 binding.progressBar.apply {
108 isIndeterminate = false
109 progress = (
110 (it / taskViewModel.maxProgress.value) *
111 PROGRESS_BAR_RESOLUTION
112 ).toInt()
113 min = 0
114 max = PROGRESS_BAR_RESOLUTION
115 }
116 }
117 }
118 }
119 }
120 launch {
121 repeatOnLifecycle(Lifecycle.State.CREATED) {
122 taskViewModel.message.collect {
123 if (it.isEmpty()) {
124 binding.message.visibility = View.GONE
125 } else {
126 binding.message.visibility = View.VISIBLE
127 binding.message.text = it
128 }
129 }
130 }
131 }
100 } 132 }
101 } 133 }
102 134
@@ -108,6 +140,7 @@ class IndeterminateProgressDialogFragment : DialogFragment() {
108 val negativeButton = alertDialog.getButton(Dialog.BUTTON_NEGATIVE) 140 val negativeButton = alertDialog.getButton(Dialog.BUTTON_NEGATIVE)
109 negativeButton.setOnClickListener { 141 negativeButton.setOnClickListener {
110 alertDialog.setTitle(getString(R.string.cancelling)) 142 alertDialog.setTitle(getString(R.string.cancelling))
143 binding.progressBar.isIndeterminate = true
111 taskViewModel.setCancelled(true) 144 taskViewModel.setCancelled(true)
112 } 145 }
113 } 146 }
@@ -122,9 +155,12 @@ class IndeterminateProgressDialogFragment : DialogFragment() {
122 activity: FragmentActivity, 155 activity: FragmentActivity,
123 titleId: Int, 156 titleId: Int,
124 cancellable: Boolean = false, 157 cancellable: Boolean = false,
125 task: suspend () -> Any 158 task: suspend (
126 ): IndeterminateProgressDialogFragment { 159 progressCallback: (max: Long, progress: Long) -> Boolean,
127 val dialog = IndeterminateProgressDialogFragment() 160 messageCallback: (message: String) -> Unit
161 ) -> Any
162 ): ProgressDialogFragment {
163 val dialog = ProgressDialogFragment()
128 val args = Bundle() 164 val args = Bundle()
129 ViewModelProvider(activity)[TaskViewModel::class.java].task = task 165 ViewModelProvider(activity)[TaskViewModel::class.java].task = task
130 args.putInt(TITLE, titleId) 166 args.putInt(TITLE, titleId)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt
index 64b295fbd..20b10b1a0 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt
@@ -136,14 +136,14 @@ class SearchFragment : Fragment() {
136 baseList.filter { 136 baseList.filter {
137 val lastPlayedTime = preferences.getLong(it.keyLastPlayedTime, 0L) 137 val lastPlayedTime = preferences.getLong(it.keyLastPlayedTime, 0L)
138 lastPlayedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000) 138 lastPlayedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000)
139 } 139 }.sortedByDescending { preferences.getLong(it.keyLastPlayedTime, 0L) }
140 } 140 }
141 141
142 R.id.chip_recently_added -> { 142 R.id.chip_recently_added -> {
143 baseList.filter { 143 baseList.filter {
144 val addedTime = preferences.getLong(it.keyAddedToLibraryTime, 0L) 144 val addedTime = preferences.getLong(it.keyAddedToLibraryTime, 0L)
145 addedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000) 145 addedTime > (System.currentTimeMillis() - 24 * 60 * 60 * 1000)
146 } 146 }.sortedByDescending { preferences.getLong(it.keyAddedToLibraryTime, 0L) }
147 } 147 }
148 148
149 R.id.chip_homebrew -> baseList.filter { it.isHomebrew } 149 R.id.chip_homebrew -> baseList.filter { it.isHomebrew }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Addon.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Addon.kt
deleted file mode 100644
index ed79a8b02..000000000
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Addon.kt
+++ /dev/null
@@ -1,10 +0,0 @@
1// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.model
5
6data class Addon(
7 var enabled: Boolean,
8 val title: String,
9 val version: String
10)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt
index 075252f5b..b9c8e49ca 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt
@@ -15,8 +15,8 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
15import java.util.concurrent.atomic.AtomicBoolean 15import java.util.concurrent.atomic.AtomicBoolean
16 16
17class AddonViewModel : ViewModel() { 17class AddonViewModel : ViewModel() {
18 private val _addonList = MutableStateFlow(mutableListOf<Addon>()) 18 private val _patchList = MutableStateFlow(mutableListOf<Patch>())
19 val addonList get() = _addonList.asStateFlow() 19 val addonList get() = _patchList.asStateFlow()
20 20
21 private val _showModInstallPicker = MutableStateFlow(false) 21 private val _showModInstallPicker = MutableStateFlow(false)
22 val showModInstallPicker get() = _showModInstallPicker.asStateFlow() 22 val showModInstallPicker get() = _showModInstallPicker.asStateFlow()
@@ -24,6 +24,9 @@ class AddonViewModel : ViewModel() {
24 private val _showModNoticeDialog = MutableStateFlow(false) 24 private val _showModNoticeDialog = MutableStateFlow(false)
25 val showModNoticeDialog get() = _showModNoticeDialog.asStateFlow() 25 val showModNoticeDialog get() = _showModNoticeDialog.asStateFlow()
26 26
27 private val _addonToDelete = MutableStateFlow<Patch?>(null)
28 val addonToDelete = _addonToDelete.asStateFlow()
29
27 var game: Game? = null 30 var game: Game? = null
28 31
29 private val isRefreshing = AtomicBoolean(false) 32 private val isRefreshing = AtomicBoolean(false)
@@ -40,36 +43,47 @@ class AddonViewModel : ViewModel() {
40 isRefreshing.set(true) 43 isRefreshing.set(true)
41 viewModelScope.launch { 44 viewModelScope.launch {
42 withContext(Dispatchers.IO) { 45 withContext(Dispatchers.IO) {
43 val addonList = mutableListOf<Addon>() 46 val patchList = (
44 val disabledAddons = NativeConfig.getDisabledAddons(game!!.programId) 47 NativeLibrary.getPatchesForFile(game!!.path, game!!.programId)
45 NativeLibrary.getAddonsForFile(game!!.path, game!!.programId)?.forEach { 48 ?: emptyArray()
46 val name = it.first.replace("[D] ", "") 49 ).toMutableList()
47 addonList.add(Addon(!disabledAddons.contains(name), name, it.second)) 50 patchList.sortBy { it.name }
48 } 51 _patchList.value = patchList
49 addonList.sortBy { it.title }
50 _addonList.value = addonList
51 isRefreshing.set(false) 52 isRefreshing.set(false)
52 } 53 }
53 } 54 }
54 } 55 }
55 56
57 fun setAddonToDelete(patch: Patch?) {
58 _addonToDelete.value = patch
59 }
60
61 fun onDeleteAddon(patch: Patch) {
62 when (PatchType.from(patch.type)) {
63 PatchType.Update -> NativeLibrary.removeUpdate(patch.programId)
64 PatchType.DLC -> NativeLibrary.removeDLC(patch.programId)
65 PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name)
66 }
67 refreshAddons()
68 }
69
56 fun onCloseAddons() { 70 fun onCloseAddons() {
57 if (_addonList.value.isEmpty()) { 71 if (_patchList.value.isEmpty()) {
58 return 72 return
59 } 73 }
60 74
61 NativeConfig.setDisabledAddons( 75 NativeConfig.setDisabledAddons(
62 game!!.programId, 76 game!!.programId,
63 _addonList.value.mapNotNull { 77 _patchList.value.mapNotNull {
64 if (it.enabled) { 78 if (it.enabled) {
65 null 79 null
66 } else { 80 } else {
67 it.title 81 it.name
68 } 82 }
69 }.toTypedArray() 83 }.toTypedArray()
70 ) 84 )
71 NativeConfig.saveGlobalConfig() 85 NativeConfig.saveGlobalConfig()
72 _addonList.value.clear() 86 _patchList.value.clear()
73 game = null 87 game = null
74 } 88 }
75 89
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt
index f1ea1e20f..c8a4a2d17 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt
@@ -3,6 +3,7 @@
3 3
4package org.yuzu.yuzu_emu.model 4package org.yuzu.yuzu_emu.model
5 5
6import android.content.Intent
6import android.net.Uri 7import android.net.Uri
7import android.os.Parcelable 8import android.os.Parcelable
8import java.util.HashSet 9import java.util.HashSet
@@ -11,6 +12,7 @@ import kotlinx.serialization.Serializable
11import org.yuzu.yuzu_emu.NativeLibrary 12import org.yuzu.yuzu_emu.NativeLibrary
12import org.yuzu.yuzu_emu.R 13import org.yuzu.yuzu_emu.R
13import org.yuzu.yuzu_emu.YuzuApplication 14import org.yuzu.yuzu_emu.YuzuApplication
15import org.yuzu.yuzu_emu.activities.EmulationActivity
14import org.yuzu.yuzu_emu.utils.DirectoryInitialization 16import org.yuzu.yuzu_emu.utils.DirectoryInitialization
15import org.yuzu.yuzu_emu.utils.FileUtil 17import org.yuzu.yuzu_emu.utils.FileUtil
16import java.time.LocalDateTime 18import java.time.LocalDateTime
@@ -61,6 +63,12 @@ class Game(
61 val addonDir: String 63 val addonDir: String
62 get() = DirectoryInitialization.userDirectory + "/load/" + programIdHex + "/" 64 get() = DirectoryInitialization.userDirectory + "/load/" + programIdHex + "/"
63 65
66 val launchIntent: Intent
67 get() = Intent(YuzuApplication.appContext, EmulationActivity::class.java).apply {
68 action = Intent.ACTION_VIEW
69 data = Uri.parse(path)
70 }
71
64 override fun equals(other: Any?): Boolean { 72 override fun equals(other: Any?): Boolean {
65 if (other !is Game) { 73 if (other !is Game) {
66 return false 74 return false
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameVerificationResult.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameVerificationResult.kt
new file mode 100644
index 000000000..804637fb8
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameVerificationResult.kt
@@ -0,0 +1,15 @@
1// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.model
5
6enum class GameVerificationResult(val int: Int) {
7 Success(0),
8 Failed(1),
9 NotImplemented(2);
10
11 companion object {
12 fun from(int: Int): GameVerificationResult =
13 entries.firstOrNull { it.int == int } ?: Success
14 }
15}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/InstallResult.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/InstallResult.kt
new file mode 100644
index 000000000..0c3cd0521
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/InstallResult.kt
@@ -0,0 +1,15 @@
1// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.model
5
6enum class InstallResult(val int: Int) {
7 Success(0),
8 Overwrite(1),
9 Failure(2),
10 BaseInstallAttempted(3);
11
12 companion object {
13 fun from(int: Int): InstallResult = entries.firstOrNull { it.int == int } ?: Success
14 }
15}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt
new file mode 100644
index 000000000..25cb9e365
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt
@@ -0,0 +1,16 @@
1// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.model
5
6import androidx.annotation.Keep
7
8@Keep
9data class Patch(
10 var enabled: Boolean,
11 val name: String,
12 val version: String,
13 val type: Int,
14 val programId: String,
15 val titleId: String
16)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt
new file mode 100644
index 000000000..e9a54162b
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt
@@ -0,0 +1,14 @@
1// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.model
5
6enum class PatchType(val int: Int) {
7 Update(0),
8 DLC(1),
9 Mod(2);
10
11 companion object {
12 fun from(int: Int): PatchType = entries.firstOrNull { it.int == int } ?: Update
13 }
14}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
index e59c95733..4361eb972 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
@@ -8,6 +8,7 @@ import androidx.lifecycle.viewModelScope
8import kotlinx.coroutines.Dispatchers 8import kotlinx.coroutines.Dispatchers
9import kotlinx.coroutines.flow.MutableStateFlow 9import kotlinx.coroutines.flow.MutableStateFlow
10import kotlinx.coroutines.flow.StateFlow 10import kotlinx.coroutines.flow.StateFlow
11import kotlinx.coroutines.flow.asStateFlow
11import kotlinx.coroutines.launch 12import kotlinx.coroutines.launch
12 13
13class TaskViewModel : ViewModel() { 14class TaskViewModel : ViewModel() {
@@ -23,13 +24,28 @@ class TaskViewModel : ViewModel() {
23 val cancelled: StateFlow<Boolean> get() = _cancelled 24 val cancelled: StateFlow<Boolean> get() = _cancelled
24 private val _cancelled = MutableStateFlow(false) 25 private val _cancelled = MutableStateFlow(false)
25 26
26 lateinit var task: suspend () -> Any 27 private val _progress = MutableStateFlow(0.0)
28 val progress = _progress.asStateFlow()
29
30 private val _maxProgress = MutableStateFlow(0.0)
31 val maxProgress = _maxProgress.asStateFlow()
32
33 private val _message = MutableStateFlow("")
34 val message = _message.asStateFlow()
35
36 lateinit var task: suspend (
37 progressCallback: (max: Long, progress: Long) -> Boolean,
38 messageCallback: (message: String) -> Unit
39 ) -> Any
27 40
28 fun clear() { 41 fun clear() {
29 _result.value = Any() 42 _result.value = Any()
30 _isComplete.value = false 43 _isComplete.value = false
31 _isRunning.value = false 44 _isRunning.value = false
32 _cancelled.value = false 45 _cancelled.value = false
46 _progress.value = 0.0
47 _maxProgress.value = 0.0
48 _message.value = ""
33 } 49 }
34 50
35 fun setCancelled(value: Boolean) { 51 fun setCancelled(value: Boolean) {
@@ -43,7 +59,16 @@ class TaskViewModel : ViewModel() {
43 _isRunning.value = true 59 _isRunning.value = true
44 60
45 viewModelScope.launch(Dispatchers.IO) { 61 viewModelScope.launch(Dispatchers.IO) {
46 val res = task() 62 val res = task(
63 { max, progress ->
64 _maxProgress.value = max.toDouble()
65 _progress.value = progress.toDouble()
66 return@task cancelled.value
67 },
68 { message ->
69 _message.value = message
70 }
71 )
47 _result.value = res 72 _result.value = res
48 _isComplete.value = true 73 _isComplete.value = true
49 _isRunning.value = false 74 _isRunning.value = false
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
index 644289e25..c2cc29961 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
@@ -38,12 +38,13 @@ import org.yuzu.yuzu_emu.activities.EmulationActivity
38import org.yuzu.yuzu_emu.databinding.ActivityMainBinding 38import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
39import org.yuzu.yuzu_emu.features.settings.model.Settings 39import org.yuzu.yuzu_emu.features.settings.model.Settings
40import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment 40import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment
41import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment 41import org.yuzu.yuzu_emu.fragments.ProgressDialogFragment
42import org.yuzu.yuzu_emu.fragments.MessageDialogFragment 42import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
43import org.yuzu.yuzu_emu.model.AddonViewModel 43import org.yuzu.yuzu_emu.model.AddonViewModel
44import org.yuzu.yuzu_emu.model.DriverViewModel 44import org.yuzu.yuzu_emu.model.DriverViewModel
45import org.yuzu.yuzu_emu.model.GamesViewModel 45import org.yuzu.yuzu_emu.model.GamesViewModel
46import org.yuzu.yuzu_emu.model.HomeViewModel 46import org.yuzu.yuzu_emu.model.HomeViewModel
47import org.yuzu.yuzu_emu.model.InstallResult
47import org.yuzu.yuzu_emu.model.TaskState 48import org.yuzu.yuzu_emu.model.TaskState
48import org.yuzu.yuzu_emu.model.TaskViewModel 49import org.yuzu.yuzu_emu.model.TaskViewModel
49import org.yuzu.yuzu_emu.utils.* 50import org.yuzu.yuzu_emu.utils.*
@@ -369,26 +370,23 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
369 return@registerForActivityResult 370 return@registerForActivityResult
370 } 371 }
371 372
372 val inputZip = contentResolver.openInputStream(result)
373 if (inputZip == null) {
374 Toast.makeText(
375 applicationContext,
376 getString(R.string.fatal_error),
377 Toast.LENGTH_LONG
378 ).show()
379 return@registerForActivityResult
380 }
381
382 val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") } 373 val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") }
383 374
384 val firmwarePath = 375 val firmwarePath =
385 File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/") 376 File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/")
386 val cacheFirmwareDir = File("${cacheDir.path}/registered/") 377 val cacheFirmwareDir = File("${cacheDir.path}/registered/")
387 378
388 val task: () -> Any = { 379 ProgressDialogFragment.newInstance(
380 this,
381 R.string.firmware_installing
382 ) { progressCallback, _ ->
389 var messageToShow: Any 383 var messageToShow: Any
390 try { 384 try {
391 FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheFirmwareDir) 385 FileUtil.unzipToInternalStorage(
386 result.toString(),
387 cacheFirmwareDir,
388 progressCallback
389 )
392 val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 390 val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1
393 val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 391 val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2
394 messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) { 392 messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) {
@@ -404,18 +402,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
404 getString(R.string.save_file_imported_success) 402 getString(R.string.save_file_imported_success)
405 } 403 }
406 } catch (e: Exception) { 404 } catch (e: Exception) {
405 Log.error("[MainActivity] Firmware install failed - ${e.message}")
407 messageToShow = getString(R.string.fatal_error) 406 messageToShow = getString(R.string.fatal_error)
408 } finally { 407 } finally {
409 cacheFirmwareDir.deleteRecursively() 408 cacheFirmwareDir.deleteRecursively()
410 } 409 }
411 messageToShow 410 messageToShow
412 } 411 }.show(supportFragmentManager, ProgressDialogFragment.TAG)
413
414 IndeterminateProgressDialogFragment.newInstance(
415 this,
416 R.string.firmware_installing,
417 task = task
418 ).show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
419 } 412 }
420 413
421 val getAmiiboKey = 414 val getAmiiboKey =
@@ -474,11 +467,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
474 return@registerForActivityResult 467 return@registerForActivityResult
475 } 468 }
476 469
477 IndeterminateProgressDialogFragment.newInstance( 470 ProgressDialogFragment.newInstance(
478 this@MainActivity, 471 this@MainActivity,
479 R.string.verifying_content, 472 R.string.verifying_content,
480 false 473 false
481 ) { 474 ) { _, _ ->
482 var updatesMatchProgram = true 475 var updatesMatchProgram = true
483 for (document in documents) { 476 for (document in documents) {
484 val valid = NativeLibrary.doesUpdateMatchProgram( 477 val valid = NativeLibrary.doesUpdateMatchProgram(
@@ -501,44 +494,42 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
501 positiveAction = { homeViewModel.setContentToInstall(documents) } 494 positiveAction = { homeViewModel.setContentToInstall(documents) }
502 ) 495 )
503 } 496 }
504 }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) 497 }.show(supportFragmentManager, ProgressDialogFragment.TAG)
505 } 498 }
506 499
507 private fun installContent(documents: List<Uri>) { 500 private fun installContent(documents: List<Uri>) {
508 IndeterminateProgressDialogFragment.newInstance( 501 ProgressDialogFragment.newInstance(
509 this@MainActivity, 502 this@MainActivity,
510 R.string.installing_game_content 503 R.string.installing_game_content
511 ) { 504 ) { progressCallback, messageCallback ->
512 var installSuccess = 0 505 var installSuccess = 0
513 var installOverwrite = 0 506 var installOverwrite = 0
514 var errorBaseGame = 0 507 var errorBaseGame = 0
515 var errorExtension = 0 508 var error = 0
516 var errorOther = 0
517 documents.forEach { 509 documents.forEach {
510 messageCallback.invoke(FileUtil.getFilename(it))
518 when ( 511 when (
519 NativeLibrary.installFileToNand( 512 InstallResult.from(
520 it.toString(), 513 NativeLibrary.installFileToNand(
521 FileUtil.getExtension(it) 514 it.toString(),
515 progressCallback
516 )
522 ) 517 )
523 ) { 518 ) {
524 NativeLibrary.InstallFileToNandResult.Success -> { 519 InstallResult.Success -> {
525 installSuccess += 1 520 installSuccess += 1
526 } 521 }
527 522
528 NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> { 523 InstallResult.Overwrite -> {
529 installOverwrite += 1 524 installOverwrite += 1
530 } 525 }
531 526
532 NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> { 527 InstallResult.BaseInstallAttempted -> {
533 errorBaseGame += 1 528 errorBaseGame += 1
534 } 529 }
535 530
536 NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> { 531 InstallResult.Failure -> {
537 errorExtension += 1 532 error += 1
538 }
539
540 else -> {
541 errorOther += 1
542 } 533 }
543 } 534 }
544 } 535 }
@@ -565,7 +556,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
565 ) 556 )
566 installResult.append(separator) 557 installResult.append(separator)
567 } 558 }
568 val errorTotal: Int = errorBaseGame + errorExtension + errorOther 559 val errorTotal: Int = errorBaseGame + error
569 if (errorTotal > 0) { 560 if (errorTotal > 0) {
570 installResult.append(separator) 561 installResult.append(separator)
571 installResult.append( 562 installResult.append(
@@ -582,14 +573,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
582 ) 573 )
583 installResult.append(separator) 574 installResult.append(separator)
584 } 575 }
585 if (errorExtension > 0) { 576 if (error > 0) {
586 installResult.append(separator)
587 installResult.append(
588 getString(R.string.install_game_content_failure_file_extension)
589 )
590 installResult.append(separator)
591 }
592 if (errorOther > 0) {
593 installResult.append( 577 installResult.append(
594 getString(R.string.install_game_content_failure_description) 578 getString(R.string.install_game_content_failure_description)
595 ) 579 )
@@ -608,7 +592,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
608 descriptionString = installResult.toString().trim() 592 descriptionString = installResult.toString().trim()
609 ) 593 )
610 } 594 }
611 }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) 595 }.show(supportFragmentManager, ProgressDialogFragment.TAG)
612 } 596 }
613 597
614 val exportUserData = registerForActivityResult( 598 val exportUserData = registerForActivityResult(
@@ -618,16 +602,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
618 return@registerForActivityResult 602 return@registerForActivityResult
619 } 603 }
620 604
621 IndeterminateProgressDialogFragment.newInstance( 605 ProgressDialogFragment.newInstance(
622 this, 606 this,
623 R.string.exporting_user_data, 607 R.string.exporting_user_data,
624 true 608 true
625 ) { 609 ) { progressCallback, _ ->
626 val zipResult = FileUtil.zipFromInternalStorage( 610 val zipResult = FileUtil.zipFromInternalStorage(
627 File(DirectoryInitialization.userDirectory!!), 611 File(DirectoryInitialization.userDirectory!!),
628 DirectoryInitialization.userDirectory!!, 612 DirectoryInitialization.userDirectory!!,
629 BufferedOutputStream(contentResolver.openOutputStream(result)), 613 BufferedOutputStream(contentResolver.openOutputStream(result)),
630 taskViewModel.cancelled, 614 progressCallback,
631 compression = false 615 compression = false
632 ) 616 )
633 return@newInstance when (zipResult) { 617 return@newInstance when (zipResult) {
@@ -635,7 +619,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
635 TaskState.Failed -> R.string.export_failed 619 TaskState.Failed -> R.string.export_failed
636 TaskState.Cancelled -> R.string.user_data_export_cancelled 620 TaskState.Cancelled -> R.string.user_data_export_cancelled
637 } 621 }
638 }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) 622 }.show(supportFragmentManager, ProgressDialogFragment.TAG)
639 } 623 }
640 624
641 val importUserData = 625 val importUserData =
@@ -644,10 +628,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
644 return@registerForActivityResult 628 return@registerForActivityResult
645 } 629 }
646 630
647 IndeterminateProgressDialogFragment.newInstance( 631 ProgressDialogFragment.newInstance(
648 this, 632 this,
649 R.string.importing_user_data 633 R.string.importing_user_data
650 ) { 634 ) { progressCallback, _ ->
651 val checkStream = 635 val checkStream =
652 ZipInputStream(BufferedInputStream(contentResolver.openInputStream(result))) 636 ZipInputStream(BufferedInputStream(contentResolver.openInputStream(result)))
653 var isYuzuBackup = false 637 var isYuzuBackup = false
@@ -676,8 +660,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
676 // Copy archive to internal storage 660 // Copy archive to internal storage
677 try { 661 try {
678 FileUtil.unzipToInternalStorage( 662 FileUtil.unzipToInternalStorage(
679 BufferedInputStream(contentResolver.openInputStream(result)), 663 result.toString(),
680 File(DirectoryInitialization.userDirectory!!) 664 File(DirectoryInitialization.userDirectory!!),
665 progressCallback
681 ) 666 )
682 } catch (e: Exception) { 667 } catch (e: Exception) {
683 return@newInstance MessageDialogFragment.newInstance( 668 return@newInstance MessageDialogFragment.newInstance(
@@ -694,6 +679,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
694 driverViewModel.reloadDriverData() 679 driverViewModel.reloadDriverData()
695 680
696 return@newInstance getString(R.string.user_data_import_success) 681 return@newInstance getString(R.string.user_data_import_success)
697 }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) 682 }.show(supportFragmentManager, ProgressDialogFragment.TAG)
698 } 683 }
699} 684}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt
index b54a19c65..fc2339f5a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt
@@ -7,7 +7,6 @@ import android.database.Cursor
7import android.net.Uri 7import android.net.Uri
8import android.provider.DocumentsContract 8import android.provider.DocumentsContract
9import androidx.documentfile.provider.DocumentFile 9import androidx.documentfile.provider.DocumentFile
10import kotlinx.coroutines.flow.StateFlow
11import java.io.BufferedInputStream 10import java.io.BufferedInputStream
12import java.io.File 11import java.io.File
13import java.io.IOException 12import java.io.IOException
@@ -19,6 +18,7 @@ import org.yuzu.yuzu_emu.YuzuApplication
19import org.yuzu.yuzu_emu.model.MinimalDocumentFile 18import org.yuzu.yuzu_emu.model.MinimalDocumentFile
20import org.yuzu.yuzu_emu.model.TaskState 19import org.yuzu.yuzu_emu.model.TaskState
21import java.io.BufferedOutputStream 20import java.io.BufferedOutputStream
21import java.io.OutputStream
22import java.lang.NullPointerException 22import java.lang.NullPointerException
23import java.nio.charset.StandardCharsets 23import java.nio.charset.StandardCharsets
24import java.util.zip.Deflater 24import java.util.zip.Deflater
@@ -283,12 +283,34 @@ object FileUtil {
283 283
284 /** 284 /**
285 * Extracts the given zip file into the given directory. 285 * Extracts the given zip file into the given directory.
286 * @param path String representation of a [Uri] or a typical path delimited by '/'
287 * @param destDir Location to unzip the contents of [path] into
288 * @param progressCallback Lambda that is called with the total number of files and the current
289 * progress through the process. Stops execution as soon as possible if this returns true.
286 */ 290 */
287 @Throws(SecurityException::class) 291 @Throws(SecurityException::class)
288 fun unzipToInternalStorage(zipStream: BufferedInputStream, destDir: File) { 292 fun unzipToInternalStorage(
289 ZipInputStream(zipStream).use { zis -> 293 path: String,
294 destDir: File,
295 progressCallback: (max: Long, progress: Long) -> Boolean = { _, _ -> false }
296 ) {
297 var totalEntries = 0L
298 ZipInputStream(getInputStream(path)).use { zis ->
299 var tempEntry = zis.nextEntry
300 while (tempEntry != null) {
301 tempEntry = zis.nextEntry
302 totalEntries++
303 }
304 }
305
306 var progress = 0L
307 ZipInputStream(getInputStream(path)).use { zis ->
290 var entry: ZipEntry? = zis.nextEntry 308 var entry: ZipEntry? = zis.nextEntry
291 while (entry != null) { 309 while (entry != null) {
310 if (progressCallback.invoke(totalEntries, progress)) {
311 return@use
312 }
313
292 val newFile = File(destDir, entry.name) 314 val newFile = File(destDir, entry.name)
293 val destinationDirectory = if (entry.isDirectory) newFile else newFile.parentFile 315 val destinationDirectory = if (entry.isDirectory) newFile else newFile.parentFile
294 316
@@ -304,6 +326,7 @@ object FileUtil {
304 newFile.outputStream().use { fos -> zis.copyTo(fos) } 326 newFile.outputStream().use { fos -> zis.copyTo(fos) }
305 } 327 }
306 entry = zis.nextEntry 328 entry = zis.nextEntry
329 progress++
307 } 330 }
308 } 331 }
309 } 332 }
@@ -313,14 +336,15 @@ object FileUtil {
313 * @param inputFile File representation of the item that will be zipped 336 * @param inputFile File representation of the item that will be zipped
314 * @param rootDir Directory containing the inputFile 337 * @param rootDir Directory containing the inputFile
315 * @param outputStream Stream where the zip file will be output 338 * @param outputStream Stream where the zip file will be output
316 * @param cancelled [StateFlow] that reports whether this process has been cancelled 339 * @param progressCallback Lambda that is called with the total number of files and the current
340 * progress through the process. Stops execution as soon as possible if this returns true.
317 * @param compression Disables compression if true 341 * @param compression Disables compression if true
318 */ 342 */
319 fun zipFromInternalStorage( 343 fun zipFromInternalStorage(
320 inputFile: File, 344 inputFile: File,
321 rootDir: String, 345 rootDir: String,
322 outputStream: BufferedOutputStream, 346 outputStream: BufferedOutputStream,
323 cancelled: StateFlow<Boolean>? = null, 347 progressCallback: (max: Long, progress: Long) -> Boolean = { _, _ -> false },
324 compression: Boolean = true 348 compression: Boolean = true
325 ): TaskState { 349 ): TaskState {
326 try { 350 try {
@@ -330,8 +354,10 @@ object FileUtil {
330 zos.setLevel(Deflater.NO_COMPRESSION) 354 zos.setLevel(Deflater.NO_COMPRESSION)
331 } 355 }
332 356
357 var count = 0L
358 val totalFiles = inputFile.walkTopDown().count().toLong()
333 inputFile.walkTopDown().forEach { file -> 359 inputFile.walkTopDown().forEach { file ->
334 if (cancelled?.value == true) { 360 if (progressCallback.invoke(totalFiles, count)) {
335 return TaskState.Cancelled 361 return TaskState.Cancelled
336 } 362 }
337 363
@@ -343,6 +369,7 @@ object FileUtil {
343 if (file.isFile) { 369 if (file.isFile) {
344 file.inputStream().use { fis -> fis.copyTo(zos) } 370 file.inputStream().use { fis -> fis.copyTo(zos) }
345 } 371 }
372 count++
346 } 373 }
347 } 374 }
348 } 375 }
@@ -356,9 +383,14 @@ object FileUtil {
356 /** 383 /**
357 * Helper function that copies the contents of a DocumentFile folder into a [File] 384 * Helper function that copies the contents of a DocumentFile folder into a [File]
358 * @param file [File] representation of the folder to copy into 385 * @param file [File] representation of the folder to copy into
386 * @param progressCallback Lambda that is called with the total number of files and the current
387 * progress through the process. Stops execution as soon as possible if this returns true.
359 * @throws IllegalStateException Fails when trying to copy a folder into a file and vice versa 388 * @throws IllegalStateException Fails when trying to copy a folder into a file and vice versa
360 */ 389 */
361 fun DocumentFile.copyFilesTo(file: File) { 390 fun DocumentFile.copyFilesTo(
391 file: File,
392 progressCallback: (max: Long, progress: Long) -> Boolean = { _, _ -> false }
393 ) {
362 file.mkdirs() 394 file.mkdirs()
363 if (!this.isDirectory || !file.isDirectory) { 395 if (!this.isDirectory || !file.isDirectory) {
364 throw IllegalStateException( 396 throw IllegalStateException(
@@ -366,7 +398,13 @@ object FileUtil {
366 ) 398 )
367 } 399 }
368 400
401 var count = 0L
402 val totalFiles = this.listFiles().size.toLong()
369 this.listFiles().forEach { 403 this.listFiles().forEach {
404 if (progressCallback.invoke(totalFiles, count)) {
405 return
406 }
407
370 val newFile = File(file, it.name!!) 408 val newFile = File(file, it.name!!)
371 if (it.isDirectory) { 409 if (it.isDirectory) {
372 newFile.mkdirs() 410 newFile.mkdirs()
@@ -381,6 +419,7 @@ object FileUtil {
381 newFile.outputStream().use { os -> bos.copyTo(os) } 419 newFile.outputStream().use { os -> bos.copyTo(os) }
382 } 420 }
383 } 421 }
422 count++
384 } 423 }
385 } 424 }
386 425
@@ -427,6 +466,18 @@ object FileUtil {
427 } 466 }
428 } 467 }
429 468
469 fun getInputStream(path: String) = if (path.contains("content://")) {
470 Uri.parse(path).inputStream()
471 } else {
472 File(path).inputStream()
473 }
474
475 fun getOutputStream(path: String) = if (path.contains("content://")) {
476 Uri.parse(path).outputStream()
477 } else {
478 File(path).outputStream()
479 }
480
430 @Throws(IOException::class) 481 @Throws(IOException::class)
431 fun getStringFromFile(file: File): String = 482 fun getStringFromFile(file: File): String =
432 String(file.readBytes(), StandardCharsets.UTF_8) 483 String(file.readBytes(), StandardCharsets.UTF_8)
@@ -434,4 +485,19 @@ object FileUtil {
434 @Throws(IOException::class) 485 @Throws(IOException::class)
435 fun getStringFromInputStream(stream: InputStream): String = 486 fun getStringFromInputStream(stream: InputStream): String =
436 String(stream.readBytes(), StandardCharsets.UTF_8) 487 String(stream.readBytes(), StandardCharsets.UTF_8)
488
489 fun DocumentFile.inputStream(): InputStream =
490 YuzuApplication.appContext.contentResolver.openInputStream(uri)!!
491
492 fun DocumentFile.outputStream(): OutputStream =
493 YuzuApplication.appContext.contentResolver.openOutputStream(uri)!!
494
495 fun Uri.inputStream(): InputStream =
496 YuzuApplication.appContext.contentResolver.openInputStream(this)!!
497
498 fun Uri.outputStream(): OutputStream =
499 YuzuApplication.appContext.contentResolver.openOutputStream(this)!!
500
501 fun Uri.asDocumentFile(): DocumentFile? =
502 DocumentFile.fromSingleUri(YuzuApplication.appContext, this)
437} 503}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt
index 2e9b0beb8..d05020560 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt
@@ -5,7 +5,10 @@ package org.yuzu.yuzu_emu.utils
5 5
6import android.graphics.Bitmap 6import android.graphics.Bitmap
7import android.graphics.BitmapFactory 7import android.graphics.BitmapFactory
8import android.graphics.drawable.LayerDrawable
8import android.widget.ImageView 9import android.widget.ImageView
10import androidx.core.content.res.ResourcesCompat
11import androidx.core.graphics.drawable.IconCompat
9import androidx.core.graphics.drawable.toBitmap 12import androidx.core.graphics.drawable.toBitmap
10import androidx.core.graphics.drawable.toDrawable 13import androidx.core.graphics.drawable.toDrawable
11import androidx.lifecycle.LifecycleOwner 14import androidx.lifecycle.LifecycleOwner
@@ -85,4 +88,22 @@ object GameIconUtils {
85 return imageLoader.execute(request) 88 return imageLoader.execute(request)
86 .drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888) 89 .drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
87 } 90 }
91
92 suspend fun getShortcutIcon(lifecycleOwner: LifecycleOwner, game: Game): IconCompat {
93 val layerDrawable = ResourcesCompat.getDrawable(
94 YuzuApplication.appContext.resources,
95 R.drawable.shortcut,
96 null
97 ) as LayerDrawable
98 layerDrawable.setDrawableByLayerId(
99 R.id.shortcut_foreground,
100 getGameIcon(lifecycleOwner, game).toDrawable(YuzuApplication.appContext.resources)
101 )
102 val inset = YuzuApplication.appContext.resources
103 .getDimensionPixelSize(R.dimen.icon_inset)
104 layerDrawable.setLayerInset(1, inset, inset, inset, inset)
105 return IconCompat.createWithAdaptiveBitmap(
106 layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
107 )
108 }
88} 109}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt
index a8f9dcc34..81212cbee 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt
@@ -5,7 +5,6 @@ package org.yuzu.yuzu_emu.utils
5 5
6import android.net.Uri 6import android.net.Uri
7import android.os.Build 7import android.os.Build
8import java.io.BufferedInputStream
9import java.io.File 8import java.io.File
10import java.io.IOException 9import java.io.IOException
11import org.yuzu.yuzu_emu.NativeLibrary 10import org.yuzu.yuzu_emu.NativeLibrary
@@ -123,7 +122,7 @@ object GpuDriverHelper {
123 // Unzip the driver. 122 // Unzip the driver.
124 try { 123 try {
125 FileUtil.unzipToInternalStorage( 124 FileUtil.unzipToInternalStorage(
126 BufferedInputStream(copiedFile.inputStream()), 125 copiedFile.path,
127 File(driverInstallationPath!!) 126 File(driverInstallationPath!!)
128 ) 127 )
129 } catch (e: SecurityException) { 128 } catch (e: SecurityException) {
@@ -156,7 +155,7 @@ object GpuDriverHelper {
156 // Unzip the driver to the private installation directory 155 // Unzip the driver to the private installation directory
157 try { 156 try {
158 FileUtil.unzipToInternalStorage( 157 FileUtil.unzipToInternalStorage(
159 BufferedInputStream(driver.inputStream()), 158 driver.path,
160 File(driverInstallationPath!!) 159 File(driverInstallationPath!!)
161 ) 160 )
162 } catch (e: SecurityException) { 161 } catch (e: SecurityException) {
diff --git a/src/android/app/src/main/jni/android_common/android_common.cpp b/src/android/app/src/main/jni/android_common/android_common.cpp
index 1e884ffdd..7018a52af 100644
--- a/src/android/app/src/main/jni/android_common/android_common.cpp
+++ b/src/android/app/src/main/jni/android_common/android_common.cpp
@@ -42,3 +42,19 @@ double GetJDouble(JNIEnv* env, jobject jdouble) {
42jobject ToJDouble(JNIEnv* env, double value) { 42jobject ToJDouble(JNIEnv* env, double value) {
43 return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value); 43 return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value);
44} 44}
45
46s32 GetJInteger(JNIEnv* env, jobject jinteger) {
47 return env->GetIntField(jinteger, IDCache::GetIntegerValueField());
48}
49
50jobject ToJInteger(JNIEnv* env, s32 value) {
51 return env->NewObject(IDCache::GetIntegerClass(), IDCache::GetIntegerConstructor(), value);
52}
53
54bool GetJBoolean(JNIEnv* env, jobject jboolean) {
55 return env->GetBooleanField(jboolean, IDCache::GetBooleanValueField());
56}
57
58jobject ToJBoolean(JNIEnv* env, bool value) {
59 return env->NewObject(IDCache::GetBooleanClass(), IDCache::GetBooleanConstructor(), value);
60}
diff --git a/src/android/app/src/main/jni/android_common/android_common.h b/src/android/app/src/main/jni/android_common/android_common.h
index 8eb803e1b..29a338c0a 100644
--- a/src/android/app/src/main/jni/android_common/android_common.h
+++ b/src/android/app/src/main/jni/android_common/android_common.h
@@ -6,6 +6,7 @@
6#include <string> 6#include <string>
7 7
8#include <jni.h> 8#include <jni.h>
9#include "common/common_types.h"
9 10
10std::string GetJString(JNIEnv* env, jstring jstr); 11std::string GetJString(JNIEnv* env, jstring jstr);
11jstring ToJString(JNIEnv* env, std::string_view str); 12jstring ToJString(JNIEnv* env, std::string_view str);
@@ -13,3 +14,9 @@ jstring ToJString(JNIEnv* env, std::u16string_view str);
13 14
14double GetJDouble(JNIEnv* env, jobject jdouble); 15double GetJDouble(JNIEnv* env, jobject jdouble);
15jobject ToJDouble(JNIEnv* env, double value); 16jobject ToJDouble(JNIEnv* env, double value);
17
18s32 GetJInteger(JNIEnv* env, jobject jinteger);
19jobject ToJInteger(JNIEnv* env, s32 value);
20
21bool GetJBoolean(JNIEnv* env, jobject jboolean);
22jobject ToJBoolean(JNIEnv* env, bool value);
diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h
index 559ae83eb..cf93304da 100644
--- a/src/android/app/src/main/jni/android_settings.h
+++ b/src/android/app/src/main/jni/android_settings.h
@@ -63,6 +63,7 @@ struct Values {
63 Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay", 63 Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
64 Settings::Category::Overlay}; 64 Settings::Category::Overlay};
65 Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay}; 65 Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
66 Settings::Setting<s32> lock_drawer{linkage, false, "lock_drawer", Settings::Category::Overlay};
66}; 67};
67 68
68extern Values values; 69extern Values values;
diff --git a/src/android/app/src/main/jni/id_cache.cpp b/src/android/app/src/main/jni/id_cache.cpp
index c79ad7d76..96f2ad3d4 100644
--- a/src/android/app/src/main/jni/id_cache.cpp
+++ b/src/android/app/src/main/jni/id_cache.cpp
@@ -43,10 +43,27 @@ static jfieldID s_overlay_control_data_landscape_position_field;
43static jfieldID s_overlay_control_data_portrait_position_field; 43static jfieldID s_overlay_control_data_portrait_position_field;
44static jfieldID s_overlay_control_data_foldable_position_field; 44static jfieldID s_overlay_control_data_foldable_position_field;
45 45
46static jclass s_patch_class;
47static jmethodID s_patch_constructor;
48static jfieldID s_patch_enabled_field;
49static jfieldID s_patch_name_field;
50static jfieldID s_patch_version_field;
51static jfieldID s_patch_type_field;
52static jfieldID s_patch_program_id_field;
53static jfieldID s_patch_title_id_field;
54
46static jclass s_double_class; 55static jclass s_double_class;
47static jmethodID s_double_constructor; 56static jmethodID s_double_constructor;
48static jfieldID s_double_value_field; 57static jfieldID s_double_value_field;
49 58
59static jclass s_integer_class;
60static jmethodID s_integer_constructor;
61static jfieldID s_integer_value_field;
62
63static jclass s_boolean_class;
64static jmethodID s_boolean_constructor;
65static jfieldID s_boolean_value_field;
66
50static constexpr jint JNI_VERSION = JNI_VERSION_1_6; 67static constexpr jint JNI_VERSION = JNI_VERSION_1_6;
51 68
52namespace IDCache { 69namespace IDCache {
@@ -186,6 +203,38 @@ jfieldID GetOverlayControlDataFoldablePositionField() {
186 return s_overlay_control_data_foldable_position_field; 203 return s_overlay_control_data_foldable_position_field;
187} 204}
188 205
206jclass GetPatchClass() {
207 return s_patch_class;
208}
209
210jmethodID GetPatchConstructor() {
211 return s_patch_constructor;
212}
213
214jfieldID GetPatchEnabledField() {
215 return s_patch_enabled_field;
216}
217
218jfieldID GetPatchNameField() {
219 return s_patch_name_field;
220}
221
222jfieldID GetPatchVersionField() {
223 return s_patch_version_field;
224}
225
226jfieldID GetPatchTypeField() {
227 return s_patch_type_field;
228}
229
230jfieldID GetPatchProgramIdField() {
231 return s_patch_program_id_field;
232}
233
234jfieldID GetPatchTitleIdField() {
235 return s_patch_title_id_field;
236}
237
189jclass GetDoubleClass() { 238jclass GetDoubleClass() {
190 return s_double_class; 239 return s_double_class;
191} 240}
@@ -198,6 +247,30 @@ jfieldID GetDoubleValueField() {
198 return s_double_value_field; 247 return s_double_value_field;
199} 248}
200 249
250jclass GetIntegerClass() {
251 return s_integer_class;
252}
253
254jmethodID GetIntegerConstructor() {
255 return s_integer_constructor;
256}
257
258jfieldID GetIntegerValueField() {
259 return s_integer_value_field;
260}
261
262jclass GetBooleanClass() {
263 return s_boolean_class;
264}
265
266jmethodID GetBooleanConstructor() {
267 return s_boolean_constructor;
268}
269
270jfieldID GetBooleanValueField() {
271 return s_boolean_value_field;
272}
273
201} // namespace IDCache 274} // namespace IDCache
202 275
203#ifdef __cplusplus 276#ifdef __cplusplus
@@ -278,12 +351,37 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
278 env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); 351 env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;");
279 env->DeleteLocalRef(overlay_control_data_class); 352 env->DeleteLocalRef(overlay_control_data_class);
280 353
354 const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch");
355 s_patch_class = reinterpret_cast<jclass>(env->NewGlobalRef(patch_class));
356 s_patch_constructor = env->GetMethodID(
357 patch_class, "<init>",
358 "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V");
359 s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z");
360 s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;");
361 s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;");
362 s_patch_type_field = env->GetFieldID(patch_class, "type", "I");
363 s_patch_program_id_field = env->GetFieldID(patch_class, "programId", "Ljava/lang/String;");
364 s_patch_title_id_field = env->GetFieldID(patch_class, "titleId", "Ljava/lang/String;");
365 env->DeleteLocalRef(patch_class);
366
281 const jclass double_class = env->FindClass("java/lang/Double"); 367 const jclass double_class = env->FindClass("java/lang/Double");
282 s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class)); 368 s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class));
283 s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V"); 369 s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V");
284 s_double_value_field = env->GetFieldID(double_class, "value", "D"); 370 s_double_value_field = env->GetFieldID(double_class, "value", "D");
285 env->DeleteLocalRef(double_class); 371 env->DeleteLocalRef(double_class);
286 372
373 const jclass int_class = env->FindClass("java/lang/Integer");
374 s_integer_class = reinterpret_cast<jclass>(env->NewGlobalRef(int_class));
375 s_integer_constructor = env->GetMethodID(int_class, "<init>", "(I)V");
376 s_integer_value_field = env->GetFieldID(int_class, "value", "I");
377 env->DeleteLocalRef(int_class);
378
379 const jclass boolean_class = env->FindClass("java/lang/Boolean");
380 s_boolean_class = reinterpret_cast<jclass>(env->NewGlobalRef(boolean_class));
381 s_boolean_constructor = env->GetMethodID(boolean_class, "<init>", "(Z)V");
382 s_boolean_value_field = env->GetFieldID(boolean_class, "value", "Z");
383 env->DeleteLocalRef(boolean_class);
384
287 // Initialize Android Storage 385 // Initialize Android Storage
288 Common::FS::Android::RegisterCallbacks(env, s_native_library_class); 386 Common::FS::Android::RegisterCallbacks(env, s_native_library_class);
289 387
@@ -309,7 +407,10 @@ void JNI_OnUnload(JavaVM* vm, void* reserved) {
309 env->DeleteGlobalRef(s_string_class); 407 env->DeleteGlobalRef(s_string_class);
310 env->DeleteGlobalRef(s_pair_class); 408 env->DeleteGlobalRef(s_pair_class);
311 env->DeleteGlobalRef(s_overlay_control_data_class); 409 env->DeleteGlobalRef(s_overlay_control_data_class);
410 env->DeleteGlobalRef(s_patch_class);
312 env->DeleteGlobalRef(s_double_class); 411 env->DeleteGlobalRef(s_double_class);
412 env->DeleteGlobalRef(s_integer_class);
413 env->DeleteGlobalRef(s_boolean_class);
313 414
314 // UnInitialize applets 415 // UnInitialize applets
315 SoftwareKeyboard::CleanupJNI(env); 416 SoftwareKeyboard::CleanupJNI(env);
diff --git a/src/android/app/src/main/jni/id_cache.h b/src/android/app/src/main/jni/id_cache.h
index 784d1412f..a002e705d 100644
--- a/src/android/app/src/main/jni/id_cache.h
+++ b/src/android/app/src/main/jni/id_cache.h
@@ -43,8 +43,25 @@ jfieldID GetOverlayControlDataLandscapePositionField();
43jfieldID GetOverlayControlDataPortraitPositionField(); 43jfieldID GetOverlayControlDataPortraitPositionField();
44jfieldID GetOverlayControlDataFoldablePositionField(); 44jfieldID GetOverlayControlDataFoldablePositionField();
45 45
46jclass GetPatchClass();
47jmethodID GetPatchConstructor();
48jfieldID GetPatchEnabledField();
49jfieldID GetPatchNameField();
50jfieldID GetPatchVersionField();
51jfieldID GetPatchTypeField();
52jfieldID GetPatchProgramIdField();
53jfieldID GetPatchTitleIdField();
54
46jclass GetDoubleClass(); 55jclass GetDoubleClass();
47jmethodID GetDoubleConstructor(); 56jmethodID GetDoubleConstructor();
48jfieldID GetDoubleValueField(); 57jfieldID GetDoubleValueField();
49 58
59jclass GetIntegerClass();
60jmethodID GetIntegerConstructor();
61jfieldID GetIntegerValueField();
62
63jclass GetBooleanClass();
64jmethodID GetBooleanConstructor();
65jfieldID GetBooleanValueField();
66
50} // namespace IDCache 67} // namespace IDCache
diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp
index ed3b1353a..963f57380 100644
--- a/src/android/app/src/main/jni/native.cpp
+++ b/src/android/app/src/main/jni/native.cpp
@@ -17,6 +17,7 @@
17#include <core/file_sys/patch_manager.h> 17#include <core/file_sys/patch_manager.h>
18#include <core/file_sys/savedata_factory.h> 18#include <core/file_sys/savedata_factory.h>
19#include <core/loader/nro.h> 19#include <core/loader/nro.h>
20#include <frontend_common/content_manager.h>
20#include <jni.h> 21#include <jni.h>
21 22
22#include "common/detached_tasks.h" 23#include "common/detached_tasks.h"
@@ -100,67 +101,6 @@ void EmulationSession::SetNativeWindow(ANativeWindow* native_window) {
100 m_native_window = native_window; 101 m_native_window = native_window;
101} 102}
102 103
103int EmulationSession::InstallFileToNand(std::string filename, std::string file_extension) {
104 jconst copy_func = [](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest,
105 std::size_t block_size) {
106 if (src == nullptr || dest == nullptr) {
107 return false;
108 }
109 if (!dest->Resize(src->GetSize())) {
110 return false;
111 }
112
113 using namespace Common::Literals;
114 [[maybe_unused]] std::vector<u8> buffer(1_MiB);
115
116 for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
117 jconst read = src->Read(buffer.data(), buffer.size(), i);
118 dest->Write(buffer.data(), read, i);
119 }
120 return true;
121 };
122
123 enum InstallResult {
124 Success = 0,
125 SuccessFileOverwritten = 1,
126 InstallError = 2,
127 ErrorBaseGame = 3,
128 ErrorFilenameExtension = 4,
129 };
130
131 [[maybe_unused]] std::shared_ptr<FileSys::NSP> nsp;
132 if (file_extension == "nsp") {
133 nsp = std::make_shared<FileSys::NSP>(m_vfs->OpenFile(filename, FileSys::Mode::Read));
134 if (nsp->IsExtractedType()) {
135 return InstallError;
136 }
137 } else {
138 return ErrorFilenameExtension;
139 }
140
141 if (!nsp) {
142 return InstallError;
143 }
144
145 if (nsp->GetStatus() != Loader::ResultStatus::Success) {
146 return InstallError;
147 }
148
149 jconst res = m_system.GetFileSystemController().GetUserNANDContents()->InstallEntry(*nsp, true,
150 copy_func);
151
152 switch (res) {
153 case FileSys::InstallResult::Success:
154 return Success;
155 case FileSys::InstallResult::OverwriteExisting:
156 return SuccessFileOverwritten;
157 case FileSys::InstallResult::ErrorBaseInstall:
158 return ErrorBaseGame;
159 default:
160 return InstallError;
161 }
162}
163
164void EmulationSession::InitializeGpuDriver(const std::string& hook_lib_dir, 104void EmulationSession::InitializeGpuDriver(const std::string& hook_lib_dir,
165 const std::string& custom_driver_dir, 105 const std::string& custom_driver_dir,
166 const std::string& custom_driver_name, 106 const std::string& custom_driver_name,
@@ -512,10 +452,20 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject
512} 452}
513 453
514int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, 454int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance,
515 jstring j_file, 455 jstring j_file, jobject jcallback) {
516 jstring j_file_extension) { 456 auto jlambdaClass = env->GetObjectClass(jcallback);
517 return EmulationSession::GetInstance().InstallFileToNand(GetJString(env, j_file), 457 auto jlambdaInvokeMethod = env->GetMethodID(
518 GetJString(env, j_file_extension)); 458 jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
459 const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
460 auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
461 ToJDouble(env, max), ToJDouble(env, progress));
462 return GetJBoolean(env, jwasCancelled);
463 };
464
465 return static_cast<int>(
466 ContentManager::InstallNSP(&EmulationSession::GetInstance().System(),
467 EmulationSession::GetInstance().System().GetFilesystem().get(),
468 GetJString(env, j_file), callback));
519} 469}
520 470
521jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, 471jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj,
@@ -824,9 +774,9 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env,
824 return true; 774 return true;
825} 775}
826 776
827jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAddonsForFile(JNIEnv* env, jobject jobj, 777jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj,
828 jstring jpath, 778 jstring jpath,
829 jstring jprogramId) { 779 jstring jprogramId) {
830 const auto path = GetJString(env, jpath); 780 const auto path = GetJString(env, jpath);
831 const auto vFile = 781 const auto vFile =
832 Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path); 782 Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path);
@@ -843,20 +793,77 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAddonsForFile(JNIEnv* env,
843 FileSys::VirtualFile update_raw; 793 FileSys::VirtualFile update_raw;
844 loader->ReadUpdateRaw(update_raw); 794 loader->ReadUpdateRaw(update_raw);
845 795
846 auto addons = pm.GetPatchVersionNames(update_raw); 796 auto patches = pm.GetPatches(update_raw);
847 auto jemptyString = ToJString(env, ""); 797 jobjectArray jpatchArray =
848 auto jemptyStringPair = env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), 798 env->NewObjectArray(patches.size(), IDCache::GetPatchClass(), nullptr);
849 jemptyString, jemptyString);
850 jobjectArray jaddonsArray =
851 env->NewObjectArray(addons.size(), IDCache::GetPairClass(), jemptyStringPair);
852 int i = 0; 799 int i = 0;
853 for (const auto& addon : addons) { 800 for (const auto& patch : patches) {
854 jobject jaddon = env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), 801 jobject jpatch = env->NewObject(
855 ToJString(env, addon.first), ToJString(env, addon.second)); 802 IDCache::GetPatchClass(), IDCache::GetPatchConstructor(), patch.enabled,
856 env->SetObjectArrayElement(jaddonsArray, i, jaddon); 803 ToJString(env, patch.name), ToJString(env, patch.version),
804 static_cast<jint>(patch.type), ToJString(env, std::to_string(patch.program_id)),
805 ToJString(env, std::to_string(patch.title_id)));
806 env->SetObjectArrayElement(jpatchArray, i, jpatch);
857 ++i; 807 ++i;
858 } 808 }
859 return jaddonsArray; 809 return jpatchArray;
810}
811
812void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject jobj,
813 jstring jprogramId) {
814 auto program_id = EmulationSession::GetProgramId(env, jprogramId);
815 ContentManager::RemoveUpdate(EmulationSession::GetInstance().System().GetFileSystemController(),
816 program_id);
817}
818
819void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj,
820 jstring jprogramId) {
821 auto program_id = EmulationSession::GetProgramId(env, jprogramId);
822 ContentManager::RemoveAllDLC(&EmulationSession::GetInstance().System(), program_id);
823}
824
825void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId,
826 jstring jname) {
827 auto program_id = EmulationSession::GetProgramId(env, jprogramId);
828 ContentManager::RemoveMod(EmulationSession::GetInstance().System().GetFileSystemController(),
829 program_id, GetJString(env, jname));
830}
831
832jobject Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env, jobject jobj,
833 jobject jcallback) {
834 auto jlambdaClass = env->GetObjectClass(jcallback);
835 auto jlambdaInvokeMethod = env->GetMethodID(
836 jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
837 const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
838 auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
839 ToJDouble(env, max), ToJDouble(env, progress));
840 return GetJBoolean(env, jwasCancelled);
841 };
842
843 auto& session = EmulationSession::GetInstance();
844 std::vector<std::string> result = ContentManager::VerifyInstalledContents(
845 &session.System(), session.GetContentProvider(), callback);
846 jobjectArray jresult =
847 env->NewObjectArray(result.size(), IDCache::GetStringClass(), ToJString(env, ""));
848 for (size_t i = 0; i < result.size(); ++i) {
849 env->SetObjectArrayElement(jresult, i, ToJString(env, result[i]));
850 }
851 return jresult;
852}
853
854jint Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj,
855 jstring jpath, jobject jcallback) {
856 auto jlambdaClass = env->GetObjectClass(jcallback);
857 auto jlambdaInvokeMethod = env->GetMethodID(
858 jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
859 const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
860 auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
861 ToJDouble(env, max), ToJDouble(env, progress));
862 return GetJBoolean(env, jwasCancelled);
863 };
864 auto& session = EmulationSession::GetInstance();
865 return static_cast<jint>(
866 ContentManager::VerifyGameContents(&session.System(), GetJString(env, jpath), callback));
860} 867}
861 868
862jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, 869jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj,
diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h
index 4a8049578..dadb138ad 100644
--- a/src/android/app/src/main/jni/native.h
+++ b/src/android/app/src/main/jni/native.h
@@ -7,6 +7,7 @@
7#include "core/file_sys/registered_cache.h" 7#include "core/file_sys/registered_cache.h"
8#include "core/hle/service/acc/profile_manager.h" 8#include "core/hle/service/acc/profile_manager.h"
9#include "core/perf_stats.h" 9#include "core/perf_stats.h"
10#include "frontend_common/content_manager.h"
10#include "jni/applets/software_keyboard.h" 11#include "jni/applets/software_keyboard.h"
11#include "jni/emu_window/emu_window.h" 12#include "jni/emu_window/emu_window.h"
12#include "video_core/rasterizer_interface.h" 13#include "video_core/rasterizer_interface.h"
@@ -29,7 +30,6 @@ public:
29 void SetNativeWindow(ANativeWindow* native_window); 30 void SetNativeWindow(ANativeWindow* native_window);
30 void SurfaceChanged(); 31 void SurfaceChanged();
31 32
32 int InstallFileToNand(std::string filename, std::string file_extension);
33 void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir, 33 void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir,
34 const std::string& custom_driver_name, 34 const std::string& custom_driver_name,
35 const std::string& file_redirect_dir); 35 const std::string& file_redirect_dir);
diff --git a/src/android/app/src/main/res/drawable/ic_lock.xml b/src/android/app/src/main/res/drawable/ic_lock.xml
new file mode 100644
index 000000000..ef97b1936
--- /dev/null
+++ b/src/android/app/src/main/res/drawable/ic_lock.xml
@@ -0,0 +1,9 @@
1<vector xmlns:android="http://schemas.android.com/apk/res/android"
2 android:height="24dp"
3 android:viewportHeight="24"
4 android:viewportWidth="24"
5 android:width="24dp">
6 <path
7 android:fillColor="?attr/colorControlNormal"
8 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" />
9</vector>
diff --git a/src/android/app/src/main/res/drawable/ic_shortcut.xml b/src/android/app/src/main/res/drawable/ic_shortcut.xml
new file mode 100644
index 000000000..06e1983b2
--- /dev/null
+++ b/src/android/app/src/main/res/drawable/ic_shortcut.xml
@@ -0,0 +1,9 @@
1<vector xmlns:android="http://schemas.android.com/apk/res/android"
2 android:width="24dp"
3 android:height="24dp"
4 android:viewportWidth="960"
5 android:viewportHeight="960">
6 <path
7 android:fillColor="?attr/colorControlNormal"
8 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" />
9</vector>
diff --git a/src/android/app/src/main/res/layout-w600dp/fragment_game_properties.xml b/src/android/app/src/main/res/layout-w600dp/fragment_game_properties.xml
index 0b9633855..551f255c0 100644
--- a/src/android/app/src/main/res/layout-w600dp/fragment_game_properties.xml
+++ b/src/android/app/src/main/res/layout-w600dp/fragment_game_properties.xml
@@ -43,16 +43,35 @@
43 app:layout_constraintStart_toStartOf="parent" 43 app:layout_constraintStart_toStartOf="parent"
44 app:layout_constraintTop_toTopOf="parent"> 44 app:layout_constraintTop_toTopOf="parent">
45 45
46 <Button 46 <androidx.constraintlayout.widget.ConstraintLayout
47 android:id="@+id/button_back" 47 android:layout_width="match_parent"
48 style="?attr/materialIconButtonStyle"
49 android:layout_width="wrap_content"
50 android:layout_height="wrap_content" 48 android:layout_height="wrap_content"
51 android:layout_gravity="start"
52 android:layout_margin="8dp" 49 android:layout_margin="8dp"
53 app:icon="@drawable/ic_back" 50 android:orientation="horizontal">
54 app:iconSize="24dp" 51
55 app:iconTint="?attr/colorOnSurface" /> 52 <Button
53 android:id="@+id/button_back"
54 style="?attr/materialIconButtonStyle"
55 android:layout_width="wrap_content"
56 android:layout_height="wrap_content"
57 app:icon="@drawable/ic_back"
58 app:iconSize="24dp"
59 app:iconTint="?attr/colorOnSurface"
60 app:layout_constraintStart_toStartOf="parent"
61 app:layout_constraintTop_toTopOf="parent" />
62
63 <Button
64 android:id="@+id/button_shortcut"
65 style="?attr/materialIconButtonStyle"
66 android:layout_width="wrap_content"
67 android:layout_height="wrap_content"
68 app:icon="@drawable/ic_shortcut"
69 app:iconSize="24dp"
70 app:iconTint="?attr/colorOnSurface"
71 app:layout_constraintTop_toTopOf="parent"
72 app:layout_constraintEnd_toEndOf="parent" />
73
74 </androidx.constraintlayout.widget.ConstraintLayout>
56 75
57 <com.google.android.material.card.MaterialCardView 76 <com.google.android.material.card.MaterialCardView
58 style="?attr/materialCardViewElevatedStyle" 77 style="?attr/materialCardViewElevatedStyle"
diff --git a/src/android/app/src/main/res/layout/card_home_option.xml b/src/android/app/src/main/res/layout/card_home_option.xml
index cb667c928..224ec4d89 100644
--- a/src/android/app/src/main/res/layout/card_home_option.xml
+++ b/src/android/app/src/main/res/layout/card_home_option.xml
@@ -2,16 +2,16 @@
2<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" 2<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools" 4 xmlns:tools="http://schemas.android.com/tools"
5 style="?attr/materialCardViewFilledStyle" 5 style="?attr/materialCardViewElevatedStyle"
6 android:id="@+id/option_card" 6 android:id="@+id/option_card"
7 android:layout_width="match_parent" 7 android:layout_width="match_parent"
8 android:layout_height="wrap_content" 8 android:layout_height="wrap_content"
9 android:layout_marginBottom="24dp" 9 android:layout_marginBottom="24dp"
10 android:layout_marginHorizontal="12dp" 10 android:layout_marginHorizontal="12dp"
11 android:background="?attr/selectableItemBackground" 11 android:background="?attr/selectableItemBackground"
12 android:backgroundTint="?attr/colorSurfaceVariant"
13 android:clickable="true" 12 android:clickable="true"
14 android:focusable="true"> 13 android:focusable="true"
14 app:cardElevation="4dp">
15 15
16 <LinearLayout 16 <LinearLayout
17 android:id="@+id/option_layout" 17 android:id="@+id/option_layout"
diff --git a/src/android/app/src/main/res/layout/dialog_progress_bar.xml b/src/android/app/src/main/res/layout/dialog_progress_bar.xml
index 0209ea082..e61aa5294 100644
--- a/src/android/app/src/main/res/layout/dialog_progress_bar.xml
+++ b/src/android/app/src/main/res/layout/dialog_progress_bar.xml
@@ -1,8 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<com.google.android.material.progressindicator.LinearProgressIndicator xmlns:android="http://schemas.android.com/apk/res/android" 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 android:id="@+id/progress_bar"
5 android:layout_width="match_parent" 4 android:layout_width="match_parent"
6 android:layout_height="wrap_content" 5 android:layout_height="wrap_content"
7 android:padding="24dp" 6 android:orientation="vertical">
8 app:trackCornerRadius="4dp" /> 7
8 <com.google.android.material.textview.MaterialTextView
9 android:id="@+id/message"
10 style="@style/TextAppearance.Material3.BodyMedium"
11 android:layout_width="match_parent"
12 android:layout_height="wrap_content"
13 android:layout_marginHorizontal="24dp"
14 android:layout_marginTop="12dp"
15 android:layout_marginBottom="6dp"
16 android:ellipsize="marquee"
17 android:marqueeRepeatLimit="marquee_forever"
18 android:requiresFadingEdge="horizontal"
19 android:singleLine="true"
20 android:textAlignment="viewStart"
21 android:visibility="gone" />
22
23 <com.google.android.material.progressindicator.LinearProgressIndicator
24 android:id="@+id/progress_bar"
25 android:layout_width="match_parent"
26 android:layout_height="wrap_content"
27 android:padding="24dp"
28 app:trackCornerRadius="4dp" />
29
30</LinearLayout>
diff --git a/src/android/app/src/main/res/layout/fragment_game_info.xml b/src/android/app/src/main/res/layout/fragment_game_info.xml
index 80ede8a8c..53af15787 100644
--- a/src/android/app/src/main/res/layout/fragment_game_info.xml
+++ b/src/android/app/src/main/res/layout/fragment_game_info.xml
@@ -118,6 +118,14 @@
118 android:layout_marginTop="16dp" 118 android:layout_marginTop="16dp"
119 android:text="@string/copy_details" /> 119 android:text="@string/copy_details" />
120 120
121 <com.google.android.material.button.MaterialButton
122 android:id="@+id/button_verify_integrity"
123 style="@style/Widget.Material3.Button"
124 android:layout_width="wrap_content"
125 android:layout_height="wrap_content"
126 android:layout_marginTop="10dp"
127 android:text="@string/verify_integrity" />
128
121 </LinearLayout> 129 </LinearLayout>
122 130
123 </androidx.core.widget.NestedScrollView> 131 </androidx.core.widget.NestedScrollView>
diff --git a/src/android/app/src/main/res/layout/fragment_game_properties.xml b/src/android/app/src/main/res/layout/fragment_game_properties.xml
index 72ecbde30..cadd0bc4a 100644
--- a/src/android/app/src/main/res/layout/fragment_game_properties.xml
+++ b/src/android/app/src/main/res/layout/fragment_game_properties.xml
@@ -1,6 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<androidx.constraintlayout.widget.ConstraintLayout 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
5 xmlns:tools="http://schemas.android.com/tools" 4 xmlns:tools="http://schemas.android.com/tools"
6 android:layout_width="match_parent" 5 android:layout_width="match_parent"
@@ -22,16 +21,35 @@
22 android:orientation="vertical" 21 android:orientation="vertical"
23 android:gravity="center_horizontal"> 22 android:gravity="center_horizontal">
24 23
25 <Button 24 <androidx.constraintlayout.widget.ConstraintLayout
26 android:id="@+id/button_back" 25 android:layout_width="match_parent"
27 style="?attr/materialIconButtonStyle"
28 android:layout_width="wrap_content"
29 android:layout_height="wrap_content" 26 android:layout_height="wrap_content"
30 android:layout_margin="8dp" 27 android:layout_margin="8dp"
31 android:layout_gravity="start" 28 android:orientation="horizontal">
32 app:icon="@drawable/ic_back" 29
33 app:iconSize="24dp" 30 <Button
34 app:iconTint="?attr/colorOnSurface" /> 31 android:id="@+id/button_back"
32 style="?attr/materialIconButtonStyle"
33 android:layout_width="wrap_content"
34 android:layout_height="wrap_content"
35 app:icon="@drawable/ic_back"
36 app:iconSize="24dp"
37 app:iconTint="?attr/colorOnSurface"
38 app:layout_constraintStart_toStartOf="parent"
39 app:layout_constraintTop_toTopOf="parent" />
40
41 <Button
42 android:id="@+id/button_shortcut"
43 style="?attr/materialIconButtonStyle"
44 android:layout_width="wrap_content"
45 android:layout_height="wrap_content"
46 app:icon="@drawable/ic_shortcut"
47 app:iconSize="24dp"
48 app:iconTint="?attr/colorOnSurface"
49 app:layout_constraintEnd_toEndOf="parent"
50 app:layout_constraintTop_toTopOf="parent" />
51
52 </androidx.constraintlayout.widget.ConstraintLayout>
35 53
36 <com.google.android.material.card.MaterialCardView 54 <com.google.android.material.card.MaterialCardView
37 style="?attr/materialCardViewElevatedStyle" 55 style="?attr/materialCardViewElevatedStyle"
@@ -45,7 +63,7 @@
45 android:id="@+id/image_game_screen" 63 android:id="@+id/image_game_screen"
46 android:layout_width="175dp" 64 android:layout_width="175dp"
47 android:layout_height="175dp" 65 android:layout_height="175dp"
48 tools:src="@drawable/default_icon"/> 66 tools:src="@drawable/default_icon" />
49 67
50 </com.google.android.material.card.MaterialCardView> 68 </com.google.android.material.card.MaterialCardView>
51 69
diff --git a/src/android/app/src/main/res/layout/list_item_addon.xml b/src/android/app/src/main/res/layout/list_item_addon.xml
index 74ca04ef1..3a1382fe2 100644
--- a/src/android/app/src/main/res/layout/list_item_addon.xml
+++ b/src/android/app/src/main/res/layout/list_item_addon.xml
@@ -14,12 +14,11 @@
14 android:id="@+id/text_container" 14 android:id="@+id/text_container"
15 android:layout_width="0dp" 15 android:layout_width="0dp"
16 android:layout_height="wrap_content" 16 android:layout_height="wrap_content"
17 android:layout_marginEnd="16dp"
18 android:orientation="vertical" 17 android:orientation="vertical"
19 app:layout_constraintBottom_toBottomOf="@+id/addon_switch" 18 android:layout_marginEnd="16dp"
20 app:layout_constraintEnd_toStartOf="@+id/addon_switch" 19 app:layout_constraintEnd_toStartOf="@+id/addon_checkbox"
21 app:layout_constraintStart_toStartOf="parent" 20 app:layout_constraintStart_toStartOf="parent"
22 app:layout_constraintTop_toTopOf="@+id/addon_switch"> 21 app:layout_constraintTop_toTopOf="parent">
23 22
24 <com.google.android.material.textview.MaterialTextView 23 <com.google.android.material.textview.MaterialTextView
25 android:id="@+id/title" 24 android:id="@+id/title"
@@ -42,16 +41,29 @@
42 41
43 </LinearLayout> 42 </LinearLayout>
44 43
45 <com.google.android.material.materialswitch.MaterialSwitch 44 <com.google.android.material.checkbox.MaterialCheckBox
46 android:id="@+id/addon_switch" 45 android:id="@+id/addon_checkbox"
47 android:layout_width="wrap_content" 46 android:layout_width="wrap_content"
48 android:layout_height="wrap_content" 47 android:layout_height="wrap_content"
49 android:focusable="true" 48 android:focusable="true"
50 android:gravity="center" 49 android:gravity="center"
51 android:nextFocusLeft="@id/addon_container" 50 android:layout_marginEnd="8dp"
52 app:layout_constraintBottom_toBottomOf="parent" 51 app:layout_constraintTop_toTopOf="@+id/text_container"
52 app:layout_constraintBottom_toBottomOf="@+id/text_container"
53 app:layout_constraintEnd_toStartOf="@+id/button_delete" />
54
55 <Button
56 android:id="@+id/button_delete"
57 style="@style/Widget.Material3.Button.IconButton"
58 android:layout_width="wrap_content"
59 android:layout_height="wrap_content"
60 android:layout_gravity="center_vertical"
61 android:contentDescription="@string/delete"
62 android:tooltipText="@string/delete"
63 app:icon="@drawable/ic_delete"
64 app:iconTint="?attr/colorControlNormal"
53 app:layout_constraintEnd_toEndOf="parent" 65 app:layout_constraintEnd_toEndOf="parent"
54 app:layout_constraintStart_toEndOf="@id/text_container" 66 app:layout_constraintTop_toTopOf="@+id/addon_checkbox"
55 app:layout_constraintTop_toTopOf="parent" /> 67 app:layout_constraintBottom_toBottomOf="@+id/addon_checkbox" />
56 68
57</androidx.constraintlayout.widget.ConstraintLayout> 69</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/src/android/app/src/main/res/layout/list_item_setting.xml b/src/android/app/src/main/res/layout/list_item_setting.xml
index 1f80682f1..e13431497 100644
--- a/src/android/app/src/main/res/layout/list_item_setting.xml
+++ b/src/android/app/src/main/res/layout/list_item_setting.xml
@@ -69,7 +69,7 @@
69 android:layout_height="wrap_content" 69 android:layout_height="wrap_content"
70 android:layout_marginTop="16dp" 70 android:layout_marginTop="16dp"
71 android:visibility="gone" 71 android:visibility="gone"
72 android:text="@string/clear" 72 android:text="@string/use_global_setting"
73 tools:visibility="visible" /> 73 tools:visibility="visible" />
74 74
75 </LinearLayout> 75 </LinearLayout>
diff --git a/src/android/app/src/main/res/layout/list_item_setting_switch.xml b/src/android/app/src/main/res/layout/list_item_setting_switch.xml
index 1c08e2e1b..e23337058 100644
--- a/src/android/app/src/main/res/layout/list_item_setting_switch.xml
+++ b/src/android/app/src/main/res/layout/list_item_setting_switch.xml
@@ -63,7 +63,7 @@
63 android:layout_width="wrap_content" 63 android:layout_width="wrap_content"
64 android:layout_height="wrap_content" 64 android:layout_height="wrap_content"
65 android:layout_marginTop="16dp" 65 android:layout_marginTop="16dp"
66 android:text="@string/clear" 66 android:text="@string/use_global_setting"
67 android:visibility="gone" 67 android:visibility="gone"
68 tools:visibility="visible" /> 68 tools:visibility="visible" />
69 69
diff --git a/src/android/app/src/main/res/menu/menu_driver_manager.xml b/src/android/app/src/main/res/menu/menu_driver_manager.xml
index dee5d57b6..0876c2194 100644
--- a/src/android/app/src/main/res/menu/menu_driver_manager.xml
+++ b/src/android/app/src/main/res/menu/menu_driver_manager.xml
@@ -1,11 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<menu xmlns:android="http://schemas.android.com/apk/res/android" 2<menu xmlns:android="http://schemas.android.com/apk/res/android">
3 xmlns:app="http://schemas.android.com/apk/res-auto">
4 3
5 <item 4 <item
6 android:id="@+id/menu_driver_clear" 5 android:id="@+id/menu_driver_use_global"
7 android:icon="@drawable/ic_clear" 6 android:title="@string/use_global_setting" />
8 android:title="@string/clear"
9 app:showAsAction="always" />
10 7
11</menu> 8</menu>
diff --git a/src/android/app/src/main/res/menu/menu_in_game.xml b/src/android/app/src/main/res/menu/menu_in_game.xml
index ac6ab06ff..eecb0563b 100644
--- a/src/android/app/src/main/res/menu/menu_in_game.xml
+++ b/src/android/app/src/main/res/menu/menu_in_game.xml
@@ -22,6 +22,11 @@
22 android:title="@string/emulation_input_overlay" /> 22 android:title="@string/emulation_input_overlay" />
23 23
24 <item 24 <item
25 android:id="@+id/menu_lock_drawer"
26 android:icon="@drawable/ic_unlock"
27 android:title="@string/emulation_input_overlay" />
28
29 <item
25 android:id="@+id/menu_exit" 30 android:id="@+id/menu_exit"
26 android:icon="@drawable/ic_exit" 31 android:icon="@drawable/ic_exit"
27 android:title="@string/emulation_exit" /> 32 android:title="@string/emulation_exit" />
diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml
index 07dffffe8..53678f465 100644
--- a/src/android/app/src/main/res/values-ar/strings.xml
+++ b/src/android/app/src/main/res/values-ar/strings.xml
@@ -3,38 +3,39 @@
3 3
4 <string name="emulation_notification_channel_name">المحاكي نشط</string> 4 <string name="emulation_notification_channel_name">المحاكي نشط</string>
5 <string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string> 5 <string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string>
6 <string name="emulation_notification_running">يوزو يعÙÙ„</string> 6 <string name="emulation_notification_running">يوزو قيد التشغيل</string>
7 <string name="notice_notification_channel_name">الإشعارات والأخطاء</string> 7 <string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
8 <string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string> 8 <string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string>
9 <string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string> 9 <string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string>
10 10
11 <!-- Setup strings --> 11 <!-- Setup strings -->
12 <string name="welcome">مرحبًا</string> 12 <string name="welcome">مرحبا</string>
13 <string name="welcome_description">والانتقال إلى المحاكاة <b>يوزو</b> تعر٠على كيÙية إعداد.</string> 13 <string name="welcome_description">تعر٠على كيÙية إعداد <b>يوزو</b> والانتقال إلى المحاكاة</string>
14 <string name="get_started">لنبدأ</string> 14 <string name="get_started">لنبدأ</string>
15 <string name="keys">Ø§Ù„Ù…ÙØ§ØªÙŠØ­</string> 15 <string name="keys">Ø§Ù„Ù…ÙØ§ØªÙŠØ­</string>
16 <string name="keys_description">اختر مل٠&lt;b>prod.keys&lt;/b> من الزر ادناه</string> 16 <string name="keys_description">اختر مل٠&lt;b>prod.keys&lt;/b> من الزر ادناه</string>
17 <string name="select_keys">إختيار Ø§Ù„Ù…ÙØ§ØªÙŠØ­</string> 17 <string name="select_keys">إختيار Ø§Ù„Ù…ÙØ§ØªÙŠØ­</string>
18 <string name="games">الألعاب</string> 18 <string name="games">الألعاب</string>
19 <string name="games_description">اختر مجلد &lt;b>العابك&lt;/b> من الزر ادناه.</string> 19 <string name="games_description">حدد مجلد &lt;b>العابك&lt;/b> من الزر ادناه.</string>
20 <string name="done">إنهاء</string> 20 <string name="done">إنهاء</string>
21 <string name="done_description">كل شيء جاهز./n استمتع بألعابك!</string> 21 <string name="done_description">Ø£ÙØª جاهز تمامًا. استمتع بألعابك!</string>
22 <string name="text_continue">استمر</string> 22 <string name="text_continue">استمر</string>
23 <string name="next">التالي</string> 23 <string name="next">التالي</string>
24 <string name="back">عودة</string> 24 <string name="back">عودة</string>
25 <string name="add_games">Ø¥Ø¶Ø§ÙØ© ألعاب</string> 25 <string name="add_games">Ø¥Ø¶Ø§ÙØ© ألعاب</string>
26 <string name="add_games_description">إختار مجلد ألعابك</string> 26 <string name="add_games_description">حدد مجلد الألعاب الخاص بك</string>
27 <string name="step_complete">مكتمل</string> 27 <string name="step_complete">مكتمل</string>
28 28
29 <!-- Home strings --> 29 <!-- Home strings -->
30 <string name="home_games">الألعاب</string> 30 <string name="home_games">الألعاب</string>
31 <string name="home_search">البحث</string> 31 <string name="home_search">البحث</string>
32 <string name="home_settings">الإعدادات</string> 32 <string name="home_settings">الإعدادات</string>
33 <string name="empty_gamelist">لم يتم العثور على Ù…Ù„ÙØ§Øª او لم يتم تحديد مسار العاب.</string> 33 <string name="empty_gamelist">لم يتم العثور على Ù…Ù„ÙØ§Øª أو لم يتم تحديد مجلد الألعاب حتى الآن.</string>
34 <string name="search_and_filter_games">بحث وتصÙية الألعاب</string> 34 <string name="search_and_filter_games">البحث وتصÙية الألعاب</string>
35 <string name="select_games_folder">تحديد مجلد الألعاب</string> 35 <string name="select_games_folder">حدد مجلد الألعاب</string>
36 <string name="manage_game_folders">إدارة مجلدات اللعبة</string>
36 <string name="select_games_folder_description">يسمح لـ يوزو بملء قائمة الألعاب</string> 37 <string name="select_games_folder_description">يسمح لـ يوزو بملء قائمة الألعاب</string>
37 <string name="add_games_warning">تخط٠اختيار مجلد الالعاب؟</string> 38 <string name="add_games_warning">تخطي تحديد مجلد الألعاب؟</string>
38 <string name="add_games_warning_description">لن يتم عرض الألعاب ÙÙŠ قائمة الألعاب إذا لم يتم تحديد مجلد</string> 39 <string name="add_games_warning_description">لن يتم عرض الألعاب ÙÙŠ قائمة الألعاب إذا لم يتم تحديد مجلد</string>
39 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> 40 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
40 <string name="home_search_games">البحث عن ألعاب</string> 41 <string name="home_search_games">البحث عن ألعاب</string>
@@ -45,7 +46,7 @@
45 <string name="install_prod_keys_warning">تخطي Ø¥Ø¶Ø§ÙØ© Ø§Ù„Ù…ÙØ§ØªÙŠØ­ØŸ</string> 46 <string name="install_prod_keys_warning">تخطي Ø¥Ø¶Ø§ÙØ© Ø§Ù„Ù…ÙØ§ØªÙŠØ­ØŸ</string>
46 <string name="install_prod_keys_warning_description">مطلوب Ù…ÙØ§ØªÙŠØ­ صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية Ùقط إذا تابعت</string> 47 <string name="install_prod_keys_warning_description">مطلوب Ù…ÙØ§ØªÙŠØ­ صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية Ùقط إذا تابعت</string>
47 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> 48 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
48 <string name="notifications">التنبيهات</string> 49 <string name="notifications">الإشعارات</string>
49 <string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string> 50 <string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string>
50 <string name="give_permission">منح الإذن</string> 51 <string name="give_permission">منح الإذن</string>
51 <string name="notification_warning">تخطي منح إذن الإشعارات؟</string> 52 <string name="notification_warning">تخطي منح إذن الإشعارات؟</string>
@@ -62,9 +63,12 @@
62 <string name="invalid_keys_file">تم تحديد Ù…Ù„Ù Ù…ÙØ§ØªÙŠØ­ غير صالح</string> 63 <string name="invalid_keys_file">تم تحديد Ù…Ù„Ù Ù…ÙØ§ØªÙŠØ­ غير صالح</string>
63 <string name="install_keys_success">تم تثبيت Ø§Ù„Ù…ÙØ§ØªÙŠØ­ بنجاح</string> 64 <string name="install_keys_success">تم تثبيت Ø§Ù„Ù…ÙØ§ØªÙŠØ­ بنجاح</string>
64 <string name="reading_keys_failure">خطأ ÙÙŠ قراءة Ù…ÙØ§ØªÙŠØ­ التشÙير</string> 65 <string name="reading_keys_failure">خطأ ÙÙŠ قراءة Ù…ÙØ§ØªÙŠØ­ التشÙير</string>
66 <string name="install_prod_keys_failure_extension_description">وحاول مرة أخر keys تحقق من أن Ù…Ù„Ù Ø§Ù„Ù…ÙØ§ØªÙŠØ­ له امتداد</string>
67 <string name="install_amiibo_keys_failure_extension_description">وحاول مرة أخر bin تحقق من أن Ù…Ù„Ù Ø§Ù„Ù…ÙØ§ØªÙŠØ­ له امتداد</string>
65 <string name="invalid_keys_error">Ù…ÙØ§ØªÙŠØ­ التشÙير غير صالحة</string> 68 <string name="invalid_keys_error">Ù…ÙØ§ØªÙŠØ­ التشÙير غير صالحة</string>
66 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
67 <string name="install_keys_failure_description">المل٠المحدد غير صحيح أو تالÙ. يرجى إعادة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ الخاصة بك</string> 70 <string name="install_keys_failure_description">المل٠المحدد غير صحيح أو تالÙ. يرجى إعادة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ الخاصة بك</string>
71 <string name="gpu_driver_manager">GPU مدير برنامج تشغيل</string>
68 <string name="install_gpu_driver">GPU تثبيت برنامج تشغيل</string> 72 <string name="install_gpu_driver">GPU تثبيت برنامج تشغيل</string>
69 <string name="install_gpu_driver_description">قم بتثبيت برامج تشغيل بديلة للحصول على أداء أو دقة Ø£ÙØ¶Ù„</string> 73 <string name="install_gpu_driver_description">قم بتثبيت برامج تشغيل بديلة للحصول على أداء أو دقة Ø£ÙØ¶Ù„</string>
70 <string name="advanced_settings">إعدادات متقدمة</string> 74 <string name="advanced_settings">إعدادات متقدمة</string>
@@ -82,22 +86,27 @@
82 <string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير Ø§Ù„Ù…Ù„ÙØ§Øª يدويًا</string> 86 <string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير Ø§Ù„Ù…Ù„ÙØ§Øª يدويًا</string>
83 <string name="manage_save_data">إدارة Ø­ÙØ¸ البيانات</string> 87 <string name="manage_save_data">إدارة Ø­ÙØ¸ البيانات</string>
84 <string name="manage_save_data_description">Ø­ÙØ¸ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string> 88 <string name="manage_save_data_description">Ø­ÙØ¸ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string>
89 <string name="import_save_warning">استيراد Ø­ÙØ¸ البيانات</string>
90 <string name="import_save_warning_description">سيؤدي هذا إلى استبدال جميع بيانات Ø§Ù„Ø­ÙØ¸ الموجودة بالمل٠المقدم. هل أنت متأكد أنك تريد الاستمرار؟</string>
85 <string name="import_export_saves_description">استيراد أو تصدير Ù…Ù„ÙØ§Øª Ø§Ù„Ø­ÙØ¸</string> 91 <string name="import_export_saves_description">استيراد أو تصدير Ù…Ù„ÙØ§Øª Ø§Ù„Ø­ÙØ¸</string>
92 <string name="save_files_importing">جاري استيراد Ù…Ù„ÙØ§Øª Ø§Ù„Ø­ÙØ¸</string>
93 <string name="save_files_exporting">جاري تصدير Ù…Ù„ÙØ§Øª Ø§Ù„Ø­ÙØ¸</string>
86 <string name="save_file_imported_success">تم الاستيراد بنجاح</string> 94 <string name="save_file_imported_success">تم الاستيراد بنجاح</string>
87 <string name="save_file_invalid_zip_structure">بنية مجلد Ø§Ù„Ø­ÙØ¸ غير صالحة</string> 95 <string name="save_file_invalid_zip_structure">بنية مجلد Ø§Ù„Ø­ÙØ¸ غير صالحة</string>
88 <string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø£ÙˆÙ„ هو معر٠عنوان اللعبة.</string> 96 <string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø£ÙˆÙ„ هو معر٠عنوان اللعبة.</string>
89 <string name="import_saves">استيراد</string> 97 <string name="import_saves">استيراد</string>
90 <string name="export_saves">تصدير</string> 98 <string name="export_saves">تصدير</string>
91 <string name="install_firmware">تثبيت البرامج الثابتة</string> 99 <string name="install_firmware">تثبيت Ùيرموير</string>
92 <string name="firmware_installing">تثبيت البرامج الثابتة</string> 100 <string name="install_firmware_description">يجب أن يكون Ùيرموير ÙÙŠ أرشي٠مضغوط وهو ضروري لتشغيل بعض الألعاب</string>
93 <string name="firmware_installed_success">تم تثبيت البرامج الثابتة بنجاح</string> 101 <string name="firmware_installing">تثبيت Ùيرموير</string>
94 <string name="firmware_installed_failure">ÙØ´Ù„ تثبيت البرامج الثابتة</string> 102 <string name="firmware_installed_success">تم تثبيت Ùيرموير بنجاح</string>
103 <string name="firmware_installed_failure">ÙØ´Ù„ تثبيت Ùيرموير</string>
95 <string name="share_log">مشاركة سجلات التصحيح</string> 104 <string name="share_log">مشاركة سجلات التصحيح</string>
96 <string name="share_log_description">مشاركة مل٠سجل يوزو لتصحيح المشكلات</string> 105 <string name="share_log_description">مشاركة مل٠سجل يوزو لتصحيح المشكلات</string>
97 <string name="share_log_missing">لم يتم العثور على مل٠السجل</string> 106 <string name="share_log_missing">لم يتم العثور على مل٠السجل</string>
98 <string name="install_game_content">تثبيت محتوى اللعبة</string> 107 <string name="install_game_content">تثبيت محتوى اللعبة</string>
99 <string name="install_game_content_description">DLC قم بتثبيت تحديثات اللعبة أو</string> 108 <string name="install_game_content_description">DLC قم بتثبيت تحديثات اللعبة أو</string>
100 <string name="installing_game_content">جار٠تثبيت المحتوى</string> 109 <string name="installing_game_content">جاري تثبيت المحتوى</string>
101 <string name="install_game_content_failure_base">لا ÙŠÙØ³Ù…Ø­ بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string> 110 <string name="install_game_content_failure_base">لا ÙŠÙØ³Ù…Ø­ بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string>
102 <string name="install_game_content_success_install">%1$d تم التثبيت بنجاح</string> 111 <string name="install_game_content_success_install">%1$d تم التثبيت بنجاح</string>
103 <string name="install_game_content_success_overwrite">%1$d تمت الكتابة Ùوقه بنجاح</string> 112 <string name="install_game_content_success_overwrite">%1$d تمت الكتابة Ùوقه بنجاح</string>
@@ -105,19 +114,39 @@
105 <string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string> 114 <string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string>
106 <string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى ÙÙŠ المستقبل Ù„Ù…Ø¹Ø±ÙØ© ما إذا تمت Ø¥Ø¶Ø§ÙØ© الدعم!</string> 115 <string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى ÙÙŠ المستقبل Ù„Ù…Ø¹Ø±ÙØ© ما إذا تمت Ø¥Ø¶Ø§ÙØ© الدعم!</string>
107 <string name="manage_yuzu_data">إدارة بيانات يوزو</string> 116 <string name="manage_yuzu_data">إدارة بيانات يوزو</string>
108 <string name="manage_yuzu_data_description">استيراد/تصدير البرامج الثابتة ÙˆØ§Ù„Ù…ÙØ§ØªÙŠØ­ وبيانات المستخدم والمزيد!</string> 117 <string name="manage_yuzu_data_description">استيراد/تصدير Ùيرموير ÙˆØ§Ù„Ù…ÙØ§ØªÙŠØ­ وبيانات المستخدم والمزيد</string>
109 <string name="share_save_file">مشاركة Ù…Ù„Ù Ø§Ù„Ø­ÙØ¸</string> 118 <string name="share_save_file">مشاركة Ù…Ù„Ù Ø§Ù„Ø­ÙØ¸</string>
110 <string name="export_save_failed">ÙØ´Ù„ تصدير Ø§Ù„Ø­ÙØ¸</string> 119 <string name="export_save_failed">ÙØ´Ù„ تصدير Ø§Ù„Ø­ÙØ¸</string>
111 120 <string name="game_folders">مجلدات اللعبة</string>
121 <string name="deep_scan">ÙØ­Øµ عميق</string>
122 <string name="add_game_folder">Ø¥Ø¶Ø§ÙØ© مجلد اللعبة</string>
123 <string name="folder_already_added">تمت Ø¥Ø¶Ø§ÙØ© هذا المجلد Ø¨Ø§Ù„ÙØ¹Ù„</string>
124 <string name="game_folder_properties">خصائص مجلد اللعبة</string>
125 <string name="no_save_data_found">لم يتم العثور على بيانات Ø§Ù„Ø­ÙØ¸</string>
126
127 <!-- Applet launcher strings -->
128 <string name="applets">قائمة التطبيقات المصغرة</string>
129 <string name="applets_description">قم بتشغيل تطبيقات النظام باستخدام Ùيرموير المثبت</string>
130 <string name="applets_error_firmware">Ùيرموير غير مثبت</string>
131 <string name="applets_error_applet">التطبيق المصغر غير Ù…ØªÙˆÙØ±</string>
132 <string name="album_applet">الألبوم</string>
133 <string name="album_applet_description">شاهد الصور المخزنة ÙÙŠ مجلد لقطات شاشة المستخدم باستخدام عارض صور النظام</string>
134 <string name="mii_edit_applet">تحرير Mii</string>
135 <string name="mii_edit_applet_description">باستخدام محرر النظام Miis عرض وتحرير</string>
136 <string name="cabinet_applet_description">تحرير وحذ٠البيانات المخزنة على أميبو</string>
137 <string name="cabinet_nickname_and_owner">إعدادات الاسم المستعار والمالك</string>
138 <string name="cabinet_game_data_eraser">ممحاة بيانات اللعبة</string>
112 <string name="copied_to_clipboard">نسخ إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©</string> 139 <string name="copied_to_clipboard">نسخ إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©</string>
113 <string name="about_app_description">محاكي سويتش Ù…ÙØªÙˆØ­ المصدر</string> 140 <string name="about_app_description">محاكي سويتش Ù…ÙØªÙˆØ­ المصدر</string>
114 <string name="contributors">المساهمين</string> 141 <string name="contributors">المساهمين</string>
142 <string name="contributors_description">مصنوع من ÙØ±ÙŠÙ‚ يوزو</string>
115 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> 143 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
116 <string name="licenses_description">المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا</string> 144 <string name="licenses_description">المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا</string>
117 <string name="build">البناء</string> 145 <string name="build">البناء</string>
118 <string name="user_data">بيانات المستخدم</string> 146 <string name="user_data">بيانات المستخدم</string>
119 <string name="exporting_user_data">جار٠تصدير بيانات المستخدم</string> 147 <string name="user_data_description">استيراد/تصدير جميع بيانات التطبيق. عند استيراد بيانات المستخدم، سيتم حذ٠جميع بيانات المستخدم الحالية!</string>
120 <string name="importing_user_data">جار٠استيراد بيانات المستخدم</string> 148 <string name="exporting_user_data">جاري تصدير بيانات المستخدم</string>
149 <string name="importing_user_data">جاري استيراد بيانات المستخدم</string>
121 <string name="import_user_data">استيراد بيانات المستخدم</string> 150 <string name="import_user_data">استيراد بيانات المستخدم</string>
122 <string name="invalid_yuzu_backup">نسخة احتياطية يوزو غير صالحة</string> 151 <string name="invalid_yuzu_backup">نسخة احتياطية يوزو غير صالحة</string>
123 <string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string> 152 <string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string>
@@ -153,7 +182,7 @@
153 <string name="use_docked_mode">وضع الإرساء</string> 182 <string name="use_docked_mode">وضع الإرساء</string>
154 <string name="use_docked_mode_description">زيادة الدقة، ÙˆØ§Ù†Ø®ÙØ§Ø¶ الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى Ø®ÙØ¶ الدقة وزيادة الأداء.</string> 183 <string name="use_docked_mode_description">زيادة الدقة، ÙˆØ§Ù†Ø®ÙØ§Ø¶ الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى Ø®ÙØ¶ الدقة وزيادة الأداء.</string>
155 <string name="emulated_region">المنطقة التي تمت محاكاتها</string> 184 <string name="emulated_region">المنطقة التي تمت محاكاتها</string>
156 <string name="emulated_language">لغة المحاكاه</string> 185 <string name="emulated_language">لغة المحاكاة</string>
157 <string name="select_rtc_date">حدد التاريخ Ùˆ الساعة ÙÙŠ الوقت الحقيقي</string> 186 <string name="select_rtc_date">حدد التاريخ Ùˆ الساعة ÙÙŠ الوقت الحقيقي</string>
158 <string name="select_rtc_time">حدد وقت الساعة ÙÙŠ الوقت Ø§Ù„ÙØ¹Ù„ÙŠ</string> 187 <string name="select_rtc_time">حدد وقت الساعة ÙÙŠ الوقت Ø§Ù„ÙØ¹Ù„ÙŠ</string>
159 <string name="use_custom_rtc">ساعة مخصصة ÙÙŠ الوقت الحقيقي</string> 188 <string name="use_custom_rtc">ساعة مخصصة ÙÙŠ الوقت الحقيقي</string>
@@ -164,7 +193,7 @@
164 <string name="renderer_accuracy">مستوى الدقة</string> 193 <string name="renderer_accuracy">مستوى الدقة</string>
165 <string name="renderer_resolution">(Handheld/Docked) الدقة</string> 194 <string name="renderer_resolution">(Handheld/Docked) الدقة</string>
166 <string name="renderer_vsync">VSync وضع</string> 195 <string name="renderer_vsync">VSync وضع</string>
167 <string name="renderer_screen_layout">الاتجاه</string> 196 <string name="renderer_screen_layout">اتجاه العرض</string>
168 <string name="renderer_aspect_ratio">تناسب الابعاد</string> 197 <string name="renderer_aspect_ratio">تناسب الابعاد</string>
169 <string name="renderer_anti_aliasing">طريقة Ù…ÙƒØ§ÙØ­Ø© التعرج</string> 198 <string name="renderer_anti_aliasing">طريقة Ù…ÙƒØ§ÙØ­Ø© التعرج</string>
170 <string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string> 199 <string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
@@ -172,31 +201,32 @@
172 <string name="renderer_reactive_flushing">استخدم Ø§Ù„ØªÙ†Ø¸ÙŠÙ Ø§Ù„ØªÙØ§Ø¹Ù„ÙŠ</string> 201 <string name="renderer_reactive_flushing">استخدم Ø§Ù„ØªÙ†Ø¸ÙŠÙ Ø§Ù„ØªÙØ§Ø¹Ù„ÙŠ</string>
173 <string name="renderer_reactive_flushing_description">تحسين دقة العرض ÙÙŠ بعض الألعاب على حساب الأداء</string> 202 <string name="renderer_reactive_flushing_description">تحسين دقة العرض ÙÙŠ بعض الألعاب على حساب الأداء</string>
174 <string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string> 203 <string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string>
175
176 <!-- Debug settings strings --> 204 <!-- Debug settings strings -->
177 <string name="cpu">وحدة المعالج المركزية</string> 205 <string name="cpu">وحدة المعالج المركزية</string>
178 <string name="cpu_debug_mode">تصحيح أخطاء وحدة المعالجة المركزية</string> 206 <string name="cpu_debug_mode">تصحيح أخطاء وحدة المعالجة المركزية</string>
179 <string name="cpu_debug_mode_description">يضع وحدة المعالجة المركزية ÙÙŠ وضع التصحيح البطيء.</string> 207 <string name="cpu_debug_mode_description">يضع وحدة المعالجة المركزية ÙÙŠ وضع التصحيح البطيء.</string>
180 <string name="gpu">GPU</string> 208 <string name="gpu">وحدة معالجة الرسومات</string>
181 <string name="renderer_api">API</string> 209 <string name="renderer_api">واجهة برمجة التطبيقات</string>
182 <string name="renderer_debug">تصحيح الأخطاء الرسومية</string> 210 <string name="renderer_debug">تصحيح الأخطاء الرسومية</string>
183 <string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string> 211 <string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string>
184 <string name="fastmem">Fastmem</string> 212 <string name="fastmem">Fastmem</string>
185 213
186 <!-- Audio settings strings --> 214 <!-- Audio settings strings -->
187 <string name="audio_output_engine">محرك الإخراج</string> 215 <string name="audio_output_engine">محرك الإخراج</string>
188 <string name="audio_volume">حجÙ</string> 216 <string name="audio_volume">مستوى الصوت</string>
189 <string name="audio_volume_description">يحدد حج٠إخراج الصوت</string> 217 <string name="audio_volume_description">يحدد مستوى إخراج الصوت</string>
190 218
191 <!-- Miscellaneous --> 219 <!-- Miscellaneous -->
192 <string name="slider_default">Ø§ÙØªØ±Ø§Ø¶ÙŠ</string> 220 <string name="slider_default">Ø§ÙØªØ±Ø§Ø¶ÙŠ</string>
193 <string name="ini_saved">الإعدادات المحÙوظة</string> 221 <string name="ini_saved">الإعدادات المحÙوظة</string>
194 <string name="gameid_saved">الإعدادات المحÙوظة لـ %1$s</string> 222 <string name="gameid_saved">الإعدادات المحÙوظة لـ %1$s</string>
223 <string name="error_saving">خطأ ÙÙŠ Ø­ÙØ¸ %1$s.ini: %2$s</string>
195 <string name="unimplemented_menu">القائمة غير Ø§Ù„Ù…Ù†ÙØ°Ø©</string> 224 <string name="unimplemented_menu">القائمة غير Ø§Ù„Ù…Ù†ÙØ°Ø©</string>
196 <string name="loading">جاري تحميل</string> 225 <string name="loading">جاري التحميل</string>
197 <string name="shutting_down">إيقا٠تشغيل</string> 226 <string name="shutting_down">إيقا٠التشغيل</string>
198 <string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©ØŸ</string> 227 <string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©ØŸ</string>
199 <string name="reset_to_default">إعادة تعيين إلى Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ</string> 228 <string name="reset_to_default">إعادة التعيين إلى الوضع Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ</string>
229 <string name="reset_to_default_description">إعادة تعيين جميع الإعدادات المتقدمة</string>
200 <string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string> 230 <string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string>
201 <string name="reset_all_settings_description">سيتم إعادة تعيين ÙƒØ§ÙØ© الإعدادات المتقدمة إلى تكوينها Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ. هذا لا يمكن التراجع عنها.</string> 231 <string name="reset_all_settings_description">سيتم إعادة تعيين ÙƒØ§ÙØ© الإعدادات المتقدمة إلى تكوينها Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ. هذا لا يمكن التراجع عنها.</string>
202 <string name="settings_reset">إعادة تعيين الأعدادات</string> 232 <string name="settings_reset">إعادة تعيين الأعدادات</string>
@@ -204,32 +234,77 @@
204 <string name="learn_more">Ù…Ø¹Ø±ÙØ© المزيد</string> 234 <string name="learn_more">Ù…Ø¹Ø±ÙØ© المزيد</string>
205 <string name="auto">تلقائي</string> 235 <string name="auto">تلقائي</string>
206 <string name="submit">إرسال</string> 236 <string name="submit">إرسال</string>
207 <string name="string_null">قيمه خاليه</string> 237 <string name="string_null">ÙØ§ شيء</string>
208 <string name="string_import">استيراد</string> 238 <string name="string_import">استيراد</string>
209 <string name="export">تصدير</string> 239 <string name="export">تصدير</string>
210 <string name="export_failed">ÙØ´Ù„ التصدير</string> 240 <string name="export_failed">ÙØ´Ù„ التصدير</string>
211 <string name="import_failed">ÙØ´Ù„ الاستيراد</string> 241 <string name="import_failed">ÙØ´Ù„ الاستيراد</string>
212 <string name="cancelling">إلغاء</string> 242 <string name="cancelling">إلغاء</string>
213 243 <string name="install">تثبيت</string>
244 <string name="delete">حذÙ</string>
245 <string name="edit">حرر</string>
246 <string name="export_success">تم التصدير بنجاح</string>
247 <string name="start">Start</string>
248 <string name="clear">مسح</string>
249 <string name="global">عالمي</string>
250 <string name="custom">مخصص</string>
251 <string name="notice">إشعار</string>
252 <string name="import_complete">اكتمل الاستيراد</string>
214 <!-- GPU driver installation --> 253 <!-- GPU driver installation -->
215 <string name="select_gpu_driver">GPU حدد برنامج تشغيل</string> 254 <string name="select_gpu_driver">GPU حدد برنامج تشغيل</string>
216 <string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب ÙÙŠ استبدال برنامج تشغيل</string> 255 <string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب ÙÙŠ استبدال برنامج تشغيل</string>
217 <string name="select_gpu_driver_install">تثبيت</string> 256 <string name="select_gpu_driver_install">تثبيت</string>
218 <string name="select_gpu_driver_default">Ø§ÙØªØ±Ø§Ø¶ÙŠ</string> 257 <string name="select_gpu_driver_default">Ø§ÙØªØ±Ø§Ø¶ÙŠ</string>
219 <string name="select_gpu_driver_use_default">يستخدم تعري٠معالج الرسوميات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ</string> 258 <string name="select_gpu_driver_use_default">يستخدم تعري٠معالج الرسومات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ</string>
220 <string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح ØŒ باستخدام النظام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ</string> 259 <string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح</string>
221 <string name="system_gpu_driver">تعري٠معالج الرسوميات الخاص بالنظام</string> 260 <string name="driver_already_installed">برنامج التشغيل مثبت Ø¨Ø§Ù„ÙØ¹Ù„</string>
222 <string name="installing_driver">جار٠تثبيت برنامج التشغيل…</string> 261 <string name="system_gpu_driver">تعري٠معالج الرسومات الخاص بالنظام</string>
262 <string name="installing_driver">جاري تثبيت برنامج التشغيل…</string>
223 263
224 <!-- Preferences Screen --> 264 <!-- Preferences Screen -->
225 <string name="preferences_settings">إعدادات</string> 265 <string name="preferences_settings">إعدادات</string>
226 <string name="preferences_general">عام</string> 266 <string name="preferences_general">عام</string>
227 <string name="preferences_system">النظام</string> 267 <string name="preferences_system">النظام</string>
228 <string name="preferences_graphics">الرسوميات</string> 268 <string name="preferences_system_description">وضع الإرساء ،المنطقة ،اللغة</string>
269 <string name="preferences_graphics">الرسومات</string>
270 <string name="preferences_graphics_description">مستوى الدقة ،الدقة ،ذاكرة التخزين المؤقت للتظليل</string>
229 <string name="preferences_audio">الصوت</string> 271 <string name="preferences_audio">الصوت</string>
272 <string name="preferences_audio_description">محرك الإخراج ، حجم الصوت</string>
230 <string name="preferences_theme">السمة واللون</string> 273 <string name="preferences_theme">السمة واللون</string>
231 <string name="preferences_debug">تصحيح الأخطاء</string> 274 <string name="preferences_debug">تصحيح الأخطاء</string>
232 275 <!-- Game properties -->
276 <string name="info">معلومات</string>
277 <string name="info_description">معر٠البرنامج، المطور، الإصدار</string>
278 <string name="per_game_settings">إعدادات كل لعبة</string>
279 <string name="per_game_settings_description">تحرير الإعدادات الخاصة بهذه اللعبة</string>
280 <string name="launch_options">تشغيل الإعدادات</string>
281 <string name="path">المسار</string>
282 <string name="program_id">معر٠البرنامج</string>
283 <string name="developer">المطور</string>
284 <string name="version">إصدار</string>
285 <string name="copy_details">نسخ Ø§Ù„ØªÙØ§ØµÙŠÙ„</string>
286 <string name="add_ons">Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª</string>
287 <string name="add_ons_description">DLCالتعديلات والتحديثات و</string>
288 <string name="clear_shader_cache">مسح ذاكرة التخزين المؤقت للتظليل</string>
289 <string name="clear_shader_cache_description">يزيل جميع التظليلات التي تم إنشاؤها أثناء لعب هذه اللعبة</string>
290 <string name="clear_shader_cache_warning_description">سو٠تواجه المزيد من التأتأة مع تجديد ذاكرة التخزين المؤقت للتظليل</string>
291 <string name="cleared_shaders_successfully">تم مسح التظليل بنجاح</string>
292 <string name="addons_game">Ø¥Ø¶Ø§ÙØ§Øª: %1$s</string>
293 <string name="save_data">Ø­ÙØ¸ البيانات</string>
294 <string name="save_data_description">إدارة Ø­ÙØ¸ البيانات الخاصة بهذه اللعبة</string>
295 <string name="delete_save_data">Ø­Ø°Ù Ø­ÙØ¸ البيانات</string>
296 <string name="delete_save_data_description">يزيل ÙƒØ§ÙØ© البيانات المحÙوظة الخاصة بهذه اللعبة</string>
297 <string name="delete_save_data_warning_description">يؤدي هذا إلى إزالة ÙƒØ§ÙØ© البيانات المحÙوظة لهذه اللعبة بشكل لا يمكن استرداده. هل أنت متأكد أنك تريد الاستمرار؟</string>
298 <string name="save_data_deleted_successfully">Ø­ÙØ¸ البيانات تم حذÙها بنجاح</string>
299 <string name="select_content_type">نوع المحتوى</string>
300 <string name="updates_and_dlc">DLC التحديثات والمحتوى القابل للتنزيل </string>
301 <string name="mods_and_cheats">تعديل وغش</string>
302 <string name="addon_notice">إشعار إضاÙÙŠ مهم</string>
303 <string name="invalid_directory">مجلد غير صالح</string>
304 <string name="addon_installed_successfully">تم تثبيت الملحق بنجاح</string>
305 <string name="verifying_content">جاري التحقق من المحتوى</string>
306 <string name="content_install_notice">إشعار تثبيت المحتوى</string>
307 <string name="content_install_notice_description">المحتوى الذي حددته لا يتطابق مع هذه اللعبة.هل تريد التثبيت على أية حال؟</string>
233 <!-- ROM loading errors --> 308 <!-- ROM loading errors -->
234 <string name="loader_error_encrypted">الخاص بك ROM تم تشÙير</string> 309 <string name="loader_error_encrypted">الخاص بك ROM تم تشÙير</string>
235 <string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الÙيديو</string> 310 <string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الÙيديو</string>
@@ -238,24 +313,25 @@
238 313
239 <!-- Emulation Menu --> 314 <!-- Emulation Menu -->
240 <string name="emulation_exit">الخروج من المحاكاة</string> 315 <string name="emulation_exit">الخروج من المحاكاة</string>
241 <string name="emulation_done">منجز</string> 316 <string name="emulation_done">إنهاء</string>
242 <string name="emulation_fps_counter">عداد إطار/ثانية</string> 317 <string name="emulation_fps_counter">عداد إطار/ثانية</string>
243 <string name="emulation_toggle_controls">تبديل عناصر التحكم</string> 318 <string name="emulation_toggle_controls">عناصر التحكم</string>
244 <string name="emulation_rel_stick_center">مركز العصا النسبي</string> 319 <string name="emulation_rel_stick_center">مركز العصا النسبي</string>
245 <string name="emulation_dpad_slide">مزلاق أزرار الاتجاهات</string> 320 <string name="emulation_dpad_slide">مزلاق الأسهم</string>
246 <string name="emulation_haptics">الاهتزازات الديناميكية</string> 321 <string name="emulation_haptics">الاهتزازات الديناميكية</string>
247 <string name="emulation_show_overlay">عرض التراكب</string> 322 <string name="emulation_show_overlay">عرض التراكب</string>
248 <string name="emulation_toggle_all">تبديل الكل</string> 323 <string name="emulation_toggle_all">الكل</string>
249 <string name="emulation_control_adjust">ضبط التراكب</string> 324 <string name="emulation_control_adjust">ضبط التراكب</string>
250 <string name="emulation_control_scale">حجم</string> 325 <string name="emulation_control_scale">الحجم</string>
251 <string name="emulation_control_opacity">العتاÙÙ</string> 326 <string name="emulation_control_opacity">Ø§Ù„Ø´ÙØ§Ùية</string>
252 <string name="emulation_touch_overlay_reset">إعادة تعيين التراكب</string> 327 <string name="emulation_touch_overlay_reset">إعادة تعيين التراكب</string>
253 <string name="emulation_touch_overlay_edit">تحرير التراكب</string> 328 <string name="emulation_touch_overlay_edit">تحرير التراكب</string>
254 <string name="emulation_pause">إيقا٠المحاكاة مؤقتًا</string> 329 <string name="emulation_pause">إيقا٠المحاكاة مؤقتًا</string>
255 <string name="emulation_unpause">إلغاء الإيقا٠المؤقت Ù„Ù„Ù…ØØ§Ùاة</string> 330 <string name="emulation_unpause">إلغاء الإيقا٠المؤقت للمحاكاة</string>
256 <string name="emulation_input_overlay">خيارات التراكب</string> 331 <string name="emulation_input_overlay">خيارات التراكب</string>
332 <string name="touchscreen">شاشة اللمس</string>
257 333
258 <string name="load_settings">جار٠تحميل الإعدادات</string> 334 <string name="load_settings">جاري تحميل الإعدادات</string>
259 335
260 <!-- Software keyboard --> 336 <!-- Software keyboard -->
261 <string name="software_keyboard">لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ البرمجية</string> 337 <string name="software_keyboard">لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ البرمجية</string>
@@ -282,6 +358,7 @@
282 358
283 <!-- Memory Sizes --> 359 <!-- Memory Sizes -->
284 <string name="memory_byte">Byte</string> 360 <string name="memory_byte">Byte</string>
361 <string name="memory_byte_shorthand">B</string>
285 <string name="memory_kilobyte">KB</string> 362 <string name="memory_kilobyte">KB</string>
286 <string name="memory_megabyte">MB</string> 363 <string name="memory_megabyte">MB</string>
287 <string name="memory_gigabyte">GB</string> 364 <string name="memory_gigabyte">GB</string>
@@ -326,10 +403,9 @@
326 <string name="anti_aliasing_smaa">SMAA</string> 403 <string name="anti_aliasing_smaa">SMAA</string>
327 404
328 <!-- Screen Layouts --> 405 <!-- Screen Layouts -->
329 <string name="screen_layout_landscape">اÙقي</string>
330 <string name="screen_layout_portrait">عمودي</string>
331 <string name="screen_layout_auto">تلقائي</string> 406 <string name="screen_layout_auto">تلقائي</string>
332 407 <string name="screen_layout_landscape">Ø£Ùقي</string>
408 <string name="screen_layout_portrait">عمودي</string>
333 <!-- Aspect Ratios --> 409 <!-- Aspect Ratios -->
334 <string name="ratio_default">(16:9) Ø§ÙØªØ±Ø§Ø¶ÙŠ</string> 410 <string name="ratio_default">(16:9) Ø§ÙØªØ±Ø§Ø¶ÙŠ</string>
335 <string name="ratio_force_four_three">4:3 ÙØ±Ø¶</string> 411 <string name="ratio_force_four_three">4:3 ÙØ±Ø¶</string>
@@ -337,16 +413,20 @@
337 <string name="ratio_force_sixteen_ten">16:10 ÙØ±Ø¶</string> 413 <string name="ratio_force_sixteen_ten">16:10 ÙØ±Ø¶</string>
338 <string name="ratio_stretch">تمتد إلى Ø§Ù„Ù†Ø§ÙØ°Ø©</string> 414 <string name="ratio_stretch">تمتد إلى Ø§Ù„Ù†Ø§ÙØ°Ø©</string>
339 415
416 <!-- CPU Backend -->
417 <string name="cpu_backend_dynarmic">Dynarmic (بطيء)</string>
418 <string name="cpu_backend_nce">تنÙيذ التعليمات البرمجية الأصلية (NCE)</string>
419
340 <!-- CPU Accuracy --> 420 <!-- CPU Accuracy -->
341 <string name="cpu_accuracy_accurate">دقه</string> 421 <string name="cpu_accuracy_accurate">دقه</string>
342 <string name="cpu_accuracy_unsafe">غير آمن</string> 422 <string name="cpu_accuracy_unsafe">غير آمن</string>
343 <string name="cpu_accuracy_paranoid">Paranoid (Slow)</string> 423 <string name="cpu_accuracy_paranoid">Paranoid (بطيء)</string>
344 424
345 <!-- Gamepad Buttons --> 425 <!-- Gamepad Buttons -->
346 <string name="gamepad_d_pad">أزرار الاتجاهات</string> 426 <string name="gamepad_d_pad">الأسهم</string>
347 <string name="gamepad_left_stick">العصا اليسرى</string> 427 <string name="gamepad_left_stick">العصا اليسرى</string>
348 <string name="gamepad_right_stick">العصا اليمنى</string> 428 <string name="gamepad_right_stick">العصا اليمنى</string>
349 <string name="gamepad_home">شاشة Ø§Ù„Ø¥Ø³ØªÙØ¨Ø§Ù</string> 429 <string name="gamepad_home">شاشة الرئيسية</string>
350 <string name="gamepad_screenshot">لقطة شاشة</string> 430 <string name="gamepad_screenshot">لقطة شاشة</string>
351 431
352 <!-- Disk shader cache --> 432 <!-- Disk shader cache -->
@@ -362,11 +442,16 @@
362 <string name="change_theme_mode">تغيير وضع السمة</string> 442 <string name="change_theme_mode">تغيير وضع السمة</string>
363 <string name="theme_mode_follow_system">اتبع النظام</string> 443 <string name="theme_mode_follow_system">اتبع النظام</string>
364 <string name="theme_mode_light">ÙØ§ØªØ­</string> 444 <string name="theme_mode_light">ÙØ§ØªØ­</string>
365 <string name="theme_mode_dark">غاÙÙ</string> 445 <string name="theme_mode_dark">داكÙ</string>
366 446
367 <!-- Audio output engines -->
368 <string name="cubeb">cubeb</string> 447 <string name="cubeb">cubeb</string>
369 448
449 <!-- Anisotropic filtering options -->
450 <string name="multiplier_two">2x</string>
451 <string name="multiplier_four">4x</string>
452 <string name="multiplier_eight">8x</string>
453 <string name="multiplier_sixteen">16x</string>
454
370 <!-- Black backgrounds theme --> 455 <!-- Black backgrounds theme -->
371 <string name="use_black_backgrounds">خلÙيات سوداء</string> 456 <string name="use_black_backgrounds">خلÙيات سوداء</string>
372 <string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلÙيات سوداء.</string> 457 <string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلÙيات سوداء.</string>
diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml
index d2e5fee19..7e1eb2b8d 100644
--- a/src/android/app/src/main/res/values-ckb/strings.xml
+++ b/src/android/app/src/main/res/values-ckb/strings.xml
@@ -157,7 +157,6 @@
157 <string name="renderer_reactive_flushing_description">وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی.</string> 157 <string name="renderer_reactive_flushing_description">وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی.</string>
158 <string name="use_disk_shader_cache">بیرگەخێرای سێبەری دیسک</string> 158 <string name="use_disk_shader_cache">بیرگەخێرای سێبەری دیسک</string>
159 <string name="use_disk_shader_cache_description">پچڕپچڕی کەمدەکاتەوە بە هەڵگرتن و بارکردنی سێبەری دروستکراو لە ناوخۆدا.</string> 159 <string name="use_disk_shader_cache_description">پچڕپچڕی کەمدەکاتەوە بە هەڵگرتن و بارکردنی سێبەری دروستکراو لە ناوخۆدا.</string>
160
161 <!-- Debug settings strings --> 160 <!-- Debug settings strings -->
162 <string name="cpu">CPU</string> 161 <string name="cpu">CPU</string>
163 <string name="renderer_api">API گراÙیک</string> 162 <string name="renderer_api">API گراÙیک</string>
@@ -183,13 +182,15 @@
183 <string name="submit">پێشکەشکردن</string> 182 <string name="submit">پێشکەشکردن</string>
184 <string name="string_import">هاوردەکردن</string> 183 <string name="string_import">هاوردەکردن</string>
185 <string name="export">هەناردەکردن</string> 184 <string name="export">هەناردەکردن</string>
185 <string name="install">دامەزراندن</string>
186 <string name="delete">سڕینەوە</string>
187 <string name="clear">سڕینەوە</string>
186 <!-- GPU driver installation --> 188 <!-- GPU driver installation -->
187 <string name="select_gpu_driver">هەڵبژاردنی وەگەڕخەری GPU</string> 189 <string name="select_gpu_driver">هەڵبژاردنی وەگەڕخەری GPU</string>
188 <string name="select_gpu_driver_title">حەز دەکەیت وەگەڕخەری GPU ی ئێستات بگۆڕیت؟</string> 190 <string name="select_gpu_driver_title">حەز دەکەیت وەگەڕخەری GPU ی ئێستات بگۆڕیت؟</string>
189 <string name="select_gpu_driver_install">دامەزراندن</string> 191 <string name="select_gpu_driver_install">دامەزراندن</string>
190 <string name="select_gpu_driver_default">بنەڕەت</string> 192 <string name="select_gpu_driver_default">بنەڕەت</string>
191 <string name="select_gpu_driver_use_default">بەکارهێنانی وەگەڕخەری GPU ی بنەڕەت</string> 193 <string name="select_gpu_driver_use_default">بەکارهێنانی وەگەڕخەری GPU ی بنەڕەت</string>
192 <string name="select_gpu_driver_error">وەگەڕخەری نادروست هەڵبژێردرا، بە بەکارهێنانی بنەڕەتی سیستەم!</string>
193 <string name="system_gpu_driver">وەگەڕخەری GPU ی سیستەم</string> 194 <string name="system_gpu_driver">وەگەڕخەری GPU ی سیستەم</string>
194 <string name="installing_driver">دامەزراندنی وەگەڕخەر...</string> 195 <string name="installing_driver">دامەزراندنی وەگەڕخەر...</string>
195 196
@@ -201,7 +202,8 @@
201 <string name="preferences_audio">دەنگ</string> 202 <string name="preferences_audio">دەنگ</string>
202 <string name="preferences_theme">ڕەنگ و ڕووکار</string> 203 <string name="preferences_theme">ڕەنگ و ڕووکار</string>
203 <string name="preferences_debug">چاککردنەوە</string> 204 <string name="preferences_debug">چاککردنەوە</string>
204 205 <string name="path">Ú•ÛŽÚ•Û•Ùˆ</string>
206 <string name="version">وەشان</string>
205 <!-- ROM loading errors --> 207 <!-- ROM loading errors -->
206 <string name="loader_error_encrypted">ڕۆمەکەت کۆدکراوە</string> 208 <string name="loader_error_encrypted">ڕۆمەکەت کۆدکراوە</string>
207 <string name="loader_error_encrypted_keys_description"><![CDATA[تکایە دڵنیابەوە لەدامەزراوی <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> ÙØ§ÛŒÙ„ەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]></string> 209 <string name="loader_error_encrypted_keys_description"><![CDATA[تکایە دڵنیابەوە لەدامەزراوی <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> ÙØ§ÛŒÙ„ەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]></string>
@@ -228,6 +230,7 @@
228 <string name="emulation_pause">وەستاندنی ئیمولەیشن</string> 230 <string name="emulation_pause">وەستاندنی ئیمولەیشن</string>
229 <string name="emulation_unpause">لادانی وەستاندنی ئیمولەیشن</string> 231 <string name="emulation_unpause">لادانی وەستاندنی ئیمولەیشن</string>
230 <string name="emulation_input_overlay">هەڵبژاردەکانی داپۆشەر</string> 232 <string name="emulation_input_overlay">هەڵبژاردەکانی داپۆشەر</string>
233 <string name="touchscreen">رووکاری لەمسی</string>
231 234
232 <string name="load_settings">بارکردنی ڕێکخستنەکان...</string> 235 <string name="load_settings">بارکردنی ڕێکخستنەکان...</string>
233 236
@@ -253,6 +256,7 @@
253 <string name="region_korea">کۆریا</string> 256 <string name="region_korea">کۆریا</string>
254 <string name="region_taiwan">تایوان</string> 257 <string name="region_taiwan">تایوان</string>
255 258
259 <string name="memory_byte_shorthand">B</string>
256 <string name="memory_gigabyte">GB</string> 260 <string name="memory_gigabyte">GB</string>
257 <!-- Renderer APIs --> 261 <!-- Renderer APIs -->
258 <string name="renderer_vulkan">ڤوڵکان</string> 262 <string name="renderer_vulkan">ڤوڵکان</string>
@@ -290,8 +294,8 @@
290 <string name="anti_aliasing_fxaa">FXAA</string> 294 <string name="anti_aliasing_fxaa">FXAA</string>
291 <string name="anti_aliasing_smaa">SMAA</string> 295 <string name="anti_aliasing_smaa">SMAA</string>
292 296
297 <!-- Screen Layouts -->
293 <string name="screen_layout_auto">خودکار</string> 298 <string name="screen_layout_auto">خودکار</string>
294
295 <!-- Aspect Ratios --> 299 <!-- Aspect Ratios -->
296 <string name="ratio_default">بنەڕەت (16:9)</string> 300 <string name="ratio_default">بنەڕەت (16:9)</string>
297 <string name="ratio_force_four_three">ڕووبەری 4:3</string> 301 <string name="ratio_force_four_three">ڕووبەری 4:3</string>
@@ -326,6 +330,12 @@
326 <string name="theme_mode_light">ڕوناکی</string> 330 <string name="theme_mode_light">ڕوناکی</string>
327 <string name="theme_mode_dark">تاریک</string> 331 <string name="theme_mode_dark">تاریک</string>
328 332
333 <!-- Anisotropic filtering options -->
334 <string name="multiplier_two">2x</string>
335 <string name="multiplier_four">4x</string>
336 <string name="multiplier_eight">8x</string>
337 <string name="multiplier_sixteen">16x</string>
338
329 <!-- Black backgrounds theme --> 339 <!-- Black backgrounds theme -->
330 <string name="use_black_backgrounds">پاشبنەمای ڕەش</string> 340 <string name="use_black_backgrounds">پاشبنەمای ڕەش</string>
331 <string name="use_black_backgrounds_description">لە کاتی بەکارهێنانی ڕووکاری تاریکدا، پاشبنەمای ڕەش دادەنێ.</string> 341 <string name="use_black_backgrounds_description">لە کاتی بەکارهێنانی ڕووکاری تاریکدا، پاشبنەمای ڕەش دادەنێ.</string>
diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 000000000..b9a4a11e4
--- /dev/null
+++ b/src/android/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,265 @@
1<?xml version="1.0" encoding="utf-8"?>
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3
4 <string name="emulation_notification_channel_name">Emulace je aktivní</string>
5 <string name="notice_notification_channel_name">Upozornění a chyby</string>
6 <string name="notice_notification_channel_description">Ukáže oznámení v případě chyby.</string>
7 <string name="notification_permission_not_granted">Oznámení nejsou oprávněna!</string>
8
9 <!-- Setup strings -->
10 <string name="welcome">Vítejte!</string>
11 <string name="get_started">ZaÄít</string>
12 <string name="keys">KlíÄe</string>
13 <string name="select_keys">Vybrat klíÄe</string>
14 <string name="games">Hry</string>
15 <string name="done">Hotovo</string>
16 <string name="done_description">Vše je připraveno.\nUžijte si vaše hry!</string>
17 <string name="text_continue">PokraÄovat</string>
18 <string name="next">Další</string>
19 <string name="back">Zpět</string>
20 <string name="add_games">Přidat hry</string>
21 <string name="add_games_description">Vyber svoji složku se hrami</string>
22 <!-- Home strings -->
23 <string name="home_games">Hry</string>
24 <string name="home_search">Hledat</string>
25 <string name="home_settings">Nastavení</string>
26 <string name="empty_gamelist">Nebyly nalezeny žádné soubory nebo ještě nebyl vybrán žádný adresář s hrami.</string>
27 <string name="search_and_filter_games">Hledat a filtrovat hry</string>
28 <string name="select_games_folder">Vybrat složku s hrami</string>
29 <string name="manage_game_folders">Spravovat složky s hrami</string>
30 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
31 <string name="install_prod_keys">Instalovat prod.keys</string>
32 <string name="install_prod_keys_warning">PÅ™eskoÄit pÅ™idávání klíÄů?</string>
33 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
34 <string name="notifications">Oznámení</string>
35 <string name="give_permission">Udělit oprávnění</string>
36 <string name="notification_warning">PÅ™eskoÄit udÄ›lení oprávnÄ›ní k oznámení?</string>
37 <string name="notification_warning_description">yuzu vám nebude schopno oznámit důležité informace.</string>
38 <string name="permission_denied">Oprávnění zamítnuto</string>
39 <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>
40 <string name="about">O aplikaci</string>
41 <string name="about_description">Verze sestavení, titulky a více</string>
42 <string name="warning_help">Pomoc</string>
43 <string name="warning_skip">PÅ™eskoÄit</string>
44 <string name="warning_cancel">Zrušit</string>
45 <string name="install_amiibo_keys">Instalovat Amiibo klíÄe</string>
46 <string name="install_amiibo_keys_description">Povinné použití Amiibo ve hře</string>
47 <string name="invalid_keys_file">Vybrané klíÄe jsou neplatné</string>
48 <string name="install_keys_success">KlíÄe úspěšnÄ› nainstalovány</string>
49 <string name="reading_keys_failure">Chyba pÅ™i Ätení Å¡ifrovacích klíÄů</string>
50 <string name="invalid_keys_error">Neplatné Å¡ifrovací klíÄe</string>
51 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
52 <string name="gpu_driver_manager">Správce ovladaÄe GPU</string>
53 <string name="install_gpu_driver">Instalovat GPU ovladaÄ</string>
54 <string name="advanced_settings">PokroÄilé nastavení</string>
55 <string name="settings_description">Konfigurovat nastavení emulátoru</string>
56 <string name="search_recently_played">Nedávno hrané</string>
57 <string name="search_recently_added">Nedávno přidané</string>
58 <string name="search_homebrew">Homebrew</string>
59 <string name="open_user_folder">Otevřít yuzu složku</string>
60 <string name="open_user_folder_description">Spravovat soubory yuzu</string>
61 <string name="no_file_manager">Nenalezen žádný správce souborů</string>
62 <string name="notification_no_directory_link">Nepovedlo se otevřít yuzu složku</string>
63 <string name="manage_save_data">Spravovat data postupu ve hře</string>
64 <string name="manage_save_data_description">Data postupu nalezeny. Prosím vyberte možnost.</string>
65 <string name="import_export_saves_description">Importovat nebo exportovat data postupu</string>
66 <string name="save_file_imported_success">Uspěšně importováno</string>
67 <string name="save_file_invalid_zip_structure">Neplatná struktura dat postupu</string>
68 <string name="import_saves">Importovat</string>
69 <string name="export_saves">Exportovat</string>
70 <string name="install_firmware">Nainstalovat firmware</string>
71 <string name="firmware_installing">Instalování firmwaru</string>
72 <string name="firmware_installed_success">Firmware byl úspěšně nainstalován</string>
73 <string name="firmware_installed_failure">Instalace firmwaru selhala</string>
74 <string name="install_game_content">Nainstalovat obsah hry</string>
75 <string name="install_game_content_description">Nainstalovat aktualizace hry nebo DLC</string>
76 <string name="installing_game_content">Instalování obsahu...</string>
77 <string name="install_game_content_failure">Chyba při instalaci soubor(ů) do NAND</string>
78 <string name="manage_yuzu_data">Spravovat data yuzu</string>
79 <string name="game_folders">Složky s hrami</string>
80 <string name="folder_already_added">Tato složka byla již přidána!</string>
81 <string name="game_folder_properties">Vlastnosti složky s hrami</string>
82 <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>
83 <string name="cabinet_nickname_and_owner">Nastavení přezdívky a vlastníka</string>
84 <!-- About screen strings -->
85 <string name="gaia_is_not_real">Gaia není skuteÄná</string>
86 <string name="copied_to_clipboard">Zkopírováno do schránky</string>
87 <string name="about_app_description">Open-source Switch emulátor</string>
88 <string name="contributors">Přispěvatelé</string>
89 <string name="contributors_description">Vyrobeno s \u2764 od yuzu týmu</string>
90 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
91 <string name="build">Číslo sestavení</string>
92 <string name="user_data">Uživatelská data</string>
93 <string name="exporting_user_data">Exportování uživatelských dat...</string>
94 <string name="importing_user_data">Importování uživatelských dat...</string>
95 <string name="import_user_data">Importovat uživatelská data</string>
96 <string name="invalid_yuzu_backup">Neplatná záloha yuzu</string>
97 <string name="user_data_export_success">Uživatelská data byla úspěšně exportována.</string>
98 <string name="user_data_import_success">Uživatelská data byla úspěšně importována.</string>
99 <string name="user_data_export_cancelled">Export zrušen</string>
100 <string name="support_link">https://discord.gg/u77vRWY</string>
101 <string name="website_link">https://yuzu-emu.org/</string>
102 <string name="github_link">https://github.com/yuzu-emu</string>
103
104 <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
105 <string name="no_manual_installation">Žádná manuální instalace</string>
106 <string name="prioritized_support">Prioritní podpora</string>
107 <string name="our_eternal_gratitude">NaÅ¡e vÄ›Äná vdÄ›Änost</string>
108 <string name="are_you_interested">Máte zájem?</string>
109
110 <!-- General settings strings -->
111 <string name="frame_limit_enable">Omezit rychlost</string>
112 <string name="cpu_accuracy">CPU přesnost</string>
113 <string name="emulated_region">Emulovaná oblast</string>
114 <string name="emulated_language">Emulovaný jazyk</string>
115 <string name="use_custom_rtc">Vlastní RTC</string>
116 <!-- Graphics settings strings -->
117 <string name="renderer_accuracy">Úroveň přesnosti</string>
118 <string name="renderer_vsync">VSync režim</string>
119 <string name="renderer_screen_layout">Orientace</string>
120 <string name="renderer_aspect_ratio">Poměr stran</string>
121 <!-- Debug settings strings -->
122 <string name="cpu">CPU</string>
123 <string name="renderer_api">API</string>
124 <!-- Audio settings strings -->
125 <string name="audio_output_engine">Výstupní engine</string>
126 <string name="audio_volume">Hlasitost</string>
127 <string name="audio_volume_description">Udává hlasitost zvukového výstupu.</string>
128
129 <!-- Miscellaneous -->
130 <string name="slider_default">Výchozí</string>
131 <string name="ini_saved">Nastavení uložena</string>
132 <string name="gameid_saved">Uložena nastavení pro %1$s</string>
133 <string name="loading">NaÄítání...</string>
134 <string name="shutting_down">Vypínání...</string>
135 <string name="reset_setting_confirmation">Chcete obnovit toto nastavení zpět na jeho výchozí hodnotu?</string>
136 <string name="reset_to_default">Navrátit k výchozímu</string>
137 <string name="reset_all_settings">Resetovat všechna nastavení?</string>
138 <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>
139 <string name="close">Zavřít</string>
140 <string name="learn_more">Zjistit více</string>
141 <string name="auto">Automatické</string>
142 <string name="string_import">Importovat</string>
143 <string name="export">Exportovat</string>
144 <string name="install">Nainstalovat</string>
145 <string name="delete">Smazat</string>
146 <string name="export_success">Úspěšně exportováno</string>
147 <string name="start">Start</string>
148 <string name="clear">Vymazat</string>
149 <string name="custom">Vlastní</string>
150 <!-- GPU driver installation -->
151 <string name="select_gpu_driver">Vybrat GPU ovladaÄ</string>
152 <string name="select_gpu_driver_title">Chcete nahradit váš aktuální ovladaÄ GPU?</string>
153 <string name="select_gpu_driver_install">Nainstalovat</string>
154 <string name="select_gpu_driver_default">Výchozí</string>
155 <string name="select_gpu_driver_error">Vybrán neplatný ovladaÄ</string>
156 <string name="driver_already_installed">OvladaÄ již nainstalován</string>
157 <string name="system_gpu_driver">Systémový ovladaÄ GPU</string>
158 <string name="installing_driver">Instalování ovladaÄe...</string>
159
160 <!-- Preferences Screen -->
161 <string name="preferences_settings">Nastavení</string>
162 <string name="preferences_general">Obecné</string>
163 <string name="preferences_system">Systém</string>
164 <string name="preferences_graphics">Grafika</string>
165 <string name="preferences_audio">Zvuk</string>
166 <string name="preferences_audio_description">Výstupní engine, hlasitost</string>
167 <string name="preferences_theme">Vzhled a barva</string>
168 <string name="preferences_debug">Ladění</string>
169 <!-- Game properties -->
170 <string name="info">Info</string>
171 <string name="path">Cesta</string>
172 <string name="developer">Vývojář</string>
173 <string name="version">Verze</string>
174 <string name="copy_details">Zkopírovat podrobnosti</string>
175 <string name="add_ons">Modifkace</string>
176 <string name="addons_game">Rozšíření: %1$s</string>
177 <string name="select_content_type">Typ obsahu</string>
178 <string name="updates_and_dlc">Aktualizace a DLC</string>
179 <string name="mods_and_cheats">Módy a cheaty</string>
180 <string name="addon_installed_successfully">Rozšíření úspěšně nainstalováno</string>
181 <string name="verifying_content">Ověřování obsahu...</string>
182 <string name="emulation_done">Hotovo</string>
183 <string name="emulation_control_scale">Měřítko</string>
184 <string name="emulation_control_opacity">Průhlednost</string>
185 <string name="touchscreen">Dotyková obrazovka</string>
186
187 <!-- Errors and warnings -->
188 <string name="abort_button">Přerušit</string>
189 <string name="continue_button">PokraÄovat</string>
190 <string name="system_archive_not_found">Systémový Archív Nenalezen</string>
191 <string name="save_load_error">Ukládací/NaÄítací chyba</string>
192 <string name="fatal_error">Fatální Chyba</string>
193 <!-- Region Names -->
194 <string name="region_japan">Japonsko</string>
195 <string name="region_usa">USA</string>
196 <string name="region_europe">Evropa</string>
197 <string name="region_australia">Austrálie</string>
198 <string name="region_china">Čína</string>
199 <string name="region_korea">Korea</string>
200 <string name="region_taiwan">Taiwan</string>
201
202 <string name="memory_byte_shorthand">B</string>
203 <string name="memory_gigabyte">GB</string>
204 <!-- Renderer APIs -->
205 <string name="renderer_vulkan">Vulkan</string>
206 <string name="renderer_none">Žádné</string>
207
208 <!-- Renderer Accuracy -->
209 <string name="renderer_accuracy_normal">Normální</string>
210 <string name="renderer_accuracy_high">Vysoká</string>
211 <!-- Resolutions -->
212 <string name="resolution_half">0.5X (360p/540p)</string>
213 <string name="resolution_three_quarter">0.75X (540p/810p)</string>
214 <string name="resolution_one">1X (720p/1080p)</string>
215 <string name="resolution_two">2X (1440p/2160p) (Pomalé)</string>
216 <string name="resolution_three">3X (2160p/3240p) (Pomalé)</string>
217 <string name="resolution_four">4X (2880p/4320p) (Pomalé)</string>
218
219 <string name="scaling_filter_bilinear">Bilineární</string>
220 <string name="scaling_filter_fsr">AMD FidelityFXâ„¢ Super Resolution</string>
221
222 <!-- Anti-Aliasing -->
223 <string name="anti_aliasing_none">Žádné</string>
224 <string name="anti_aliasing_fxaa">FXAA</string>
225 <string name="anti_aliasing_smaa">SMAA</string>
226
227 <!-- Screen Layouts -->
228 <string name="screen_layout_auto">Automatické</string>
229 <!-- Aspect Ratios -->
230 <string name="ratio_default">Výchozí (16:9)</string>
231 <string name="ratio_force_four_three">Vynutit 4:3</string>
232 <string name="ratio_force_twenty_one_nine">Vynutit 21:9</string>
233 <!-- CPU Accuracy -->
234 <string name="cpu_accuracy_accurate">Přesné</string>
235 <string name="cpu_accuracy_unsafe">NebezpeÄné</string>
236 <string name="gamepad_home">Home</string>
237 <string name="building_shaders">Budování shaderů</string>
238
239 <!-- Theme options -->
240 <string name="change_app_theme">Změnit vzhled aplikace</string>
241 <string name="theme_default">Výchozí</string>
242 <string name="theme_material_you">Material You</string>
243
244 <!-- Theme Modes -->
245 <string name="change_theme_mode">Změnit styl vzhledu</string>
246 <string name="theme_mode_follow_system">Podle systému</string>
247 <string name="theme_mode_light">Světlé</string>
248 <string name="theme_mode_dark">Tmavé</string>
249
250 <!-- Anisotropic filtering options -->
251 <string name="multiplier_two">2x</string>
252 <string name="multiplier_four">4x</string>
253 <string name="multiplier_eight">8x</string>
254 <string name="multiplier_sixteen">16x</string>
255
256 <!-- Black backgrounds theme -->
257 <string name="use_black_backgrounds">Černá pozadí</string>
258 <!-- Picture-In-Picture -->
259 <string name="picture_in_picture">Obraz v obraze</string>
260 <string name="mute">Ztlumit</string>
261 <string name="unmute">Vypnout ztlumení</string>
262
263 <!-- Licenses screen strings -->
264 <string name="licenses">Licence</string>
265 </resources>
diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml
index 9c6590b5e..483ea8c88 100644
--- a/src/android/app/src/main/res/values-de/strings.xml
+++ b/src/android/app/src/main/res/values-de/strings.xml
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">Es wurden keine Dateien gefunden oder es wurde noch kein Spielverzeichnis ausgewählt.</string> 34 <string name="empty_gamelist">Es wurden keine Dateien gefunden oder es wurde noch kein Spielverzeichnis ausgewählt.</string>
35 <string name="search_and_filter_games">Spiele suchen und filtern</string> 35 <string name="search_and_filter_games">Spiele suchen und filtern</string>
36 <string name="select_games_folder">Spieleverzeichnis auswählen</string> 36 <string name="select_games_folder">Spieleverzeichnis auswählen</string>
37 <string name="manage_game_folders">Spiele-Ordner verwalten</string>
37 <string name="select_games_folder_description">Erlaubt yuzu die Spieleliste zu füllen</string> 38 <string name="select_games_folder_description">Erlaubt yuzu die Spieleliste zu füllen</string>
38 <string name="add_games_warning">Auswahl des Spieleverzeichnisses überspringen?</string> 39 <string name="add_games_warning">Auswahl des Spieleverzeichnisses überspringen?</string>
39 <string name="add_games_warning_description">Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist.</string> 40 <string name="add_games_warning_description">Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist.</string>
@@ -67,9 +68,11 @@
67 <string name="invalid_keys_error">Ungültige Schlüssel</string> 68 <string name="invalid_keys_error">Ungültige Schlüssel</string>
68 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
69 <string name="install_keys_failure_description">Die ausgewählte Datei ist falsch oder beschädigt. Bitte kopieren Sie Ihre Schlüssel erneut.</string> 70 <string name="install_keys_failure_description">Die ausgewählte Datei ist falsch oder beschädigt. Bitte kopieren Sie Ihre Schlüssel erneut.</string>
71 <string name="gpu_driver_manager">GPU-Treiber Verwaltung</string>
70 <string name="install_gpu_driver">GPU-Treiber installieren</string> 72 <string name="install_gpu_driver">GPU-Treiber installieren</string>
71 <string name="install_gpu_driver_description">Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren</string> 73 <string name="install_gpu_driver_description">Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren</string>
72 <string name="advanced_settings">Erweiterte Einstellungen</string> 74 <string name="advanced_settings">Erweiterte Einstellungen</string>
75 <string name="advanced_settings_game">Erweiterte Einstellungen: %1$s</string>
73 <string name="settings_description">Emulatoreinstellungen konfigurieren</string> 76 <string name="settings_description">Emulatoreinstellungen konfigurieren</string>
74 <string name="search_recently_played">Kürzlich gespielt</string> 77 <string name="search_recently_played">Kürzlich gespielt</string>
75 <string name="search_recently_added">Kürzlich hinzugefügt</string> 78 <string name="search_recently_added">Kürzlich hinzugefügt</string>
@@ -83,7 +86,11 @@
83 <string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Dateimanagers.</string> 86 <string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Dateimanagers.</string>
84 <string name="manage_save_data">Speicherdaten verwalten</string> 87 <string name="manage_save_data">Speicherdaten verwalten</string>
85 <string name="manage_save_data_description">Speicherdaten gefunden. Bitte wähle unten eine Option aus.</string> 88 <string name="manage_save_data_description">Speicherdaten gefunden. Bitte wähle unten eine Option aus.</string>
89 <string name="import_save_warning">Speicherdaten importieren</string>
90 <string name="import_save_warning_description">Das überschreibt alle existierenden Speicherdaten für dieses Spiel mit der ausgewählten Datei. Wirklich fortfahren?</string>
86 <string name="import_export_saves_description">Speicherdaten importieren oder exportieren</string> 91 <string name="import_export_saves_description">Speicherdaten importieren oder exportieren</string>
92 <string name="save_files_importing">Importiere Speicherdaten...</string>
93 <string name="save_files_exporting">Exportiere Speicherdaten...</string>
87 <string name="save_file_imported_success">Erfolgreich importiert</string> 94 <string name="save_file_imported_success">Erfolgreich importiert</string>
88 <string name="save_file_invalid_zip_structure">Ungültige Speicherverzeichnisstruktur</string> 95 <string name="save_file_invalid_zip_structure">Ungültige Speicherverzeichnisstruktur</string>
89 <string name="save_file_invalid_zip_structure_description">Der erste Unterordnername muss die Titel-ID des Spiels sein.</string> 96 <string name="save_file_invalid_zip_structure_description">Der erste Unterordnername muss die Titel-ID des Spiels sein.</string>
@@ -98,8 +105,17 @@
98 <string name="share_log_description">Debug-Logs an yuzu zur Untersuchung absenden</string> 105 <string name="share_log_description">Debug-Logs an yuzu zur Untersuchung absenden</string>
99 <string name="share_log_missing">Keine Log-Datei gefunden</string> 106 <string name="share_log_missing">Keine Log-Datei gefunden</string>
100 <string name="install_game_content">Spiel installieren</string> 107 <string name="install_game_content">Spiel installieren</string>
101 <string name="install_game_content_description">Spiel Update oder DLC installieren</string> 108 <string name="install_game_content_description">Spiel-Updates oder DLCs installieren</string>
109 <string name="installing_game_content">Installiere...</string>
110 <string name="install_game_content_failed_count">%1$d Installationsfehler</string>
111 <string name="install_game_content_success_install">%1$d erfolgreich installiert</string>
112 <string name="install_game_content_success_overwrite">%1$d erfolgreich überschrieben</string>
102 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string> 113 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
114 <string name="manage_yuzu_data">yuzu-Daten Verwalten</string>
115 <string name="share_save_file">Speicherdaten teilen</string>
116 <string name="game_folders">Spiele-Ordner</string>
117 <string name="add_game_folder">Spiele-Ordner hinzufügen</string>
118 <string name="applets_error_firmware">Firmware nicht installiert</string>
103 <!-- About screen strings --> 119 <!-- About screen strings -->
104 <string name="gaia_is_not_real">Gaia ist nicht real</string> 120 <string name="gaia_is_not_real">Gaia ist nicht real</string>
105 <string name="copied_to_clipboard">In die Zwischenablage kopiert</string> 121 <string name="copied_to_clipboard">In die Zwischenablage kopiert</string>
@@ -110,6 +126,10 @@
110 <string name="licenses_description">Projekte, die yuzu für Android möglich machen </string> 126 <string name="licenses_description">Projekte, die yuzu für Android möglich machen </string>
111 <string name="build">Build</string> 127 <string name="build">Build</string>
112 <string name="user_data">Nutzerdaten</string> 128 <string name="user_data">Nutzerdaten</string>
129 <string name="importing_user_data">Importiere Nutzerdaten...</string>
130 <string name="import_user_data">Nutzerdaten importieren</string>
131 <string name="user_data_export_success">Nutzerdaten erfolgreich exportiert</string>
132 <string name="user_data_import_success">Nutzerdaten erfolgreich importiert</string>
113 <string name="user_data_export_cancelled">Export abgebrochen</string> 133 <string name="user_data_export_cancelled">Export abgebrochen</string>
114 <string name="support_link">https://discord.gg/u77vRWY</string> 134 <string name="support_link">https://discord.gg/u77vRWY</string>
115 <string name="website_link">https://yuzu-emu.org/</string> 135 <string name="website_link">https://yuzu-emu.org/</string>
@@ -137,7 +157,7 @@
137 <string name="cpu_accuracy">CPU-Genauigkeit</string> 157 <string name="cpu_accuracy">CPU-Genauigkeit</string>
138 <!-- System settings strings --> 158 <!-- System settings strings -->
139 <string name="use_docked_mode">Gedockter Modus</string> 159 <string name="use_docked_mode">Gedockter Modus</string>
140 <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> 160 <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>
141 <string name="emulated_region">Emulierte Region</string> 161 <string name="emulated_region">Emulierte Region</string>
142 <string name="emulated_language">Emulierte Sprache</string> 162 <string name="emulated_language">Emulierte Sprache</string>
143 <string name="select_rtc_date">RTC-Datum auswählen</string> 163 <string name="select_rtc_date">RTC-Datum auswählen</string>
@@ -145,10 +165,12 @@
145 <string name="use_custom_rtc">Benutzerdefinierte Echtzeituhr</string> 165 <string name="use_custom_rtc">Benutzerdefinierte Echtzeituhr</string>
146 <!-- Graphics settings strings --> 166 <!-- Graphics settings strings -->
147 <string name="renderer_accuracy">Genauigkeitsstufe</string> 167 <string name="renderer_accuracy">Genauigkeitsstufe</string>
168 <string name="renderer_resolution">Auflösung (Mobil/Gedockt)</string>
148 <string name="renderer_vsync">VSync-Modus</string> 169 <string name="renderer_vsync">VSync-Modus</string>
149 <string name="renderer_screen_layout">Orientierung</string> 170 <string name="renderer_screen_layout">Orientierung</string>
150 <string name="renderer_aspect_ratio">Seitenverhältnis</string> 171 <string name="renderer_aspect_ratio">Seitenverhältnis</string>
151 <string name="renderer_scaling_filter">Fensteranpassungsfilter</string> 172 <string name="renderer_scaling_filter">Fensteranpassungsfilter</string>
173 <string name="renderer_anti_aliasing">Kantenglättung</string>
152 <string name="renderer_force_max_clock">Maximale Taktfrequenz erzwingen (nur Adreno)</string> 174 <string name="renderer_force_max_clock">Maximale Taktfrequenz erzwingen (nur Adreno)</string>
153 <string name="renderer_force_max_clock_description">Erzwingt den Betrieb der GPU mit der maximal möglichen Taktfrequenz (Temperaturbeschränkungen werden weiterhin angewendet).</string> 175 <string name="renderer_force_max_clock_description">Erzwingt den Betrieb der GPU mit der maximal möglichen Taktfrequenz (Temperaturbeschränkungen werden weiterhin angewendet).</string>
154 <string name="renderer_asynchronous_shaders">Asynchrone Shader nutzen</string> 176 <string name="renderer_asynchronous_shaders">Asynchrone Shader nutzen</string>
@@ -168,9 +190,12 @@
168 <string name="error_saving">Fehler beim Speichern von %1$s.ini: %2$s</string> 190 <string name="error_saving">Fehler beim Speichern von %1$s.ini: %2$s</string>
169 <string name="unimplemented_menu">Unimplementiertes Menü</string> 191 <string name="unimplemented_menu">Unimplementiertes Menü</string>
170 <string name="loading">Lädt...</string> 192 <string name="loading">Lädt...</string>
193 <string name="shutting_down">Beendet...</string>
171 <string name="reset_setting_confirmation">Möchtest du diese Einstellung auf den Standardwert zurücksetzen?</string> 194 <string name="reset_setting_confirmation">Möchtest du diese Einstellung auf den Standardwert zurücksetzen?</string>
172 <string name="reset_to_default">Auf Standard zurücksetzen</string> 195 <string name="reset_to_default">Auf Standard zurücksetzen</string>
196 <string name="reset_to_default_description">Setzt alle erweiterten Einstellungen zurück</string>
173 <string name="reset_all_settings">Alle Einstellungen zurücksetzen?</string> 197 <string name="reset_all_settings">Alle Einstellungen zurücksetzen?</string>
198 <string name="reset_all_settings_description">Alle erweiterten Einstellungen werden auf ihren Standardwert zurückgesetzt. Dies kann nicht rückgängig gemacht werden.</string>
174 <string name="settings_reset">Einstellungen zurückgesetzt</string> 199 <string name="settings_reset">Einstellungen zurückgesetzt</string>
175 <string name="close">Schließen</string> 200 <string name="close">Schließen</string>
176 <string name="learn_more">Mehr erfahren</string> 201 <string name="learn_more">Mehr erfahren</string>
@@ -182,14 +207,20 @@
182 <string name="export_failed">Export fehlgeschlagen</string> 207 <string name="export_failed">Export fehlgeschlagen</string>
183 <string name="import_failed">Import fehlgeschlagen</string> 208 <string name="import_failed">Import fehlgeschlagen</string>
184 <string name="cancelling">Abbrechen</string> 209 <string name="cancelling">Abbrechen</string>
185 210 <string name="install">Installieren</string>
211 <string name="delete">Löschen</string>
212 <string name="edit">Bearbeiten</string>
213 <string name="export_success">Erfolgreich exportiert</string>
214 <string name="start">Start</string>
215 <string name="clear">Löschen</string>
216 <string name="custom">Benutzerdefiniert</string>
186 <!-- GPU driver installation --> 217 <!-- GPU driver installation -->
187 <string name="select_gpu_driver">GPU-Treiber auswählen</string> 218 <string name="select_gpu_driver">GPU-Treiber auswählen</string>
188 <string name="select_gpu_driver_title">Möchtest du deinen aktuellen GPU-Treiber ersetzen?</string> 219 <string name="select_gpu_driver_title">Möchtest du deinen aktuellen GPU-Treiber ersetzen?</string>
189 <string name="select_gpu_driver_install">Installieren</string> 220 <string name="select_gpu_driver_install">Installieren</string>
190 <string name="select_gpu_driver_default">Standard</string> 221 <string name="select_gpu_driver_default">Standard</string>
191 <string name="select_gpu_driver_use_default">Standard GPU-Treiber wird verwendet</string> 222 <string name="select_gpu_driver_use_default">Standard GPU-Treiber wird verwendet</string>
192 <string name="select_gpu_driver_error">Ungültiger Treiber ausgewählt, Standard-Treiber wird verwendet!</string> 223 <string name="driver_already_installed">Treiber bereits installiert</string>
193 <string name="system_gpu_driver">System GPU-Treiber</string> 224 <string name="system_gpu_driver">System GPU-Treiber</string>
194 <string name="installing_driver">Treiber wird installiert...</string> 225 <string name="installing_driver">Treiber wird installiert...</string>
195 226
@@ -197,11 +228,37 @@
197 <string name="preferences_settings">Einstellungen</string> 228 <string name="preferences_settings">Einstellungen</string>
198 <string name="preferences_general">Allgemein</string> 229 <string name="preferences_general">Allgemein</string>
199 <string name="preferences_system">System</string> 230 <string name="preferences_system">System</string>
231 <string name="preferences_system_description">Gedockter Modus, Region, Sprache</string>
200 <string name="preferences_graphics">Grafik</string> 232 <string name="preferences_graphics">Grafik</string>
233 <string name="preferences_graphics_description">Genauigkeitsstufe, Auflösung, Shader-Cache</string>
201 <string name="preferences_audio">Audio</string> 234 <string name="preferences_audio">Audio</string>
235 <string name="preferences_audio_description">Ausgabe-Engine, Lautstärke</string>
202 <string name="preferences_theme">Theme und Farbe</string> 236 <string name="preferences_theme">Theme und Farbe</string>
203 <string name="preferences_debug">Debug</string> 237 <string name="preferences_debug">Debug</string>
204 238 <!-- Game properties -->
239 <string name="info">Info</string>
240 <string name="info_description">Programm-ID, Entwickler, Version</string>
241 <string name="per_game_settings">Spieleinstellungen</string>
242 <string name="per_game_settings_description">Einstellungen für dieses Spiel ändern</string>
243 <string name="path">Pfad</string>
244 <string name="program_id">Programm-ID</string>
245 <string name="developer">Entwickler</string>
246 <string name="version">Version</string>
247 <string name="copy_details">Details kopieren</string>
248 <string name="add_ons">Add-ons</string>
249 <string name="add_ons_description">Mods, Updates und DLC aktivieren oder deaktivieren</string>
250 <string name="clear_shader_cache">Shader-Cache löschen</string>
251 <string name="clear_shader_cache_description">Löscht alle für dieses Spiel erstellten Shader</string>
252 <string name="cleared_shaders_successfully">Shader erfolgreich gelöscht</string>
253 <string name="addons_game">Add-ons: %1$s</string>
254 <string name="save_data">Speicherdaten</string>
255 <string name="save_data_description">Importiert oder exportiert Speicherdaten für dieses Spiel</string>
256 <string name="delete_save_data">Speicherdaten löschen</string>
257 <string name="delete_save_data_description">Löscht alle Speicherdaten für dieses Spiel</string>
258 <string name="delete_save_data_warning_description">Das löscht unwiederbringlich alle Speicherdaten für dieses Spiel. Wirklich fortfahren?</string>
259 <string name="save_data_deleted_successfully">Speicherdaten erfolgreich gelöscht</string>
260 <string name="invalid_directory">Ungültiges Verzeichnis</string>
261 <string name="addon_installed_successfully">Add-on erfolgreich installiert</string>
205 <!-- ROM loading errors --> 262 <!-- ROM loading errors -->
206 <string name="loader_error_encrypted">Das ROM ist verschlüsselt</string> 263 <string name="loader_error_encrypted">Das ROM ist verschlüsselt</string>
207 <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> 264 <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>
@@ -220,7 +277,10 @@
220 <string name="emulation_control_opacity">Transparenz</string> 277 <string name="emulation_control_opacity">Transparenz</string>
221 <string name="emulation_touch_overlay_reset">Overlay zurücksetzen</string> 278 <string name="emulation_touch_overlay_reset">Overlay zurücksetzen</string>
222 <string name="emulation_touch_overlay_edit">Overlay bearbeiten</string> 279 <string name="emulation_touch_overlay_edit">Overlay bearbeiten</string>
280 <string name="emulation_pause">Emulation pausieren</string>
281 <string name="emulation_unpause">Emulation fortsetzen</string>
223 <string name="emulation_input_overlay">Overlay-Optionen</string> 282 <string name="emulation_input_overlay">Overlay-Optionen</string>
283 <string name="touchscreen">Touchscreen</string>
224 284
225 <string name="load_settings">Lade Einstellungen...</string> 285 <string name="load_settings">Lade Einstellungen...</string>
226 286
@@ -248,6 +308,7 @@
248 308
249 <!-- Memory Sizes --> 309 <!-- Memory Sizes -->
250 <string name="memory_byte">Byte</string> 310 <string name="memory_byte">Byte</string>
311 <string name="memory_byte_shorthand">B</string>
251 <string name="memory_kilobyte">KB</string> 312 <string name="memory_kilobyte">KB</string>
252 <string name="memory_megabyte">MB</string> 313 <string name="memory_megabyte">MB</string>
253 <string name="memory_gigabyte">GB</string> 314 <string name="memory_gigabyte">GB</string>
@@ -291,9 +352,10 @@
291 <string name="anti_aliasing_fxaa">FXAA</string> 352 <string name="anti_aliasing_fxaa">FXAA</string>
292 <string name="anti_aliasing_smaa">SMAA</string> 353 <string name="anti_aliasing_smaa">SMAA</string>
293 354
294 <string name="screen_layout_portrait">Portrait</string> 355 <!-- Screen Layouts -->
295 <string name="screen_layout_auto">Auto</string> 356 <string name="screen_layout_auto">Auto</string>
296 357 <string name="screen_layout_landscape">Horizontal</string>
358 <string name="screen_layout_portrait">Vertikal</string>
297 <!-- Aspect Ratios --> 359 <!-- Aspect Ratios -->
298 <string name="ratio_default">Standard (16:9)</string> 360 <string name="ratio_default">Standard (16:9)</string>
299 <string name="ratio_force_four_three">4:3 erzwingen</string> 361 <string name="ratio_force_four_three">4:3 erzwingen</string>
@@ -318,22 +380,27 @@
318 <string name="building_shaders">Shader werden erstellt</string> 380 <string name="building_shaders">Shader werden erstellt</string>
319 381
320 <!-- Theme options --> 382 <!-- Theme options -->
321 <string name="change_app_theme">App-Thema ändern</string> 383 <string name="change_app_theme">Theme</string>
322 <string name="theme_default">Standard</string> 384 <string name="theme_default">Standard</string>
323 <string name="theme_material_you">Material You</string> 385 <string name="theme_material_you">Material You</string>
324 386
325 <!-- Theme Modes --> 387 <!-- Theme Modes -->
326 <string name="change_theme_mode">Themen-Modus ändern</string> 388 <string name="change_theme_mode">Design</string>
327 <string name="theme_mode_follow_system">System folgen</string> 389 <string name="theme_mode_follow_system">System folgen</string>
328 <string name="theme_mode_light">Hell</string> 390 <string name="theme_mode_light">Hell</string>
329 <string name="theme_mode_dark">Dunkel</string> 391 <string name="theme_mode_dark">Dunkel</string>
330 392
331 <!-- Audio output engines -->
332 <string name="cubeb">cubeb</string> 393 <string name="cubeb">cubeb</string>
333 394
395 <!-- Anisotropic filtering options -->
396 <string name="multiplier_two">2x</string>
397 <string name="multiplier_four">4x</string>
398 <string name="multiplier_eight">8x</string>
399 <string name="multiplier_sixteen">16x</string>
400
334 <!-- Black backgrounds theme --> 401 <!-- Black backgrounds theme -->
335 <string name="use_black_backgrounds">Schwarze Hintergründe</string> 402 <string name="use_black_backgrounds">Schwarze Hintergründe</string>
336 <string name="use_black_backgrounds_description">Bei Verwendung des dunklen Themes, schwarze Hintergründe verwenden.</string> 403 <string name="use_black_backgrounds_description">Bei Verwendung des dunklen Designs, schwarze Hintergründe verwenden.</string>
337 404
338 <!-- Picture-In-Picture --> 405 <!-- Picture-In-Picture -->
339 <string name="picture_in_picture">Bild im Bild</string> 406 <string name="picture_in_picture">Bild im Bild</string>
diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml
index 103ac6e65..c3825710b 100644
--- a/src/android/app/src/main/res/values-es/strings.xml
+++ b/src/android/app/src/main/res/values-es/strings.xml
@@ -4,7 +4,7 @@
4 <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> 4 <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>
5 <string name="emulation_notification_channel_name">Emulación activa</string> 5 <string name="emulation_notification_channel_name">Emulación activa</string>
6 <string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string> 6 <string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string>
7 <string name="emulation_notification_running">yuzu esta ejecutándose</string> 7 <string name="emulation_notification_running">yuzu está ejecutándose</string>
8 <string name="notice_notification_channel_name">Avisos y errores</string> 8 <string name="notice_notification_channel_name">Avisos y errores</string>
9 <string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string> 9 <string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string>
10 <string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string> 10 <string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string>
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">No se ha encontrado ningún archivo o aún no se ha seleccionado ningún directorio de juegos.</string> 34 <string name="empty_gamelist">No se ha encontrado ningún archivo o aún no se ha seleccionado ningún directorio de juegos.</string>
35 <string name="search_and_filter_games">Busca y filtra juegos</string> 35 <string name="search_and_filter_games">Busca y filtra juegos</string>
36 <string name="select_games_folder">Seleccionar carpeta de juegos</string> 36 <string name="select_games_folder">Seleccionar carpeta de juegos</string>
37 <string name="manage_game_folders">Gestionar carpetas de juegos</string>
37 <string name="select_games_folder_description">Permite que yuzu llene la lista de juegos</string> 38 <string name="select_games_folder_description">Permite que yuzu llene la lista de juegos</string>
38 <string name="add_games_warning">¿Omitir la selección de la carpeta de juegos?</string> 39 <string name="add_games_warning">¿Omitir la selección de la carpeta de juegos?</string>
39 <string name="add_games_warning_description">No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos.</string> 40 <string name="add_games_warning_description">No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos.</string>
@@ -44,23 +45,23 @@
44 <string name="install_prod_keys">Instalar prod.keys</string> 45 <string name="install_prod_keys">Instalar prod.keys</string>
45 <string name="install_prod_keys_description">Requerido para descifrar juegos</string> 46 <string name="install_prod_keys_description">Requerido para descifrar juegos</string>
46 <string name="install_prod_keys_warning">¿Omitir agregar claves?</string> 47 <string name="install_prod_keys_warning">¿Omitir agregar claves?</string>
47 <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> 48 <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>
48 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> 49 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
49 <string name="notifications">Notificaciones</string> 50 <string name="notifications">Notificaciones</string>
50 <string name="notifications_description">Otorgue el permiso de notificación con el botón de abajo.</string> 51 <string name="notifications_description">Otorga el permiso de notificación con el botón de abajo.</string>
51 <string name="give_permission">Conceder permiso</string> 52 <string name="give_permission">Conceder permiso</string>
52 <string name="notification_warning">¿Omitir conceder el permiso de notificación?</string> 53 <string name="notification_warning">¿Omitir conceder el permiso de notificación?</string>
53 <string name="notification_warning_description">yuzu no podrá notificarte información importante.</string> 54 <string name="notification_warning_description">yuzu no podrá notificarte información importante.</string>
54 <string name="permission_denied">Permiso denegado</string> 55 <string name="permission_denied">Permiso denegado</string>
55 <string name="permission_denied_description">Negó este permiso demasiadas veces y ahora debe otorgarlo manualmente en la configuración del sistema.</string> 56 <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>
56 <string name="about">Acerca de</string> 57 <string name="about">Acerca de</string>
57 <string name="about_description">Versión, créditos y más</string> 58 <string name="about_description">Versión, créditos y más</string>
58 <string name="warning_help">Ayuda</string> 59 <string name="warning_help">Ayuda</string>
59 <string name="warning_skip">Siguiente</string> 60 <string name="warning_skip">Siguiente</string>
60 <string name="warning_cancel">Cancelar</string> 61 <string name="warning_cancel">Cancelar</string>
61 <string name="install_amiibo_keys">Instalar clave de Amiiboo</string> 62 <string name="install_amiibo_keys">Instalar claves de Amiibo</string>
62 <string name="install_amiibo_keys_description">Necesario para usar Amiibo en el juego</string> 63 <string name="install_amiibo_keys_description">Necesario para usar Amiibos en el juego</string>
63 <string name="invalid_keys_file">Archivo de claves seleccionado inválido</string> 64 <string name="invalid_keys_file">Archivo de claves seleccionado no válido</string>
64 <string name="install_keys_success">Claves instaladas correctamente</string> 65 <string name="install_keys_success">Claves instaladas correctamente</string>
65 <string name="reading_keys_failure">Error al leer las claves de cifrado</string> 66 <string name="reading_keys_failure">Error al leer las claves de cifrado</string>
66 <string name="install_prod_keys_failure_extension_description">Compruebe que el archivo de claves tenga una extensión .keys y pruebe otra vez.</string> 67 <string name="install_prod_keys_failure_extension_description">Compruebe que el archivo de claves tenga una extensión .keys y pruebe otra vez.</string>
@@ -68,6 +69,7 @@
68 <string name="invalid_keys_error">Claves de cifrado no válidas</string> 69 <string name="invalid_keys_error">Claves de cifrado no válidas</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string> 71 <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string>
72 <string name="gpu_driver_manager">Explorador de drivers de GPU</string>
71 <string name="install_gpu_driver">Instalar driver de GPU</string> 73 <string name="install_gpu_driver">Instalar driver de GPU</string>
72 <string name="install_gpu_driver_description">Instale drivers alternativos para obtener un rendimiento o una precisión potencialmente mejores</string> 74 <string name="install_gpu_driver_description">Instale drivers alternativos para obtener un rendimiento o una precisión potencialmente mejores</string>
73 <string name="advanced_settings">Opciones avanzadas</string> 75 <string name="advanced_settings">Opciones avanzadas</string>
@@ -85,7 +87,11 @@
85 <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> 87 <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>
86 <string name="manage_save_data">Administrar datos de guardado</string> 88 <string name="manage_save_data">Administrar datos de guardado</string>
87 <string name="manage_save_data_description">Guardar los datos encontrados. Por favor, seleccione una opción de abajo.</string> 89 <string name="manage_save_data_description">Guardar los datos encontrados. Por favor, seleccione una opción de abajo.</string>
90 <string name="import_save_warning">Importar datos de guardado</string>
91 <string name="import_save_warning_description">Ésto sobreescribirá todos los datos de guardado existentes con el archivo proporcionado. ¿Está seguro de querer continuar?</string>
88 <string name="import_export_saves_description">Importar o exportar archivos de guardado</string> 92 <string name="import_export_saves_description">Importar o exportar archivos de guardado</string>
93 <string name="save_files_importing">Importando archivos de guardado...</string>
94 <string name="save_files_exporting">Exportando archivos de guardado...</string>
89 <string name="save_file_imported_success">Importado correctamente</string> 95 <string name="save_file_imported_success">Importado correctamente</string>
90 <string name="save_file_invalid_zip_structure">Estructura del directorio de guardado no válido</string> 96 <string name="save_file_invalid_zip_structure">Estructura del directorio de guardado no válido</string>
91 <string name="save_file_invalid_zip_structure_description">El nombre de la primera subcarpeta debe ser el Title ID del juego.</string> 97 <string name="save_file_invalid_zip_structure_description">El nombre de la primera subcarpeta debe ser el Title ID del juego.</string>
@@ -95,7 +101,7 @@
95 <string name="install_firmware_description">El firmware debe estar en un archivo ZIP y es necesario para ejecutar algunos juegos</string> 101 <string name="install_firmware_description">El firmware debe estar en un archivo ZIP y es necesario para ejecutar algunos juegos</string>
96 <string name="firmware_installing">Instalando firmware</string> 102 <string name="firmware_installing">Instalando firmware</string>
97 <string name="firmware_installed_success">Firmware instalado con éxito</string> 103 <string name="firmware_installed_success">Firmware instalado con éxito</string>
98 <string name="firmware_installed_failure">Falló la instalación de firmware</string> 104 <string name="firmware_installed_failure">Error en la instalación de firmware</string>
99 <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> 105 <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>
100 <string name="share_log">Compartir registros de depuración</string> 106 <string name="share_log">Compartir registros de depuración</string>
101 <string name="share_log_description">Comparta el archivo de registro de yuzu para depurar problemas</string> 107 <string name="share_log_description">Comparta el archivo de registro de yuzu para depurar problemas</string>
@@ -115,9 +121,43 @@
115 <string name="custom_driver_not_supported">Drivers personalizados no soportados</string> 121 <string name="custom_driver_not_supported">Drivers personalizados no soportados</string>
116 <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> 122 <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>
117 <string name="manage_yuzu_data">Administrar datos de yuzu</string> 123 <string name="manage_yuzu_data">Administrar datos de yuzu</string>
118 <string name="manage_yuzu_data_description">Importa/exporta el firmware, las keys, los datos de usuario, ¡y más!</string> 124 <string name="manage_yuzu_data_description">Importa/exporta el firmware, las claves, los datos de usuario, ¡y más!</string>
119 <string name="share_save_file">Compartir archivo de guardado</string> 125 <string name="share_save_file">Compartir archivo de guardado</string>
120 <string name="export_save_failed">La exportación del guardado falló</string> 126 <string name="export_save_failed">Error al exportar el archivo de guardado</string>
127 <string name="game_folders">Carpetas de juegos</string>
128 <string name="deep_scan">Escaneo recursivo </string>
129 <string name="add_game_folder">Añadir carpeta con juegos</string>
130 <string name="folder_already_added">¡Está carpeta ya se había añadido!</string>
131 <string name="game_folder_properties">Propiedades de la carpeta de juegos</string>
132 <plurals name="saves_import_failed">
133 <item quantity="one">No se ha podido importar %d archivo de guardado.</item>
134 <item quantity="many">No se han podido importar %d archivos de guardado.</item>
135 <item quantity="other">No se han podido importar %d archivos de guardado.</item>
136 </plurals>
137 <plurals name="saves_import_success">
138 <item quantity="one">%d archivo de guardado importado con éxito.</item>
139 <item quantity="many">%d archivos de guardado importados con éxito.</item>
140 <item quantity="other">%d archivos de guardado importados con éxito.</item>
141 </plurals>
142 <string name="no_save_data_found">No hay archivos de guardado</string>
143
144 <!-- Applet launcher strings -->
145 <string name="applets">Ejecutador de applet</string>
146 <string name="applets_description">Ejecutar applets de sistema usando el firmware instalado</string>
147 <string name="applets_error_firmware">Firmware no instalado</string>
148 <string name="applets_error_applet">Applet no disponible</string>
149 <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>
150 <string name="album_applet">Ãlbum</string>
151 <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>
152 <string name="mii_edit_applet">Editor de Mii</string>
153 <string name="mii_edit_applet_description">Mira y edita Mii con el editor del sistema</string>
154 <string name="cabinet_applet">Cabinet</string>
155 <string name="cabinet_applet_description">Edita y borra los datos guardado del amiibo</string>
156 <string name="cabinet_launcher">Ejecutador de Cabinet</string>
157 <string name="cabinet_nickname_and_owner">Configuración del apodo y propietario</string>
158 <string name="cabinet_game_data_eraser">Borrador de datos de juego</string>
159 <string name="cabinet_restorer">Restaurador</string>
160 <string name="cabinet_formatter">Formateador</string>
121 161
122 <!-- About screen strings --> 162 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia no es real</string> 163 <string name="gaia_is_not_real">Gaia no es real</string>
@@ -161,6 +201,7 @@
161 <string name="frame_limit_enable_description">Limita la velocidad de emulación a un porcentaje específico de la velocidad normal.</string> 201 <string name="frame_limit_enable_description">Limita la velocidad de emulación a un porcentaje específico de la velocidad normal.</string>
162 <string name="frame_limit_slider">Limitar porcentaje de velocidad</string> 202 <string name="frame_limit_slider">Limitar porcentaje de velocidad</string>
163 <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> 203 <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>
204 <string name="cpu_backend">Motor de CPU</string>
164 <string name="cpu_accuracy">Precisión de CPU</string> 205 <string name="cpu_accuracy">Precisión de CPU</string>
165 <string name="value_with_units">%1$s%2$s</string> 206 <string name="value_with_units">%1$s%2$s</string>
166 207
@@ -186,11 +227,13 @@
186 <string name="renderer_force_max_clock">Forzar velocidad al máximo (solo Adreno)</string> 227 <string name="renderer_force_max_clock">Forzar velocidad al máximo (solo Adreno)</string>
187 <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> 228 <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>
188 <string name="renderer_asynchronous_shaders">Usar shaders asíncronos</string> 229 <string name="renderer_asynchronous_shaders">Usar shaders asíncronos</string>
189 <string name="renderer_asynchronous_shaders_description">Compila shaders de manera asíncrona, reduciendo los parones, pero puede introducir fallos.</string> 230 <string name="renderer_asynchronous_shaders_description">Compila shaders de manera asíncrona, reduce los parones pero puede introducir fallos.</string>
190 <string name="renderer_reactive_flushing">Usar limpieza reactiva</string> 231 <string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
191 <string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string> 232 <string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
192 <string name="use_disk_shader_cache">Caché de shaders en disco</string> 233 <string name="use_disk_shader_cache">Caché de shaders en disco</string>
193 <string name="use_disk_shader_cache_description">Reduce los parones almacenando y cargando shaders generados.</string> 234 <string name="use_disk_shader_cache_description">Reduce los parones almacenando y cargando shaders generados.</string>
235 <string name="anisotropic_filtering">Filtrado anisotrópico</string>
236 <string name="anisotropic_filtering_description">Mejora la calidad de las texturas al ser observadas desde ángulos oblicuos</string>
194 237
195 <!-- Debug settings strings --> 238 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 239 <string name="cpu">CPU</string>
@@ -217,6 +260,7 @@
217 <string name="shutting_down">Saliendo...</string> 260 <string name="shutting_down">Saliendo...</string>
218 <string name="reset_setting_confirmation">¿Desea restablecer esta configuración a su valor predeterminado?</string> 261 <string name="reset_setting_confirmation">¿Desea restablecer esta configuración a su valor predeterminado?</string>
219 <string name="reset_to_default">Restablecer a predeterminado</string> 262 <string name="reset_to_default">Restablecer a predeterminado</string>
263 <string name="reset_to_default_description">Reinicia todos los ajustes avanzados</string>
220 <string name="reset_all_settings">¿Restablecer todas las configuraciones?</string> 264 <string name="reset_all_settings">¿Restablecer todas las configuraciones?</string>
221 <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> 265 <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>
222 <string name="settings_reset">Reiniciar la configuracion</string> 266 <string name="settings_reset">Reiniciar la configuracion</string>
@@ -230,14 +274,24 @@
230 <string name="export_failed">La exportación falló</string> 274 <string name="export_failed">La exportación falló</string>
231 <string name="import_failed">La importación falló</string> 275 <string name="import_failed">La importación falló</string>
232 <string name="cancelling">Cancelando</string> 276 <string name="cancelling">Cancelando</string>
233 277 <string name="install">Instalar</string>
278 <string name="delete">Borrar</string>
279 <string name="edit">Editar</string>
280 <string name="export_success">Exportado correctamente</string>
281 <string name="start">Comenzar</string>
282 <string name="clear">Limpiar</string>
283 <string name="global">Global</string>
284 <string name="custom">Perzonalizado</string>
285 <string name="notice">Aviso</string>
286 <string name="import_complete">La importación se completó</string>
234 <!-- GPU driver installation --> 287 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">Seleccionar driver GPU</string> 288 <string name="select_gpu_driver">Seleccionar driver GPU</string>
236 <string name="select_gpu_driver_title">¿Quiere reemplazar el driver de GPU actual?</string> 289 <string name="select_gpu_driver_title">¿Quiere reemplazar el driver de GPU actual?</string>
237 <string name="select_gpu_driver_install">Instalar</string> 290 <string name="select_gpu_driver_install">Instalar</string>
238 <string name="select_gpu_driver_default">Predeterminado</string> 291 <string name="select_gpu_driver_default">Predeterminado</string>
239 <string name="select_gpu_driver_use_default">Usando el driver de GPU por defecto </string> 292 <string name="select_gpu_driver_use_default">Usando el driver de GPU por defecto </string>
240 <string name="select_gpu_driver_error">¡Driver no válido, utilizando el predeterminado del sistema!</string> 293 <string name="select_gpu_driver_error">Driver no válido seleccionado</string>
294 <string name="driver_already_installed">Driver ya instalado</string>
241 <string name="system_gpu_driver">Driver GPU del sistema</string> 295 <string name="system_gpu_driver">Driver GPU del sistema</string>
242 <string name="installing_driver">Instalando driver...</string> 296 <string name="installing_driver">Instalando driver...</string>
243 297
@@ -245,11 +299,52 @@
245 <string name="preferences_settings">Ajustes</string> 299 <string name="preferences_settings">Ajustes</string>
246 <string name="preferences_general">General</string> 300 <string name="preferences_general">General</string>
247 <string name="preferences_system">Sistema</string> 301 <string name="preferences_system">Sistema</string>
302 <string name="preferences_system_description">Modo en Dock, región, idioma</string>
248 <string name="preferences_graphics">Gráficos</string> 303 <string name="preferences_graphics">Gráficos</string>
304 <string name="preferences_graphics_description">Nivel de precisión, resolución, caché de shaders</string>
249 <string name="preferences_audio">Audio</string> 305 <string name="preferences_audio">Audio</string>
306 <string name="preferences_audio_description">Motor de salida, volumen</string>
250 <string name="preferences_theme">Tema y color</string> 307 <string name="preferences_theme">Tema y color</string>
251 <string name="preferences_debug">Depuración</string> 308 <string name="preferences_debug">Depuración</string>
252 309 <string name="preferences_debug_description">CPU/GPU debug, API gráfica, fastMEM</string>
310
311 <!-- Game properties -->
312 <string name="info">Información</string>
313 <string name="info_description">ID de programa, desarrollador, versión</string>
314 <string name="per_game_settings">Configuración por juego</string>
315 <string name="per_game_settings_description">Editar opciones específicas para este juego</string>
316 <string name="launch_options">Ejecutar configuración</string>
317 <string name="path">Ruta</string>
318 <string name="program_id">ID de programa</string>
319 <string name="developer">Desarrollador</string>
320 <string name="version">Versión</string>
321 <string name="copy_details">Copiar detalles</string>
322 <string name="add_ons">Extras/Add-ons</string>
323 <string name="add_ons_description">Activa/desactiva mods, actualizaciones y DLC</string>
324 <string name="clear_shader_cache">Limpiar la caché de shaders</string>
325 <string name="clear_shader_cache_description">Elimina todos los shaders construidos mientras se jugaba al juego</string>
326 <string name="clear_shader_cache_warning_description">Experimentarás más parones mientras que la caché de shaders se regenera</string>
327 <string name="cleared_shaders_successfully">Shaders limpiados con éxito</string>
328 <string name="addons_game">Addons: %1$s</string>
329 <string name="save_data">Datos de guardado</string>
330 <string name="save_data_description">Controla los datos de guardado de este juego</string>
331 <string name="delete_save_data">Borrar datos de guardado</string>
332 <string name="delete_save_data_description">Elimina todos los datos de guardado de este juego</string>
333 <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>
334 <string name="save_data_deleted_successfully">Datos de guardado eliminados con éxito</string>
335 <string name="select_content_type">Tipo de contenido</string>
336 <string name="updates_and_dlc">Actualizaciones y DLC</string>
337 <string name="mods_and_cheats">Mods y trucos</string>
338 <string name="addon_notice">Aviso importante de addons</string>
339 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
340 <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>
341 <string name="invalid_directory">Directorio no válido</string>
342 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
343 <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>
344 <string name="addon_installed_successfully">Addon instalado con éxito</string>
345 <string name="verifying_content">Verificando contenido...</string>
346 <string name="content_install_notice">Aviso importante de contenido</string>
347 <string name="content_install_notice_description">El contenido seleccionado no es de este juego.\n¿Instalar de todas maneras?</string>
253 <!-- ROM loading errors --> 348 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">Su ROM está encriptada</string> 349 <string name="loader_error_encrypted">Su ROM está encriptada</string>
255 <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> 350 <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>
@@ -277,6 +372,7 @@
277 <string name="emulation_pause">Pausar emulación</string> 372 <string name="emulation_pause">Pausar emulación</string>
278 <string name="emulation_unpause">Despausar emulación</string> 373 <string name="emulation_unpause">Despausar emulación</string>
279 <string name="emulation_input_overlay">Opciones de overlay</string> 374 <string name="emulation_input_overlay">Opciones de overlay</string>
375 <string name="touchscreen">Pantalla táctil</string>
280 376
281 <string name="load_settings">Cargando configuración...</string> 377 <string name="load_settings">Cargando configuración...</string>
282 378
@@ -308,6 +404,7 @@
308 404
309 <!-- Memory Sizes --> 405 <!-- Memory Sizes -->
310 <string name="memory_byte">Byte</string> 406 <string name="memory_byte">Byte</string>
407 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">KB</string> 408 <string name="memory_kilobyte">KB</string>
312 <string name="memory_megabyte">MB</string> 409 <string name="memory_megabyte">MB</string>
313 <string name="memory_gigabyte">GB</string> 410 <string name="memory_gigabyte">GB</string>
@@ -352,9 +449,13 @@
352 <string name="anti_aliasing_smaa">SMAA</string> 449 <string name="anti_aliasing_smaa">SMAA</string>
353 450
354 <!-- Screen Layouts --> 451 <!-- Screen Layouts -->
452 <string name="screen_layout_auto">Auto</string>
453 <string name="screen_layout_sensor_landscape">Sensor paisaje</string>
355 <string name="screen_layout_landscape">Paisaje</string> 454 <string name="screen_layout_landscape">Paisaje</string>
455 <string name="screen_layout_reverse_landscape">Paisaje inverso</string>
456 <string name="screen_layout_sensor_portrait">Sensor retrato</string>
356 <string name="screen_layout_portrait">Retrato</string> 457 <string name="screen_layout_portrait">Retrato</string>
357 <string name="screen_layout_auto">Auto</string> 458 <string name="screen_layout_reverse_portrait">Retrato inverso</string>
358 459
359 <!-- Aspect Ratios --> 460 <!-- Aspect Ratios -->
360 <string name="ratio_default">Predeterminado (16:9)</string> 461 <string name="ratio_default">Predeterminado (16:9)</string>
@@ -363,6 +464,10 @@
363 <string name="ratio_force_sixteen_ten">Forzar 16:10</string> 464 <string name="ratio_force_sixteen_ten">Forzar 16:10</string>
364 <string name="ratio_stretch">Ajustar a la ventana</string> 465 <string name="ratio_stretch">Ajustar a la ventana</string>
365 466
467 <!-- CPU Backend -->
468 <string name="cpu_backend_dynarmic">DynARMic (lento)</string>
469 <string name="cpu_backend_nce">Ejecución nativa de código (NCE)</string>
470
366 <!-- CPU Accuracy --> 471 <!-- CPU Accuracy -->
367 <string name="cpu_accuracy_accurate">Preciso</string> 472 <string name="cpu_accuracy_accurate">Preciso</string>
368 <string name="cpu_accuracy_unsafe">Impreciso</string> 473 <string name="cpu_accuracy_unsafe">Impreciso</string>
@@ -391,8 +496,15 @@
391 <string name="theme_mode_dark">Oscuro</string> 496 <string name="theme_mode_dark">Oscuro</string>
392 497
393 <!-- Audio output engines --> 498 <!-- Audio output engines -->
499 <string name="oboe">oboe</string>
394 <string name="cubeb">cubeb</string> 500 <string name="cubeb">cubeb</string>
395 501
502 <!-- Anisotropic filtering options -->
503 <string name="multiplier_two">x2</string>
504 <string name="multiplier_four">x4</string>
505 <string name="multiplier_eight">x8</string>
506 <string name="multiplier_sixteen">x16</string>
507
396 <!-- Black backgrounds theme --> 508 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">Fondos oscuros</string> 509 <string name="use_black_backgrounds">Fondos oscuros</string>
398 <string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string> 510 <string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string>
diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml
index 5a827c50b..667fe33cb 100644
--- a/src/android/app/src/main/res/values-fr/strings.xml
+++ b/src/android/app/src/main/res/values-fr/strings.xml
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">Aucun fichier n\'a été trouvé ou aucun répertoire de jeu n\'a encore été sélectionné.</string> 34 <string name="empty_gamelist">Aucun fichier n\'a été trouvé ou aucun répertoire de jeu n\'a encore été sélectionné.</string>
35 <string name="search_and_filter_games">Rechercher et filtrer les jeux</string> 35 <string name="search_and_filter_games">Rechercher et filtrer les jeux</string>
36 <string name="select_games_folder">Sélectionner le dossier des jeux</string> 36 <string name="select_games_folder">Sélectionner le dossier des jeux</string>
37 <string name="manage_game_folders">Gérer les dossiers de jeux</string>
37 <string name="select_games_folder_description">Permet à yuzu de remplir la liste des jeux</string> 38 <string name="select_games_folder_description">Permet à yuzu de remplir la liste des jeux</string>
38 <string name="add_games_warning">Ne pas sélectionner le dossier des jeux ?</string> 39 <string name="add_games_warning">Ne pas sélectionner le dossier des jeux ?</string>
39 <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> 40 <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>
@@ -47,7 +48,7 @@
47 <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> 48 <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>
48 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string> 49 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
49 <string name="notifications">Notifications</string> 50 <string name="notifications">Notifications</string>
50 <string name="notifications_description">Accordez l\'autorisation de notification avec le bouton ci-dessous.</string> 51 <string name="notifications_description">Accorder la permission de notification avec le bouton ci-dessous.</string>
51 <string name="give_permission">Accorder la permission</string> 52 <string name="give_permission">Accorder la permission</string>
52 <string name="notification_warning">Ne pas accorder la permission de notification ?</string> 53 <string name="notification_warning">Ne pas accorder la permission de notification ?</string>
53 <string name="notification_warning_description">yuzu ne pourra pas vous communiquer d\'informations importantes.</string> 54 <string name="notification_warning_description">yuzu ne pourra pas vous communiquer d\'informations importantes.</string>
@@ -68,6 +69,7 @@
68 <string name="invalid_keys_error">Clés de chiffrement invalides</string> 69 <string name="invalid_keys_error">Clés de chiffrement invalides</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string> 71 <string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string>
72 <string name="gpu_driver_manager">Gestionnaire de pilotes du GPU</string>
71 <string name="install_gpu_driver">Installer le pilote du GPU</string> 73 <string name="install_gpu_driver">Installer le pilote du GPU</string>
72 <string name="install_gpu_driver_description">Installer des pilotes alternatifs pour des performances ou une précision potentiellement meilleures</string> 74 <string name="install_gpu_driver_description">Installer des pilotes alternatifs pour des performances ou une précision potentiellement meilleures</string>
73 <string name="advanced_settings">Paramètres avancés</string> 75 <string name="advanced_settings">Paramètres avancés</string>
@@ -85,7 +87,11 @@
85 <string name="notification_no_directory_link_description">Veuillez localiser manuellement le dossier utilisateur avec le panneau latéral du gestionnaire de fichiers.</string> 87 <string name="notification_no_directory_link_description">Veuillez localiser manuellement le dossier utilisateur avec le panneau latéral du gestionnaire de fichiers.</string>
86 <string name="manage_save_data">Gérer les données de sauvegarde</string> 88 <string name="manage_save_data">Gérer les données de sauvegarde</string>
87 <string name="manage_save_data_description">Données de sauvegarde trouvées. Veuillez sélectionner une option ci-dessous.</string> 89 <string name="manage_save_data_description">Données de sauvegarde trouvées. Veuillez sélectionner une option ci-dessous.</string>
90 <string name="import_save_warning">Importer les données de sauvegarde</string>
91 <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>
88 <string name="import_export_saves_description">Importer ou exporter des fichiers de sauvegarde</string> 92 <string name="import_export_saves_description">Importer ou exporter des fichiers de sauvegarde</string>
93 <string name="save_files_importing">Importation des fichiers de sauvegarde...</string>
94 <string name="save_files_exporting">Exportation des fichiers de sauvegarde...</string>
89 <string name="save_file_imported_success">Importé avec succès</string> 95 <string name="save_file_imported_success">Importé avec succès</string>
90 <string name="save_file_invalid_zip_structure">Structure de répertoire de sauvegarde non valide</string> 96 <string name="save_file_invalid_zip_structure">Structure de répertoire de sauvegarde non valide</string>
91 <string name="save_file_invalid_zip_structure_description">Le nom du premier sous-dossier doit être l\'identifiant du titre du jeu.</string> 97 <string name="save_file_invalid_zip_structure_description">Le nom du premier sous-dossier doit être l\'identifiant du titre du jeu.</string>
@@ -118,6 +124,40 @@
118 <string name="manage_yuzu_data_description">Importer/exporter le firmware, les clés, les données utilisateur, et bien plus encore !</string> 124 <string name="manage_yuzu_data_description">Importer/exporter le firmware, les clés, les données utilisateur, et bien plus encore !</string>
119 <string name="share_save_file">Partager le fichier de sauvegarde</string> 125 <string name="share_save_file">Partager le fichier de sauvegarde</string>
120 <string name="export_save_failed">Échec de l\'exportation de la sauvegarde</string> 126 <string name="export_save_failed">Échec de l\'exportation de la sauvegarde</string>
127 <string name="game_folders">Dossiers de jeux</string>
128 <string name="deep_scan">Analyse approfondie</string>
129 <string name="add_game_folder">Ajouter un dossier de jeu</string>
130 <string name="folder_already_added">Ce dossier a déjà été ajouté !</string>
131 <string name="game_folder_properties">Propriétés du dossier du jeu</string>
132 <plurals name="saves_import_failed">
133 <item quantity="one">Échec de l\'importation de %d sauvegarde</item>
134 <item quantity="many">Échec de l\'importation de %d sauvegardes </item>
135 <item quantity="other">Échec de l\'importation de %d sauvegardes</item>
136 </plurals>
137 <plurals name="saves_import_success">
138 <item quantity="one">%d sauvegarde importée avec succès</item>
139 <item quantity="many">%d sauvegardes importées avec succès</item>
140 <item quantity="other">%d sauvegardes importées avec succès</item>
141 </plurals>
142 <string name="no_save_data_found">Aucune donnée de sauvegarde trouvée</string>
143
144 <!-- Applet launcher strings -->
145 <string name="applets">Lanceur d\'applets</string>
146 <string name="applets_description">Lancer des applets système en utilisant le firmware installé</string>
147 <string name="applets_error_firmware">Firmware non installé</string>
148 <string name="applets_error_applet">Applet non disponible</string>
149 <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>
150 <string name="album_applet">Album</string>
151 <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>
152 <string name="mii_edit_applet">Éditeur Mii</string>
153 <string name="mii_edit_applet_description">Visualiser et modifier les Miis avec l\'éditeur système.</string>
154 <string name="cabinet_applet">Cabinet</string>
155 <string name="cabinet_applet_description">Modifier et supprimer des données stockées sur un amiibo</string>
156 <string name="cabinet_launcher">Cabinet</string>
157 <string name="cabinet_nickname_and_owner">Paramètres du surnom et du propriétaire</string>
158 <string name="cabinet_game_data_eraser">Effaceur de données de jeu</string>
159 <string name="cabinet_restorer">Restaurateur</string>
160 <string name="cabinet_formatter">Formateur</string>
121 161
122 <!-- About screen strings --> 162 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia n\'est pas réel</string> 163 <string name="gaia_is_not_real">Gaia n\'est pas réel</string>
@@ -157,10 +197,11 @@
157 <string name="are_you_interested">Es tu intéressé ?</string> 197 <string name="are_you_interested">Es tu intéressé ?</string>
158 198
159 <!-- General settings strings --> 199 <!-- General settings strings -->
160 <string name="frame_limit_enable">Limitation de vitesse</string> 200 <string name="frame_limit_enable">Limiter la vitesse</string>
161 <string name="frame_limit_enable_description">Limiter la vitesse d\'émulation à un pourcentage spécifié de la vitesse normale</string> 201 <string name="frame_limit_enable_description">Limiter la vitesse d\'émulation à un pourcentage spécifié de la vitesse normale</string>
162 <string name="frame_limit_slider">Limite en pourcentage de vitesse</string> 202 <string name="frame_limit_slider">Limiter le pourcentage de vitesse</string>
163 <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> 203 <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>
204 <string name="cpu_backend">Backend du CPU</string>
164 <string name="cpu_accuracy">Précision du CPU</string> 205 <string name="cpu_accuracy">Précision du CPU</string>
165 <string name="value_with_units">%1$s%2$s</string> 206 <string name="value_with_units">%1$s%2$s</string>
166 207
@@ -191,6 +232,8 @@
191 <string name="renderer_reactive_flushing_description">Améliore la précision du rendu dans certains jeux au détriment des performances.</string> 232 <string name="renderer_reactive_flushing_description">Améliore la précision du rendu dans certains jeux au détriment des performances.</string>
192 <string name="use_disk_shader_cache">Utiliser les shader cache</string> 233 <string name="use_disk_shader_cache">Utiliser les shader cache</string>
193 <string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant localement les shaders générés</string> 234 <string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant localement les shaders générés</string>
235 <string name="anisotropic_filtering">Filtrage anisotropique</string>
236 <string name="anisotropic_filtering_description">Améliore la qualité des textures lorsqu\'elles sont visualisées sous des angles obliques</string>
194 237
195 <!-- Debug settings strings --> 238 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 239 <string name="cpu">CPU</string>
@@ -217,7 +260,8 @@
217 <string name="shutting_down">Extinction en cours...</string> 260 <string name="shutting_down">Extinction en cours...</string>
218 <string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string> 261 <string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string>
219 <string name="reset_to_default">Réinitialiser par défaut</string> 262 <string name="reset_to_default">Réinitialiser par défaut</string>
220 <string name="reset_all_settings">Réinitialiser tous les réglages ?</string> 263 <string name="reset_to_default_description">Réinitialiser tous les paramètres avancés</string>
264 <string name="reset_all_settings">Réinitialiser tous les paramètres ?</string>
221 <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> 265 <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>
222 <string name="settings_reset">Paramètres réinitialisés</string> 266 <string name="settings_reset">Paramètres réinitialisés</string>
223 <string name="close">Fermer</string> 267 <string name="close">Fermer</string>
@@ -230,14 +274,24 @@
230 <string name="export_failed">L\'exportation a échoué</string> 274 <string name="export_failed">L\'exportation a échoué</string>
231 <string name="import_failed">L\'importation a échoué</string> 275 <string name="import_failed">L\'importation a échoué</string>
232 <string name="cancelling">Annulation</string> 276 <string name="cancelling">Annulation</string>
233 277 <string name="install">Installer</string>
278 <string name="delete">Supprimer</string>
279 <string name="edit">Éditer</string>
280 <string name="export_success">Exportation réussie</string>
281 <string name="start">Start</string>
282 <string name="clear">Effacer</string>
283 <string name="global">Global</string>
284 <string name="custom">Personnalisé</string>
285 <string name="notice">Avis</string>
286 <string name="import_complete">Importation terminée</string>
234 <!-- GPU driver installation --> 287 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">Sélectionner le pilote du GPU</string> 288 <string name="select_gpu_driver">Sélectionner le pilote du GPU</string>
236 <string name="select_gpu_driver_title">Souhaitez vous remplacer votre pilote actuel ?</string> 289 <string name="select_gpu_driver_title">Souhaitez vous remplacer votre pilote actuel ?</string>
237 <string name="select_gpu_driver_install">Installer</string> 290 <string name="select_gpu_driver_install">Installer</string>
238 <string name="select_gpu_driver_default">Par défaut</string> 291 <string name="select_gpu_driver_default">Par défaut</string>
239 <string name="select_gpu_driver_use_default">Utilisation du pilote du GPU par défaut</string> 292 <string name="select_gpu_driver_use_default">Utilisation du pilote du GPU par défaut</string>
240 <string name="select_gpu_driver_error">Pilote non valide sélectionné, utilisation du paramètre par défaut du système !</string> 293 <string name="select_gpu_driver_error">Pilote non valide sélectionné</string>
294 <string name="driver_already_installed">Pilote déjà installé</string>
241 <string name="system_gpu_driver">Pilote du GPU du système</string> 295 <string name="system_gpu_driver">Pilote du GPU du système</string>
242 <string name="installing_driver">Installation du pilote...</string> 296 <string name="installing_driver">Installation du pilote...</string>
243 297
@@ -245,11 +299,52 @@
245 <string name="preferences_settings">Paramètres</string> 299 <string name="preferences_settings">Paramètres</string>
246 <string name="preferences_general">Général</string> 300 <string name="preferences_general">Général</string>
247 <string name="preferences_system">Système</string> 301 <string name="preferences_system">Système</string>
302 <string name="preferences_system_description">Mode TV, région, langue</string>
248 <string name="preferences_graphics">Vidéo</string> 303 <string name="preferences_graphics">Vidéo</string>
304 <string name="preferences_graphics_description">Niveau de précision, résolution, cache de shaders</string>
249 <string name="preferences_audio">Audio</string> 305 <string name="preferences_audio">Audio</string>
306 <string name="preferences_audio_description">Moteur de sortie, volume</string>
250 <string name="preferences_theme">Thème et couleur</string> 307 <string name="preferences_theme">Thème et couleur</string>
251 <string name="preferences_debug">Débogage</string> 308 <string name="preferences_debug">Débogage</string>
252 309 <string name="preferences_debug_description">Débogage CPU/GPU, API graphique, fastmem</string>
310
311 <!-- Game properties -->
312 <string name="info">Info</string>
313 <string name="info_description">ID du programme, développeur, version</string>
314 <string name="per_game_settings">Paramètres spécifiques au jeu</string>
315 <string name="per_game_settings_description">Modifier les paramètres spécifiques à ce jeu</string>
316 <string name="launch_options">Lancer la configuration</string>
317 <string name="path">Chemin</string>
318 <string name="program_id">ID du programme</string>
319 <string name="developer">Développeur</string>
320 <string name="version">Version</string>
321 <string name="copy_details">Copier les détails</string>
322 <string name="add_ons">Extensions</string>
323 <string name="add_ons_description">Activer les mods, mises à jour et DLC</string>
324 <string name="clear_shader_cache">Effacer le cache des shaders</string>
325 <string name="clear_shader_cache_description">Supprime tous les shaders générés en jouant à ce jeu</string>
326 <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>
327 <string name="cleared_shaders_successfully">Shaders effacés avec succès</string>
328 <string name="addons_game">Addons : %1$s</string>
329 <string name="save_data">Données de sauvegarde</string>
330 <string name="save_data_description">Gérer les données de sauvegarde spécifiques à ce jeu</string>
331 <string name="delete_save_data">Supprimer les données de sauvegarde</string>
332 <string name="delete_save_data_description">Supprime toutes les données de sauvegarde spécifiques à ce jeu</string>
333 <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>
334 <string name="save_data_deleted_successfully">Données de sauvegarde supprimées avec succès</string>
335 <string name="select_content_type">Type de contenu</string>
336 <string name="updates_and_dlc">Mises à jour et DLC</string>
337 <string name="mods_and_cheats">Mods et cheats</string>
338 <string name="addon_notice">Notification importante concernant l\'addon</string>
339 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
340 <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>
341 <string name="invalid_directory">Répertoire non valide</string>
342 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
343 <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>
344 <string name="addon_installed_successfully">Addon installé avec succès</string>
345 <string name="verifying_content">Vérification du contenu...</string>
346 <string name="content_install_notice">Avis d\'installation du contenu</string>
347 <string name="content_install_notice_description">Le contenu que vous avez sélectionné ne correspond pas à ce jeu.\nInstaller quand même ?</string>
253 <!-- ROM loading errors --> 348 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">Votre ROM est cryptée</string> 349 <string name="loader_error_encrypted">Votre ROM est cryptée</string>
255 <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> 350 <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>
@@ -277,6 +372,7 @@
277 <string name="emulation_pause">Mettre en pause l\'émulation</string> 372 <string name="emulation_pause">Mettre en pause l\'émulation</string>
278 <string name="emulation_unpause">Reprendre l\'émulation</string> 373 <string name="emulation_unpause">Reprendre l\'émulation</string>
279 <string name="emulation_input_overlay">Options de l\'overlay</string> 374 <string name="emulation_input_overlay">Options de l\'overlay</string>
375 <string name="touchscreen">Écran tactile</string>
280 376
281 <string name="load_settings">Chargement des paramètres…</string> 377 <string name="load_settings">Chargement des paramètres…</string>
282 378
@@ -308,6 +404,7 @@
308 404
309 <!-- Memory Sizes --> 405 <!-- Memory Sizes -->
310 <string name="memory_byte">Octet</string> 406 <string name="memory_byte">Octet</string>
407 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">Ko</string> 408 <string name="memory_kilobyte">Ko</string>
312 <string name="memory_megabyte">Mo</string> 409 <string name="memory_megabyte">Mo</string>
313 <string name="memory_gigabyte">GB</string> 410 <string name="memory_gigabyte">GB</string>
@@ -352,9 +449,13 @@
352 <string name="anti_aliasing_smaa">SMAA</string> 449 <string name="anti_aliasing_smaa">SMAA</string>
353 450
354 <!-- Screen Layouts --> 451 <!-- Screen Layouts -->
452 <string name="screen_layout_auto">Auto</string>
453 <string name="screen_layout_sensor_landscape">Paysage</string>
355 <string name="screen_layout_landscape">Paysage</string> 454 <string name="screen_layout_landscape">Paysage</string>
455 <string name="screen_layout_reverse_landscape">Paysage inversé</string>
456 <string name="screen_layout_sensor_portrait">Portrait</string>
356 <string name="screen_layout_portrait">Portrait</string> 457 <string name="screen_layout_portrait">Portrait</string>
357 <string name="screen_layout_auto">Auto</string> 458 <string name="screen_layout_reverse_portrait">Portrait inversé</string>
358 459
359 <!-- Aspect Ratios --> 460 <!-- Aspect Ratios -->
360 <string name="ratio_default">Par défaut (16:9)</string> 461 <string name="ratio_default">Par défaut (16:9)</string>
@@ -363,6 +464,10 @@
363 <string name="ratio_force_sixteen_ten">Forcer le 16:10</string> 464 <string name="ratio_force_sixteen_ten">Forcer le 16:10</string>
364 <string name="ratio_stretch">Étirer à la fenêtre</string> 465 <string name="ratio_stretch">Étirer à la fenêtre</string>
365 466
467 <!-- CPU Backend -->
468 <string name="cpu_backend_dynarmic">Dynarmic (Lent)</string>
469 <string name="cpu_backend_nce">Exécution de code natif (NCE)</string>
470
366 <!-- CPU Accuracy --> 471 <!-- CPU Accuracy -->
367 <string name="cpu_accuracy_accurate">Précis</string> 472 <string name="cpu_accuracy_accurate">Précis</string>
368 <string name="cpu_accuracy_unsafe">Risqué</string> 473 <string name="cpu_accuracy_unsafe">Risqué</string>
@@ -391,8 +496,15 @@
391 <string name="theme_mode_dark">Sombre</string> 496 <string name="theme_mode_dark">Sombre</string>
392 497
393 <!-- Audio output engines --> 498 <!-- Audio output engines -->
499 <string name="oboe">oboe</string>
394 <string name="cubeb">cubeb</string> 500 <string name="cubeb">cubeb</string>
395 501
502 <!-- Anisotropic filtering options -->
503 <string name="multiplier_two">2x</string>
504 <string name="multiplier_four">4x</string>
505 <string name="multiplier_eight">8x</string>
506 <string name="multiplier_sixteen">16x</string>
507
396 <!-- Black backgrounds theme --> 508 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">Arrière-plan noir</string> 509 <string name="use_black_backgrounds">Arrière-plan noir</string>
398 <string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir.</string> 510 <string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir.</string>
diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml
index 0af78a57c..41e4450c6 100644
--- a/src/android/app/src/main/res/values-he/strings.xml
+++ b/src/android/app/src/main/res/values-he/strings.xml
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">×œ× × ×ž×¦×ו ×§×‘×¦×™× ×ו לנבחרה ספריית ×§×‘×¦×™× ×‘×™× ×ª×™×™×.</string> 34 <string name="empty_gamelist">×œ× × ×ž×¦×ו ×§×‘×¦×™× ×ו לנבחרה ספריית ×§×‘×¦×™× ×‘×™× ×ª×™×™×.</string>
35 <string name="search_and_filter_games">חפש וסנן משחקי×</string> 35 <string name="search_and_filter_games">חפש וסנן משחקי×</string>
36 <string name="select_games_folder">בחר תיקיית משחקי×</string> 36 <string name="select_games_folder">בחר תיקיית משחקי×</string>
37 <string name="manage_game_folders">נהל ×ת תיקיית המשחקי×</string>
37 <string name="select_games_folder_description">×פשר ל yuzu ל×כלס ×ת רשימת המשחקי×</string> 38 <string name="select_games_folder_description">×פשר ל yuzu ל×כלס ×ת רשימת המשחקי×</string>
38 <string name="add_games_warning">לדלג על בחירת תיקיית המשחקי×?</string> 39 <string name="add_games_warning">לדלג על בחירת תיקיית המשחקי×?</string>
39 <string name="add_games_warning_description">×ž×©×—×§×™× ×œ× ×™×•×¦×’×• ברשימת ×”×ž×©×—×§×™× ×× ×œ× ×‘×—×¨×” תיקיית משחקי×.</string> 40 <string name="add_games_warning_description">×ž×©×—×§×™× ×œ× ×™×•×¦×’×• ברשימת ×”×ž×©×—×§×™× ×× ×œ× ×‘×—×¨×” תיקיית משחקי×.</string>
@@ -68,6 +69,7 @@
68 <string name="invalid_keys_error">מפתחות הצפנה ×œ× ×—×•×§×™×™×</string> 69 <string name="invalid_keys_error">מפתחות הצפנה ×œ× ×—×•×§×™×™×</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">קבוץ שנבחר מושחת ×ו ×œ× × ×›×•×Ÿ. בבקשה ×”×•×¦× ×ž×—×“×© ×ת המפתחות שלך.</string> 71 <string name="install_keys_failure_description">קבוץ שנבחר מושחת ×ו ×œ× × ×›×•×Ÿ. בבקשה ×”×•×¦× ×ž×—×“×© ×ת המפתחות שלך.</string>
72 <string name="gpu_driver_manager">מנהל ×”×“×¨×™×™×‘×¨×™× ×©×œ המעבד הגרפי</string>
71 <string name="install_gpu_driver">התקן דרייבר למעבד הגרפי</string> 73 <string name="install_gpu_driver">התקן דרייבר למעבד הגרפי</string>
72 <string name="install_gpu_driver_description">התקן ×“×¨×™×™×‘×¨×™× ××—×¨×™× ×‘×©×‘×™×œ סיכוי ×œ×‘×™×¦×•×¢×™× ×ו דיוק ×’×‘×•×”×”×™× ×™×•×ª×¨</string> 74 <string name="install_gpu_driver_description">התקן ×“×¨×™×™×‘×¨×™× ××—×¨×™× ×‘×©×‘×™×œ סיכוי ×œ×‘×™×¦×•×¢×™× ×ו דיוק ×’×‘×•×”×”×™× ×™×•×ª×¨</string>
73 <string name="advanced_settings">הגדרות מתקדמות</string> 75 <string name="advanced_settings">הגדרות מתקדמות</string>
@@ -86,6 +88,7 @@
86 <string name="manage_save_data">נהל מידע שמור</string> 88 <string name="manage_save_data">נהל מידע שמור</string>
87 <string name="manage_save_data_description">מידע שמור ×œ× × ×ž×¦×. בבקשה בחר/×™ ×ופציה מלמטה</string> 89 <string name="manage_save_data_description">מידע שמור ×œ× × ×ž×¦×. בבקשה בחר/×™ ×ופציה מלמטה</string>
88 <string name="import_export_saves_description">×™×‘× ×ו ×™×¦× ×§×‘×¦×™ שמירה</string> 90 <string name="import_export_saves_description">×™×‘× ×ו ×™×¦× ×§×‘×¦×™ שמירה</string>
91 <string name="save_files_exporting">×ž×™×™×¦× ×§×‘×¦×™ שמירה...</string>
89 <string name="save_file_imported_success">×™×•×‘× ×‘×”×¦×œ×—×”</string> 92 <string name="save_file_imported_success">×™×•×‘× ×‘×”×¦×œ×—×”</string>
90 <string name="save_file_invalid_zip_structure">מבנה ספריית השמירות ×œ× ×—×•×§×™</string> 93 <string name="save_file_invalid_zip_structure">מבנה ספריית השמירות ×œ× ×—×•×§×™</string>
91 <string name="save_file_invalid_zip_structure_description">התת תיקייה הר×שונה חייב להיות ×” title ID של המשחק</string> 94 <string name="save_file_invalid_zip_structure_description">התת תיקייה הר×שונה חייב להיות ×” title ID של המשחק</string>
@@ -118,6 +121,28 @@
118 <string name="manage_yuzu_data_description">יב×/×™×¦× firmware, keys, מידע של משתמש ועוד!</string> 121 <string name="manage_yuzu_data_description">יב×/×™×¦× firmware, keys, מידע של משתמש ועוד!</string>
119 <string name="share_save_file">שתף קובץ שמירה</string> 122 <string name="share_save_file">שתף קובץ שמירה</string>
120 <string name="export_save_failed">נכשל ×‘×™×™×¦×•× ×©×ž×™×¨×”</string> 123 <string name="export_save_failed">נכשל ×‘×™×™×¦×•× ×©×ž×™×¨×”</string>
124 <string name="game_folders">תיקיית משחקי×</string>
125 <string name="deep_scan">סריקה עמוקה</string>
126 <string name="add_game_folder">הוסף תיקיית משחקי×</string>
127 <string name="folder_already_added">התיקייה הזו נוספה כבר!</string>
128 <string name="game_folder_properties">מ×פייני תיקיית משחקי×</string>
129 <!-- Applet launcher strings -->
130 <string name="applets">משגר Applet</string>
131 <string name="applets_description">מערכת שיגור Applet משתמשת בתוכנה המותקנת</string>
132 <string name="applets_error_firmware">×” Firmware ×œ× ×ž×•×ª×§×Ÿ</string>
133 <string name="applets_error_applet">Applet ×œ× ×–×ž×™×Ÿ</string>
134 <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>
135 <string name="album_applet">×לבו×</string>
136 <string name="album_applet_description">צפה בתמונות השמורות בתיקיית צילומי המסך של המשתמש בעזרת מציג התמונות של המערכת</string>
137 <string name="mii_edit_applet">עורך Mii</string>
138 <string name="mii_edit_applet_description">צפה וערוך דמויות Mii בעזרת עורך המערכת</string>
139 <string name="cabinet_applet">×רון</string>
140 <string name="cabinet_applet_description">ערוך ומחק מידע השמור על ה amiibo</string>
141 <string name="cabinet_launcher">משגר ×רונות</string>
142 <string name="cabinet_nickname_and_owner">כינוי והגדרות בעלי×</string>
143 <string name="cabinet_game_data_eraser">מחק של נתוני משחק</string>
144 <string name="cabinet_restorer">שחזר</string>
145 <string name="cabinet_formatter">בונה תבניות</string>
121 146
122 <!-- About screen strings --> 147 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia ×œ× ×מיתית</string> 148 <string name="gaia_is_not_real">Gaia ×œ× ×מיתית</string>
@@ -161,6 +186,7 @@
161 <string name="frame_limit_enable_description">מגביל ×ת מהירות ×”×מולציה ל×חוז מהירות המבוקש מהמהירות הרגילה.</string> 186 <string name="frame_limit_enable_description">מגביל ×ת מהירות ×”×מולציה ל×חוז מהירות המבוקש מהמהירות הרגילה.</string>
162 <string name="frame_limit_slider">הגבל ×ת ×חוז המהירות</string> 187 <string name="frame_limit_slider">הגבל ×ת ×חוז המהירות</string>
163 <string name="frame_limit_slider_description">מדייק ×ת ×חוז מהירות ×”×מולציה. 100% ×–×” מהירות רגילה. ×¢×¨×›×™× ×’×“×•×œ×™× ×ו ×§×˜× ×™× ×™×יצו ×ו ×™×טו ×ת מהירות ×”×מולציה.</string> 188 <string name="frame_limit_slider_description">מדייק ×ת ×חוז מהירות ×”×מולציה. 100% ×–×” מהירות רגילה. ×¢×¨×›×™× ×’×“×•×œ×™× ×ו ×§×˜× ×™× ×™×יצו ×ו ×™×טו ×ת מהירות ×”×מולציה.</string>
189 <string name="cpu_backend">קצה ×”×חורי של המעבד</string>
164 <string name="cpu_accuracy">דיוק המעבד</string> 190 <string name="cpu_accuracy">דיוק המעבד</string>
165 <string name="value_with_units">%1$s%2$s</string> 191 <string name="value_with_units">%1$s%2$s</string>
166 192
@@ -185,23 +211,38 @@
185 <string name="renderer_anti_aliasing">שיטת Anti-aliasing</string> 211 <string name="renderer_anti_aliasing">שיטת Anti-aliasing</string>
186 <string name="renderer_force_max_clock">החזק מהירות שעון מקסימלית (רק ל Adreno)</string> 212 <string name="renderer_force_max_clock">החזק מהירות שעון מקסימלית (רק ל Adreno)</string>
187 <string name="renderer_force_max_clock_description">מכריח לדחוף ×ת מהירויות המעבד הגרפי ×œ×ž×§×¡×™×ž×•× (הגבלות ×—×•× ×™×ž×©×™×›×• לתפקד).</string> 213 <string name="renderer_force_max_clock_description">מכריח לדחוף ×ת מהירויות המעבד הגרפי ×œ×ž×§×¡×™×ž×•× (הגבלות ×—×•× ×™×ž×©×™×›×• לתפקד).</string>
214 <string name="renderer_asynchronous_shaders">השתמש ×‘×©×™×™×“×¨×™× ×סינכרוני×</string>
215 <string name="renderer_asynchronous_shaders_description">מקמפל ×©×™×™×“×¨×™× ×‘×¦×•×¨×” ×סנכרונית, מפחית תקיעות ×ך עלול ×œ×’×¨×•× ×œ×‘×¢×™×•×ª גרפיות.</string>
216 <string name="renderer_reactive_flushing">השתמש בהבהוב תגובתי</string>
188 <string name="renderer_reactive_flushing_description">משפר ×ת הדיוק של ×”×מולציה ×‘×ž×©×—×§×™× ×ž×¡×•×™×™×ž×™× ×‘×ž×—×™×¨ של ביצועי×.</string> 217 <string name="renderer_reactive_flushing_description">משפר ×ת הדיוק של ×”×מולציה ×‘×ž×©×—×§×™× ×ž×¡×•×™×™×ž×™× ×‘×ž×—×™×¨ של ביצועי×.</string>
218 <string name="use_disk_shader_cache">מטמון השיידר של הדיסק</string>
219 <string name="use_disk_shader_cache_description">מפחית בתקיעות על ידי ×חסון מקומי וטעינה של ×©×™×™×“×¨×™× ×”× ×•×¦×¨×™×. </string>
189 <!-- Debug settings strings --> 220 <!-- Debug settings strings -->
190 <string name="cpu">מעבד</string> 221 <string name="cpu">מעבד</string>
222 <string name="cpu_debug_mode">דיב××’×™× ×’ למעבד</string>
191 <string name="cpu_debug_mode_description">מכניס ×ת המעבד למצב דיב××’ ×יטי</string> 223 <string name="cpu_debug_mode_description">מכניס ×ת המעבד למצב דיב××’ ×יטי</string>
192 <string name="gpu">מעבד גרפי</string> 224 <string name="gpu">מעבד גרפי</string>
225 <string name="renderer_api">ממשק תוכנה</string>
226 <string name="renderer_debug">דיב××’×™× ×’ בגרפיקה</string>
227 <string name="renderer_debug_description">קובע ×ת ממשק התוכנה של הגרפיקות למצב דיב××’×™× ×’ ×יטי.</string>
228 <string name="fastmem">Fastmem</string>
229
193 <!-- Audio settings strings --> 230 <!-- Audio settings strings -->
194 <string name="audio_output_engine">מנוע פלט</string> 231 <string name="audio_output_engine">מנוע פלט</string>
195 <string name="audio_volume">עוצמת שמע</string> 232 <string name="audio_volume">עוצמת שמע</string>
233 <string name="audio_volume_description">מציין ×ת עוצמת ×”×ודיו שיוצ×.</string>
234
196 <!-- Miscellaneous --> 235 <!-- Miscellaneous -->
197 <string name="slider_default">ברירת מחדל</string> 236 <string name="slider_default">ברירת מחדל</string>
198 <string name="ini_saved">הגדרות שמורות</string> 237 <string name="ini_saved">הגדרות שמורות</string>
199 <string name="gameid_saved">הגדרות שמורות עבור %1$s</string> 238 <string name="gameid_saved">הגדרות שמורות עבור %1$s</string>
200 <string name="error_saving">תקלה בשמירת %1$s.ini: %2$s</string> 239 <string name="error_saving">תקלה בשמירת %1$s.ini: %2$s</string>
240 <string name="unimplemented_menu">תפריט ×©×œ× ×™×•×©×</string>
201 <string name="loading">טוען...</string> 241 <string name="loading">טוען...</string>
202 <string name="shutting_down">כיבוי...</string> 242 <string name="shutting_down">כיבוי...</string>
203 <string name="reset_setting_confirmation">×תה מעוניין ל×פס ×ת ההגדרה הזו חזרה לברירת המחדל?</string> 243 <string name="reset_setting_confirmation">×תה מעוניין ל×פס ×ת ההגדרה הזו חזרה לברירת המחדל?</string>
204 <string name="reset_to_default">×פס לברירת המחדל</string> 244 <string name="reset_to_default">×פס לברירת המחדל</string>
245 <string name="reset_to_default_description">מ×פס ×ת כל ההגדרות המתקדמות.</string>
205 <string name="reset_all_settings">ל×פס ×ת כל ההגדרות?</string> 246 <string name="reset_all_settings">ל×פס ×ת כל ההגדרות?</string>
206 <string name="reset_all_settings_description">כל ההגדרות המתקדמות ×™×ופסו לברירת המחדל. ×œ× × ×™×ª×Ÿ לבטל פעולה זו.</string> 247 <string name="reset_all_settings_description">כל ההגדרות המתקדמות ×™×ופסו לברירת המחדל. ×œ× × ×™×ª×Ÿ לבטל פעולה זו.</string>
207 <string name="settings_reset">×פס הגדרות</string> 248 <string name="settings_reset">×פס הגדרות</string>
@@ -209,19 +250,26 @@
209 <string name="learn_more">למד עוד</string> 250 <string name="learn_more">למד עוד</string>
210 <string name="auto">×וטומטי</string> 251 <string name="auto">×וטומטי</string>
211 <string name="submit">שלח</string> 252 <string name="submit">שלח</string>
253 <string name="string_null">ריק</string>
212 <string name="string_import">ייבו×</string> 254 <string name="string_import">ייבו×</string>
213 <string name="export">ייצו×</string> 255 <string name="export">ייצו×</string>
214 <string name="export_failed">×™×™×¦×•× × ×›×©×œ</string> 256 <string name="export_failed">×™×™×¦×•× × ×›×©×œ</string>
215 <string name="import_failed">×™×™×‘×•× × ×›×©×œ</string> 257 <string name="import_failed">×™×™×‘×•× × ×›×©×œ</string>
216 <string name="cancelling">מבטל</string> 258 <string name="cancelling">מבטל</string>
217 259 <string name="install">התקן</string>
260 <string name="delete">מחק</string>
261 <string name="edit">ערוך</string>
262 <string name="export_success">×™×•×¦× ×‘×”×¦×œ×—×”</string>
263 <string name="start">התחלה</string>
264 <string name="clear">× ×§×”</string>
218 <!-- GPU driver installation --> 265 <!-- GPU driver installation -->
219 <string name="select_gpu_driver">בחר דרייבר למעבד הגרפי</string> 266 <string name="select_gpu_driver">בחר דרייבר למעבד הגרפי</string>
220 <string name="select_gpu_driver_title">×תה מעוניין להחליף ×ת הדרייבר של המעבד הגרפי שלך?</string> 267 <string name="select_gpu_driver_title">×תה מעוניין להחליף ×ת הדרייבר של המעבד הגרפי שלך?</string>
221 <string name="select_gpu_driver_install">התקן</string> 268 <string name="select_gpu_driver_install">התקן</string>
222 <string name="select_gpu_driver_default">ברירת מחדל</string> 269 <string name="select_gpu_driver_default">ברירת מחדל</string>
223 <string name="select_gpu_driver_use_default">משתמש בדרייבר ברירת המחדל של המעבד הגרפי</string> 270 <string name="select_gpu_driver_use_default">משתמש בדרייבר ברירת המחדל של המעבד הגרפי</string>
224 <string name="select_gpu_driver_error">דרייבר ×œ× ×—×•×§×™ נבחר, משתמש בברירת המחדל של המערכת!</string> 271 <string name="select_gpu_driver_error">נבחר דרייבר ×œ× ×—×•×§×™</string>
272 <string name="driver_already_installed">הדרייבר כבר מותקן</string>
225 <string name="system_gpu_driver">דרייבר של המעבד הגרפי של המערכת</string> 273 <string name="system_gpu_driver">דרייבר של המעבד הגרפי של המערכת</string>
226 <string name="installing_driver">מתקין דרייבר...</string> 274 <string name="installing_driver">מתקין דרייבר...</string>
227 275
@@ -229,11 +277,27 @@
229 <string name="preferences_settings">הגדרות</string> 277 <string name="preferences_settings">הגדרות</string>
230 <string name="preferences_general">כללי</string> 278 <string name="preferences_general">כללי</string>
231 <string name="preferences_system">מערכת</string> 279 <string name="preferences_system">מערכת</string>
280 <string name="preferences_system_description">מצב מעוגן, ×יזור, שפה</string>
232 <string name="preferences_graphics">גרפיקה</string> 281 <string name="preferences_graphics">גרפיקה</string>
282 <string name="preferences_graphics_description">רמת דיוק, רזולוציה, מטמון שיידרי×</string>
233 <string name="preferences_audio">שמע</string> 283 <string name="preferences_audio">שמע</string>
284 <string name="preferences_audio_description">מנוע פלט, עוצמת שמע</string>
234 <string name="preferences_theme">צבע ונוש×</string> 285 <string name="preferences_theme">צבע ונוש×</string>
286 <string name="preferences_debug">דיב××’</string>
287 <string name="preferences_debug_description">דיב××’×™× ×’ עבור מעבד/מעבד גרפי, ממשק תוכנה עבור הגרפיקות, fastmem</string>
288
289 <!-- Game properties -->
290 <string name="info">מידע</string>
291 <string name="path">דרך</string>
292 <string name="developer">מפתח</string>
293 <string name="version">גרסה</string>
294 <string name="add_ons">תוספי×</string>
235 <!-- ROM loading errors --> 295 <!-- ROM loading errors -->
236 <string name="loader_error_encrypted">המשחק שלך מוצפן</string> 296 <string name="loader_error_encrypted">המשחק שלך מוצפן</string>
297 <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>
298 <string name="loader_error_encrypted_keys_description"><![CDATA[×× × ×•×•×“× ×©×§×•×‘×¥ ×”-<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> מותקן כך שניתן ×™×”×™×” לפענח משחקי×.]]></string>
299 <string name="loader_error_video_core">התרחשה בעיה ב×תחול של ליבת הוויד×ו</string>
300 <string name="loader_error_video_core_description">×–×” בדרך כלל × ×’×¨× ×¢×œ ידי דרייבר ×œ× ×ž×ª××™× ×¢×‘×•×¨ המעבד הגרפי. התקנת דרייבר ×שר מת××™× ×œ×ž×¢×‘×“ הגרפי יכול לפתור ×ת הבעיה הזו.</string>
237 <string name="loader_error_invalid_format">×ין ×פשרות לטעון ×ת המשחק</string> 301 <string name="loader_error_invalid_format">×ין ×פשרות לטעון ×ת המשחק</string>
238 <string name="loader_error_file_not_found">קובץ המשחק ×œ× ×§×™×™×</string> 302 <string name="loader_error_file_not_found">קובץ המשחק ×œ× ×§×™×™×</string>
239 303
@@ -241,10 +305,22 @@
241 <string name="emulation_exit">×¦× ×ž×”×מולציה</string> 305 <string name="emulation_exit">×¦× ×ž×”×מולציה</string>
242 <string name="emulation_done">סיו×</string> 306 <string name="emulation_done">סיו×</string>
243 <string name="emulation_fps_counter">סופר FPS</string> 307 <string name="emulation_fps_counter">סופר FPS</string>
308 <string name="emulation_toggle_controls">החלפת בקרי×</string>
309 <string name="emulation_rel_stick_center">מרכז ג׳ויסטיק יחסי</string>
310 <string name="emulation_dpad_slide">החלקת D-pad</string>
311 <string name="emulation_haptics">רטט מגע</string>
312 <string name="emulation_show_overlay">הצג ×ת שכבת-העל</string>
313 <string name="emulation_toggle_all">החלף הכל</string>
314 <string name="emulation_control_adjust">הת×× ×ת שכבת-העל</string>
244 <string name="emulation_control_scale">קנה מידה</string> 315 <string name="emulation_control_scale">קנה מידה</string>
245 <string name="emulation_control_opacity">שקיפות</string> 316 <string name="emulation_control_opacity">שקיפות</string>
317 <string name="emulation_touch_overlay_reset">×פס ×ת שכבת-העל</string>
318 <string name="emulation_touch_overlay_edit">ערוך שכבת-על</string>
246 <string name="emulation_pause">עצור ×מולציה</string> 319 <string name="emulation_pause">עצור ×מולציה</string>
247 <string name="emulation_unpause">המשך ×מולציה</string> 320 <string name="emulation_unpause">המשך ×מולציה</string>
321 <string name="emulation_input_overlay">×ופציות עבור שכבת-על</string>
322 <string name="touchscreen">מסך מגע</string>
323
248 <string name="load_settings">טוען הגדרות...</string> 324 <string name="load_settings">טוען הגדרות...</string>
249 325
250 <!-- Software keyboard --> 326 <!-- Software keyboard -->
@@ -258,6 +334,8 @@
258 <string name="system_archive_general">×רכיון מערכת</string> 334 <string name="system_archive_general">×רכיון מערכת</string>
259 <string name="save_load_error">בעיית שמירה/טעינה</string> 335 <string name="save_load_error">בעיית שמירה/טעינה</string>
260 <string name="fatal_error">שגי××” חמורה</string> 336 <string name="fatal_error">שגי××” חמורה</string>
337 <string name="fatal_error_message">שגי××” חמורה התרחשה. בדוק ×ת היומן לפרטי×./nהמשך הסימולציה עשוי ×œ×’×¨×•× ×œ×§×¨×™×¡×•×ª ולב××’×™×.</string>
338 <string name="performance_warning">כיבוי הגדרה זו ישפיע משמעותית על ביצועי הסימולציה! לחוויה הטובה ביותר, מומלץ להש×יר ×ת הגדרה זו מופעלת.</string>
261 <string name="device_memory_inadequate">RAM המכשיר: %1$s/nמומלץ: %2$s</string> 339 <string name="device_memory_inadequate">RAM המכשיר: %1$s/nמומלץ: %2$s</string>
262 <string name="memory_formatted">%1$s%2$s</string> 340 <string name="memory_formatted">%1$s%2$s</string>
263 <string name="no_game_present">×ין משחק שניתן להריץ!</string> 341 <string name="no_game_present">×ין משחק שניתן להריץ!</string>
@@ -273,6 +351,7 @@
273 351
274 <!-- Memory Sizes --> 352 <!-- Memory Sizes -->
275 <string name="memory_byte">בייט</string> 353 <string name="memory_byte">בייט</string>
354 <string name="memory_byte_shorthand">B</string>
276 <string name="memory_kilobyte">KB</string> 355 <string name="memory_kilobyte">KB</string>
277 <string name="memory_megabyte">MB</string> 356 <string name="memory_megabyte">MB</string>
278 <string name="memory_gigabyte">GB</string> 357 <string name="memory_gigabyte">GB</string>
@@ -297,12 +376,17 @@
297 <string name="resolution_three">3X (2160p/3240p) (×יטי)</string> 376 <string name="resolution_three">3X (2160p/3240p) (×יטי)</string>
298 <string name="resolution_four">4X (2880p/4320p) (×יטי)</string> 377 <string name="resolution_four">4X (2880p/4320p) (×יטי)</string>
299 378
379 <!-- Renderer VSync -->
380 <string name="renderer_vsync_immediate">מיידי (כבוי)</string>
300 <string name="renderer_vsync_mailbox">תיבת דו×ר</string> 381 <string name="renderer_vsync_mailbox">תיבת דו×ר</string>
301 <string name="renderer_vsync_fifo">FIFO (On)</string> 382 <string name="renderer_vsync_fifo">FIFO (On)</string>
302 <string name="renderer_vsync_fifo_relaxed">FIFO נינוח</string> 383 <string name="renderer_vsync_fifo_relaxed">FIFO נינוח</string>
303 384
304 <!-- Scaling Filters --> 385 <!-- Scaling Filters -->
305 <string name="scaling_filter_nearest_neighbor">השכן הקרוב ביותר</string> 386 <string name="scaling_filter_nearest_neighbor">השכן הקרוב ביותר</string>
387 <string name="scaling_filter_bilinear">ביליני×רי</string>
388 <string name="scaling_filter_bicubic">Bicubic</string>
389 <string name="scaling_filter_gaussian">Gaussian</string>
306 <string name="scaling_filter_scale_force">ScaleForce</string> 390 <string name="scaling_filter_scale_force">ScaleForce</string>
307 <string name="scaling_filter_fsr">AMD FidelityFXâ„¢ Super Resolution</string> 391 <string name="scaling_filter_fsr">AMD FidelityFXâ„¢ Super Resolution</string>
308 392
@@ -312,10 +396,9 @@
312 <string name="anti_aliasing_smaa">SMAA</string> 396 <string name="anti_aliasing_smaa">SMAA</string>
313 397
314 <!-- Screen Layouts --> 398 <!-- Screen Layouts -->
399 <string name="screen_layout_auto">×וטומטי</string>
315 <string name="screen_layout_landscape">לרוחב</string> 400 <string name="screen_layout_landscape">לרוחב</string>
316 <string name="screen_layout_portrait">ל×ורך</string> 401 <string name="screen_layout_portrait">ל×ורך</string>
317 <string name="screen_layout_auto">×וטומטי</string>
318
319 <!-- Aspect Ratios --> 402 <!-- Aspect Ratios -->
320 <string name="ratio_default">ברירת מחדל (16:9)</string> 403 <string name="ratio_default">ברירת מחדל (16:9)</string>
321 <string name="ratio_force_four_three">הכרח 4:3</string> 404 <string name="ratio_force_four_three">הכרח 4:3</string>
@@ -323,6 +406,10 @@
323 <string name="ratio_force_sixteen_ten">הכרח 16:10</string> 406 <string name="ratio_force_sixteen_ten">הכרח 16:10</string>
324 <string name="ratio_stretch">הרחב לגודל המסך</string> 407 <string name="ratio_stretch">הרחב לגודל המסך</string>
325 408
409 <!-- CPU Backend -->
410 <string name="cpu_backend_dynarmic">דינמי (×יטי)</string>
411 <string name="cpu_backend_nce">ביצוע קוד מקורי (NCE)</string>
412
326 <!-- CPU Accuracy --> 413 <!-- CPU Accuracy -->
327 <string name="cpu_accuracy_accurate">מדויק</string> 414 <string name="cpu_accuracy_accurate">מדויק</string>
328 <string name="cpu_accuracy_unsafe">×œ× ×‘×˜×•×—</string> 415 <string name="cpu_accuracy_unsafe">×œ× ×‘×˜×•×—</string>
@@ -335,6 +422,10 @@
335 <string name="gamepad_home">בית</string> 422 <string name="gamepad_home">בית</string>
336 <string name="gamepad_screenshot">×¦×™×œ×•× ×ž×¡×š</string> 423 <string name="gamepad_screenshot">×¦×™×œ×•× ×ž×¡×š</string>
337 424
425 <!-- Disk shader cache -->
426 <string name="preparing_shaders">מכין שיידרי×</string>
427 <string name="building_shaders">בונה שיידרי×</string>
428
338 <!-- Theme options --> 429 <!-- Theme options -->
339 <string name="change_app_theme">שנה ×ת × ×•×©× ×”×פליקצייה</string> 430 <string name="change_app_theme">שנה ×ת × ×•×©× ×”×פליקצייה</string>
340 <string name="theme_default">ברירת מחדל</string> 431 <string name="theme_default">ברירת מחדל</string>
@@ -346,9 +437,14 @@
346 <string name="theme_mode_light">בהיר</string> 437 <string name="theme_mode_light">בהיר</string>
347 <string name="theme_mode_dark">×›×”×”</string> 438 <string name="theme_mode_dark">×›×”×”</string>
348 439
349 <!-- Audio output engines -->
350 <string name="cubeb">cubeb</string> 440 <string name="cubeb">cubeb</string>
351 441
442 <!-- Anisotropic filtering options -->
443 <string name="multiplier_two">2x</string>
444 <string name="multiplier_four">4x</string>
445 <string name="multiplier_eight">8x</string>
446 <string name="multiplier_sixteen">16x</string>
447
352 <!-- Black backgrounds theme --> 448 <!-- Black backgrounds theme -->
353 <string name="use_black_backgrounds">×¨×§×¢×™× ×©×—×•×¨×™×</string> 449 <string name="use_black_backgrounds">×¨×§×¢×™× ×©×—×•×¨×™×</string>
354 <string name="use_black_backgrounds_description">×›×©×ž×ª×©×ž×©×™× ×‘×ž×¦×‘ ×›×”×”, ×©× ×¨×§×¢×™× ×©×—×•×¨×™×.</string> 450 <string name="use_black_backgrounds_description">×›×©×ž×ª×©×ž×©×™× ×‘×ž×¦×‘ ×›×”×”, ×©× ×¨×§×¢×™× ×©×—×•×¨×™×.</string>
diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml
index 6563ba288..554da0816 100644
--- a/src/android/app/src/main/res/values-hu/strings.xml
+++ b/src/android/app/src/main/res/values-hu/strings.xml
@@ -35,6 +35,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
35 <string name="empty_gamelist">Nem található fájl, vagy még nincs kiválasztva könyvtár.</string> 35 <string name="empty_gamelist">Nem található fájl, vagy még nincs kiválasztva könyvtár.</string>
36 <string name="search_and_filter_games">Játékok keresése és szűrése</string> 36 <string name="search_and_filter_games">Játékok keresése és szűrése</string>
37 <string name="select_games_folder">Játékmappa kiválasztása</string> 37 <string name="select_games_folder">Játékmappa kiválasztása</string>
38 <string name="manage_game_folders">Játékmappák kezelése</string>
38 <string name="add_games_warning">Kihagyod a játékok mappa kiválasztását?</string> 39 <string name="add_games_warning">Kihagyod a játékok mappa kiválasztását?</string>
39 <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> 40 <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>
40 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> 41 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
@@ -68,6 +69,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
68 <string name="invalid_keys_error">Érvénytelen titkosítókulcsok</string> 69 <string name="invalid_keys_error">Érvénytelen titkosítókulcsok</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">A kiválasztott fájl helytelen, vagy sérült. Ãllíts össze egy új kulcsot.</string> 71 <string name="install_keys_failure_description">A kiválasztott fájl helytelen, vagy sérült. Ãllíts össze egy új kulcsot.</string>
72 <string name="gpu_driver_manager">GPU illesztőprogram-kezelő</string>
71 <string name="install_gpu_driver">GPU illesztőprogram telepítése</string> 73 <string name="install_gpu_driver">GPU illesztőprogram telepítése</string>
72 <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> 74 <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>
73 <string name="advanced_settings">Haladó beállítások</string> 75 <string name="advanced_settings">Haladó beállítások</string>
@@ -84,7 +86,11 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
84 <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> 86 <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>
85 <string name="manage_save_data">Mentésadatok kezelése</string> 87 <string name="manage_save_data">Mentésadatok kezelése</string>
86 <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> 88 <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>
89 <string name="import_save_warning">Mentési fájlok importálása</string>
90 <string name="import_save_warning_description">Ezzel felülírod a fájlban lévő mentett adatokat. Biztosan szeretnéd folytatni?</string>
87 <string name="import_export_saves_description">Mentési fájlok importálás vagy exportálása</string> 91 <string name="import_export_saves_description">Mentési fájlok importálás vagy exportálása</string>
92 <string name="save_files_importing">Mentési fájlok importálása...</string>
93 <string name="save_files_exporting">Mentési fájlok exportálása...</string>
88 <string name="save_file_imported_success">Sikeresen importálva</string> 94 <string name="save_file_imported_success">Sikeresen importálva</string>
89 <string name="save_file_invalid_zip_structure">Érvénytelen mentési könyvtárstruktúra</string> 95 <string name="save_file_invalid_zip_structure">Érvénytelen mentési könyvtárstruktúra</string>
90 <string name="save_file_invalid_zip_structure_description">Az első almappa neve a játék azonosítója kell, hogy legyen.</string> 96 <string name="save_file_invalid_zip_structure_description">Az első almappa neve a játék azonosítója kell, hogy legyen.</string>
@@ -117,6 +123,38 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
117 <string name="manage_yuzu_data_description">Firmware, kulcsok, felhasználói adatok és egyebek importálása/exportálása</string> 123 <string name="manage_yuzu_data_description">Firmware, kulcsok, felhasználói adatok és egyebek importálása/exportálása</string>
118 <string name="share_save_file">Mentési fájl megosztása</string> 124 <string name="share_save_file">Mentési fájl megosztása</string>
119 <string name="export_save_failed">A mentés exportálása sikertelen</string> 125 <string name="export_save_failed">A mentés exportálása sikertelen</string>
126 <string name="game_folders">Játékmappák</string>
127 <string name="deep_scan">Mély szkennelés</string>
128 <string name="add_game_folder">Játékmappa hozzáadása</string>
129 <string name="folder_already_added">Ez a mappa már hozzá lett adva!</string>
130 <string name="game_folder_properties">Játékmappa tulajdonságok</string>
131 <plurals name="saves_import_failed">
132 <item quantity="one">%dmentés importálása sikertelen</item>
133 <item quantity="other">%dmentés importálása sikertelen</item>
134 </plurals>
135 <plurals name="saves_import_success">
136 <item quantity="one">%dmentés sikeresen importálva</item>
137 <item quantity="other">%dmentés sikeresen importálva</item>
138 </plurals>
139 <string name="no_save_data_found">Nem található mentett adat</string>
140
141 <!-- Applet launcher strings -->
142 <string name="applets">Applet indító</string>
143 <string name="applets_description">Rendszer appletek indítása a telepített firmware-rel</string>
144 <string name="applets_error_firmware">Firmware nincs telepítve</string>
145 <string name="applets_error_applet">Applet nem elérhető</string>
146 <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>
147 <string name="album_applet">Album</string>
148 <string name="album_applet_description">Képernyőképek megtekintése a rendszer fényképnézegetőjével</string>
149 <string name="mii_edit_applet">Mii szerkesztés</string>
150 <string name="mii_edit_applet_description">Miik megtekintése és szerkesztése a rendszerszerkesztővel</string>
151 <string name="cabinet_applet">Kabinet</string>
152 <string name="cabinet_applet_description">Amiibon tárolt adatok szerkesztése és törlése</string>
153 <string name="cabinet_launcher">Kabinet indító</string>
154 <string name="cabinet_nickname_and_owner">Becenév és tulajdonos beállítások</string>
155 <string name="cabinet_game_data_eraser">Játékadat eltávolító</string>
156 <string name="cabinet_restorer">Helyreállító</string>
157 <string name="cabinet_formatter">Formázó</string>
120 158
121 <!-- About screen strings --> 159 <!-- About screen strings -->
122 <string name="gaia_is_not_real">Gaia nem valódi</string> 160 <string name="gaia_is_not_real">Gaia nem valódi</string>
@@ -158,6 +196,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
158 <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> 196 <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>
159 <string name="frame_limit_slider">Sebességkorlát százaléka</string> 197 <string name="frame_limit_slider">Sebességkorlát százaléka</string>
160 <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> 198 <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>
199 <string name="cpu_backend">CPU backend</string>
161 <string name="cpu_accuracy">CPU pontosság</string> 200 <string name="cpu_accuracy">CPU pontosság</string>
162 <string name="value_with_units">%1$s%2$s</string> 201 <string name="value_with_units">%1$s%2$s</string>
163 202
@@ -188,7 +227,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
188 <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> 227 <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>
189 <string name="use_disk_shader_cache">Lemez árnyékoló gyorsítótár</string> 228 <string name="use_disk_shader_cache">Lemez árnyékoló gyorsítótár</string>
190 <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> 229 <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>
191 230 <string name="anisotropic_filtering">Anizotropikus szűrés</string>
192 <!-- Debug settings strings --> 231 <!-- Debug settings strings -->
193 <string name="cpu">CPU</string> 232 <string name="cpu">CPU</string>
194 <string name="cpu_debug_mode">CPU hibakeresés</string> 233 <string name="cpu_debug_mode">CPU hibakeresés</string>
@@ -196,9 +235,9 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
196 <string name="gpu">GPU</string> 235 <string name="gpu">GPU</string>
197 <string name="renderer_api">API</string> 236 <string name="renderer_api">API</string>
198 <string name="renderer_debug">Grafikai hibakeresés</string> 237 <string name="renderer_debug">Grafikai hibakeresés</string>
199 <string name="renderer_debug_description">Lassú hibakeresési módba állítja a grafikus API-t .</string> 238 <string name="renderer_debug_description">Lassú hibakereső módba állítja a grafikus API-t .</string>
200 <!-- Audio settings strings --> 239 <!-- Audio settings strings -->
201 <string name="audio_output_engine">Kimeneti rendszer</string> 240 <string name="audio_output_engine">Kimeneti motor</string>
202 <string name="audio_volume">Hangerő</string> 241 <string name="audio_volume">Hangerő</string>
203 <string name="audio_volume_description">Hangkimenet hangerejének megadása</string> 242 <string name="audio_volume_description">Hangkimenet hangerejének megadása</string>
204 243
@@ -212,6 +251,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
212 <string name="shutting_down">Leállítás...</string> 251 <string name="shutting_down">Leállítás...</string>
213 <string name="reset_setting_confirmation">Szeretnéd visszaállítani a beállítások az alapértelmezett értékekre?</string> 252 <string name="reset_setting_confirmation">Szeretnéd visszaállítani a beállítások az alapértelmezett értékekre?</string>
214 <string name="reset_to_default">Alaphelyzetbe állítás</string> 253 <string name="reset_to_default">Alaphelyzetbe állítás</string>
254 <string name="reset_to_default_description">Visszaállítja a haladó beállításokat</string>
215 <string name="reset_all_settings">Alaphelyzetbe állítod a beállításokat?</string> 255 <string name="reset_all_settings">Alaphelyzetbe állítod a beállításokat?</string>
216 <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> 256 <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>
217 <string name="settings_reset">Beállítások alaphelyzetbe állítva</string> 257 <string name="settings_reset">Beállítások alaphelyzetbe állítva</string>
@@ -219,12 +259,24 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
219 <string name="learn_more">Tudj meg többet</string> 259 <string name="learn_more">Tudj meg többet</string>
220 <string name="auto">Automatikus</string> 260 <string name="auto">Automatikus</string>
221 <string name="submit">Küldés</string> 261 <string name="submit">Küldés</string>
222 <string name="string_null">Nulla</string> 262 <string name="string_null">Null</string>
223 <string name="string_import">Importálás</string> 263 <string name="string_import">Importálás</string>
224 <string name="export">Exportálás</string> 264 <string name="export">Exportálás</string>
225 <string name="export_failed">Exportálás sikertelen</string> 265 <string name="export_failed">Exportálás sikertelen</string>
226 <string name="import_failed">Importálás sikertelen</string> 266 <string name="import_failed">Importálás sikertelen</string>
227 <string name="cancelling">Megszakítás</string> 267 <string name="cancelling">Megszakítás</string>
268 <string name="install">Telepítés</string>
269 <string name="delete">Törlés</string>
270 <string name="edit">Szerkesztés</string>
271 <string name="export_success">Sikeresen exportálva</string>
272 <string name="start">Start</string>
273 <string name="clear">Törlés</string>
274 <string name="global">Globális</string>
275 <string name="custom">Egyéni</string>
276 <string name="notice">Értesítés</string>
277 <string name="import_complete">Importálás befejezve</string>
278 <string name="more_options">További opciók</string>
279 <string name="use_global_setting">Globális beállítás használata</string>
228 280
229 <!-- GPU driver installation --> 281 <!-- GPU driver installation -->
230 <string name="select_gpu_driver">Válassz GPU illesztőprogramot</string> 282 <string name="select_gpu_driver">Válassz GPU illesztőprogramot</string>
@@ -232,7 +284,8 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
232 <string name="select_gpu_driver_install">Telepítés</string> 284 <string name="select_gpu_driver_install">Telepítés</string>
233 <string name="select_gpu_driver_default">Alapértelmezett</string> 285 <string name="select_gpu_driver_default">Alapértelmezett</string>
234 <string name="select_gpu_driver_use_default">Alapértelmezett GPU illesztőprogram használata</string> 286 <string name="select_gpu_driver_use_default">Alapértelmezett GPU illesztőprogram használata</string>
235 <string name="select_gpu_driver_error">Érvénytelen driver kiválasztva, a rendszer alapértelmezett lesz használva!</string> 287 <string name="select_gpu_driver_error">Érvénytelen illesztőprogram kiválasztva</string>
288 <string name="driver_already_installed">Az illesztőprogram már telepítve van</string>
236 <string name="system_gpu_driver">Rendszer GPU illesztőprogram</string> 289 <string name="system_gpu_driver">Rendszer GPU illesztőprogram</string>
237 <string name="installing_driver">Illesztőprogram telepítése...</string> 290 <string name="installing_driver">Illesztőprogram telepítése...</string>
238 291
@@ -240,10 +293,54 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
240 <string name="preferences_settings">Beállítások</string> 293 <string name="preferences_settings">Beállítások</string>
241 <string name="preferences_general">Ãltalános</string> 294 <string name="preferences_general">Ãltalános</string>
242 <string name="preferences_system">Rendszer</string> 295 <string name="preferences_system">Rendszer</string>
296 <string name="preferences_system_description">Dokkolt mód, régió, nyelv</string>
243 <string name="preferences_graphics">Grafika</string> 297 <string name="preferences_graphics">Grafika</string>
298 <string name="preferences_graphics_description">Pontossági szint, felbontás, árnyékoló gyorsítótár</string>
244 <string name="preferences_audio">Hang</string> 299 <string name="preferences_audio">Hang</string>
300 <string name="preferences_audio_description">Kimeneti motor, hangerő</string>
245 <string name="preferences_theme">Téma és színek</string> 301 <string name="preferences_theme">Téma és színek</string>
246 <string name="preferences_debug">Hibakeresés</string> 302 <string name="preferences_debug">Hibakeresés</string>
303 <string name="preferences_debug_description">CPU/GPU hibakeresés, grafikus API, fastmem</string>
304
305 <!-- Game properties -->
306 <string name="info">Infó</string>
307 <string name="info_description">Program ID, fejlesztő, verzió</string>
308 <string name="per_game_settings">Játékonkénti beállítások</string>
309 <string name="per_game_settings_description">Játékspecifikus beállítások szerkesztése</string>
310 <string name="launch_options">Indítási konfiguráció</string>
311 <string name="path">Útvonal</string>
312 <string name="program_id">Program ID</string>
313 <string name="developer">Fejlesztő</string>
314 <string name="version">Verzió</string>
315 <string name="copy_details">Részletek másolása</string>
316 <string name="add_ons">Kiegészítők</string>
317 <string name="add_ons_description">Modok, frissítések és DLC váltása</string>
318 <string name="clear_shader_cache">Ãrnyékoló gyorsítótár ürítése</string>
319 <string name="clear_shader_cache_description">Eltávolítja a játék által létrehozott árnyékolókat.</string>
320 <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>
321 <string name="cleared_shaders_successfully">Ãrnyékolók sikeresen ürítve</string>
322 <string name="addons_game">Kiegészítők: %1$s</string>
323 <string name="save_data">Mentett adatok</string>
324 <string name="save_data_description">Játékspecifikus mentett adatok kezelése</string>
325 <string name="delete_save_data">Mentett adatok törlése</string>
326 <string name="delete_save_data_description">Eltávolítja az összes játékhoz tartozó mentett adatot.</string>
327 <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>
328 <string name="save_data_deleted_successfully">Mentett adatok sikeresen törölve</string>
329 <string name="select_content_type">Tartalom típusa</string>
330 <string name="updates_and_dlc">Frissítések és DLC</string>
331 <string name="mods_and_cheats">Modok és csalások</string>
332 <string name="addon_notice">Fontos kiegészítő értesítés</string>
333 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
334 <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>
335 <string name="invalid_directory">Érvénytelen könyvtár</string>
336 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
337 <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>
338 <string name="addon_installed_successfully">Kiegészítő sikeresen telepítve</string>
339 <string name="verifying_content">Tartalom ellenőrzése...</string>
340 <string name="content_install_notice">Tartalom telepítési értesítés</string>
341 <string name="content_install_notice_description">A kiválasztott tartalom nem ehhez a játékhoz tartozik.\nÃgy is telepíted?</string>
342 <string name="confirm_uninstall">Eltávolítás megerősítése</string>
343 <string name="confirm_uninstall_description">Biztosan törölni szeretnéd ezt a kiegészítőt?</string>
247 344
248 <!-- ROM loading errors --> 345 <!-- ROM loading errors -->
249 <string name="loader_error_encrypted">ROM titkosítva</string> 346 <string name="loader_error_encrypted">ROM titkosítva</string>
@@ -270,6 +367,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
270 <string name="emulation_pause">Emuláció szünetelése</string> 367 <string name="emulation_pause">Emuláció szünetelése</string>
271 <string name="emulation_unpause">Emuláció folytatása</string> 368 <string name="emulation_unpause">Emuláció folytatása</string>
272 <string name="emulation_input_overlay">Ãtfedés beállításai</string> 369 <string name="emulation_input_overlay">Ãtfedés beállításai</string>
370 <string name="touchscreen">Érintőképernyő</string>
273 371
274 <string name="load_settings">Beállítások betöltése...</string> 372 <string name="load_settings">Beállítások betöltése...</string>
275 373
@@ -301,6 +399,7 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
301 399
302 <!-- Memory Sizes --> 400 <!-- Memory Sizes -->
303 <string name="memory_byte">Bájt</string> 401 <string name="memory_byte">Bájt</string>
402 <string name="memory_byte_shorthand">B</string>
304 <string name="memory_kilobyte">KB</string> 403 <string name="memory_kilobyte">KB</string>
305 <string name="memory_megabyte">MB</string> 404 <string name="memory_megabyte">MB</string>
306 <string name="memory_gigabyte">GB</string> 405 <string name="memory_gigabyte">GB</string>
@@ -345,9 +444,11 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
345 <string name="anti_aliasing_smaa">SMAA</string> 444 <string name="anti_aliasing_smaa">SMAA</string>
346 445
347 <!-- Screen Layouts --> 446 <!-- Screen Layouts -->
447 <string name="screen_layout_auto">Automatikus</string>
348 <string name="screen_layout_landscape">Fekvő</string> 448 <string name="screen_layout_landscape">Fekvő</string>
449 <string name="screen_layout_reverse_landscape">Fekvő (fejjel lefelé)</string>
349 <string name="screen_layout_portrait">Ãlló</string> 450 <string name="screen_layout_portrait">Ãlló</string>
350 <string name="screen_layout_auto">Automatikus</string> 451 <string name="screen_layout_reverse_portrait">Ãlló (fejjel lefelé)</string>
351 452
352 <!-- Aspect Ratios --> 453 <!-- Aspect Ratios -->
353 <string name="ratio_default">Alapértelmezett (16:9)</string> 454 <string name="ratio_default">Alapértelmezett (16:9)</string>
@@ -356,6 +457,8 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
356 <string name="ratio_force_sixteen_ten">16:10 kényszerítése</string> 457 <string name="ratio_force_sixteen_ten">16:10 kényszerítése</string>
357 <string name="ratio_stretch">Ablakhoz nyújtás</string> 458 <string name="ratio_stretch">Ablakhoz nyújtás</string>
358 459
460 <!-- CPU Backend -->
461 <string name="cpu_backend_dynarmic">Dinamikus (lassú)</string>
359 <!-- CPU Accuracy --> 462 <!-- CPU Accuracy -->
360 <string name="cpu_accuracy_accurate">Pontos</string> 463 <string name="cpu_accuracy_accurate">Pontos</string>
361 <string name="cpu_accuracy_unsafe">Nem biztonságos</string> 464 <string name="cpu_accuracy_unsafe">Nem biztonságos</string>
@@ -382,8 +485,15 @@ Válaszd ki a(z) &lt;b>Games&lt;/b> mappát az alábbi gombbal.</string>
382 <string name="theme_mode_dark">Sötét</string> 485 <string name="theme_mode_dark">Sötét</string>
383 486
384 <!-- Audio output engines --> 487 <!-- Audio output engines -->
488 <string name="oboe">oboe</string>
385 <string name="cubeb">cubeb</string> 489 <string name="cubeb">cubeb</string>
386 490
491 <!-- Anisotropic filtering options -->
492 <string name="multiplier_two">2x</string>
493 <string name="multiplier_four">4x</string>
494 <string name="multiplier_eight">8x</string>
495 <string name="multiplier_sixteen">16x</string>
496
387 <!-- Black backgrounds theme --> 497 <!-- Black backgrounds theme -->
388 <string name="use_black_backgrounds">Fekete háttér</string> 498 <string name="use_black_backgrounds">Fekete háttér</string>
389 <string name="use_black_backgrounds_description">Sötét téma használatakor fekete háttér használata.</string> 499 <string name="use_black_backgrounds_description">Sötét téma használatakor fekete háttér használata.</string>
diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml
index 5afebb4c4..61b39f57f 100644
--- a/src/android/app/src/main/res/values-it/strings.xml
+++ b/src/android/app/src/main/res/values-it/strings.xml
@@ -17,7 +17,7 @@
17 <string name="keys_description">Seleziona il tuo file &lt;b>prod.keys&lt;/b> con il pulsante in basso.</string> 17 <string name="keys_description">Seleziona il tuo file &lt;b>prod.keys&lt;/b> con il pulsante in basso.</string>
18 <string name="select_keys">Seleziona le chiavi</string> 18 <string name="select_keys">Seleziona le chiavi</string>
19 <string name="games">Giochi</string> 19 <string name="games">Giochi</string>
20 <string name="games_description">Seleziona la cartella &lt;b>Games&lt;/b> con il pulsante in basso.</string> 20 <string name="games_description">Seleziona la cartella dei &lt;b>giochi&lt;/b> con il pulsante in basso.</string>
21 <string name="done">Fatto</string> 21 <string name="done">Fatto</string>
22 <string name="done_description">È tutto pronto.\nDivertiti a giocare!</string> 22 <string name="done_description">È tutto pronto.\nDivertiti a giocare!</string>
23 <string name="text_continue">Continua</string> 23 <string name="text_continue">Continua</string>
@@ -33,7 +33,7 @@
33 <string name="home_settings">Impostazioni</string> 33 <string name="home_settings">Impostazioni</string>
34 <string name="empty_gamelist">Non sono stati trovati file o non è stata ancora selezionata alcuna directory di gioco.</string> 34 <string name="empty_gamelist">Non sono stati trovati file o non è stata ancora selezionata alcuna directory di gioco.</string>
35 <string name="search_and_filter_games">Cerca e filtra i giochi</string> 35 <string name="search_and_filter_games">Cerca e filtra i giochi</string>
36 <string name="select_games_folder">Seleziona la cartella di gioco</string> 36 <string name="select_games_folder">Seleziona la cartella dei giochi</string>
37 <string name="select_games_folder_description">Consente a yuzu di popolare l\'elenco dei giochi</string> 37 <string name="select_games_folder_description">Consente a yuzu di popolare l\'elenco dei giochi</string>
38 <string name="add_games_warning">Saltare la selezione della cartella dei giochi?</string> 38 <string name="add_games_warning">Saltare la selezione della cartella dei giochi?</string>
39 <string name="add_games_warning_description">I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata.</string> 39 <string name="add_games_warning_description">I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata.</string>
@@ -68,6 +68,7 @@
68 <string name="invalid_keys_error">Chiavi di crittografia non valide</string> 68 <string name="invalid_keys_error">Chiavi di crittografia non valide</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string> 70 <string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string>
71 <string name="gpu_driver_manager">Gestore driver GPU</string>
71 <string name="install_gpu_driver">Installa i driver GPU</string> 72 <string name="install_gpu_driver">Installa i driver GPU</string>
72 <string name="install_gpu_driver_description">Installa driver alternativi per potenziali prestazioni migliori o accuratezza.</string> 73 <string name="install_gpu_driver_description">Installa driver alternativi per potenziali prestazioni migliori o accuratezza.</string>
73 <string name="advanced_settings">Impostazioni avanzate</string> 74 <string name="advanced_settings">Impostazioni avanzate</string>
@@ -118,6 +119,23 @@
118 <string name="manage_yuzu_data_description">Importa/Esporta il firmware, le keys, i dati utente, e altro!</string> 119 <string name="manage_yuzu_data_description">Importa/Esporta il firmware, le keys, i dati utente, e altro!</string>
119 <string name="share_save_file">Condividi i tuoi dati di salvataggio</string> 120 <string name="share_save_file">Condividi i tuoi dati di salvataggio</string>
120 <string name="export_save_failed">Errore durante l\'esportazione del salvataggio</string> 121 <string name="export_save_failed">Errore durante l\'esportazione del salvataggio</string>
122 <!-- Applet launcher strings -->
123 <string name="applets">Avvia applet</string>
124 <string name="applets_description">Avvia applet di sistema usando il firmware installato</string>
125 <string name="applets_error_firmware">Firmware non installato</string>
126 <string name="applets_error_applet">Applet non disponibile</string>
127 <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>
128 <string name="album_applet">Album</string>
129 <string name="album_applet_description">Visualizza le immagini salvate nella cartella screenshots dell\'utente con il visualizzatore immagini di sistema</string>
130 <string name="mii_edit_applet">Modifica Mii</string>
131 <string name="mii_edit_applet_description">Visualizza e modifica Mii con l\'editor di sistema</string>
132 <string name="cabinet_applet">Cabinet</string>
133 <string name="cabinet_applet_description">Modifica ed elimina i dati salvati sugli amiibo</string>
134 <string name="cabinet_launcher">Avvia Cabinet</string>
135 <string name="cabinet_nickname_and_owner">Impostazioni nickname e proprietario</string>
136 <string name="cabinet_game_data_eraser">Cancella dati di gioco</string>
137 <string name="cabinet_restorer">Ripristina</string>
138 <string name="cabinet_formatter">Formatta</string>
121 139
122 <!-- About screen strings --> 140 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia non è reale</string> 141 <string name="gaia_is_not_real">Gaia non è reale</string>
@@ -191,7 +209,6 @@
191 <string name="renderer_reactive_flushing_description">Migliora l\'accuratezza della grafica in alcuni giochi, al costo delle performance.</string> 209 <string name="renderer_reactive_flushing_description">Migliora l\'accuratezza della grafica in alcuni giochi, al costo delle performance.</string>
192 <string name="use_disk_shader_cache">Usa la cache delle shader</string> 210 <string name="use_disk_shader_cache">Usa la cache delle shader</string>
193 <string name="use_disk_shader_cache_description">Riduce lo stuttering caricando le shader già compilate all\'avvio.</string> 211 <string name="use_disk_shader_cache_description">Riduce lo stuttering caricando le shader già compilate all\'avvio.</string>
194
195 <!-- Debug settings strings --> 212 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 213 <string name="cpu">CPU</string>
197 <string name="cpu_debug_mode">Debug della CPU</string> 214 <string name="cpu_debug_mode">Debug della CPU</string>
@@ -230,14 +247,19 @@
230 <string name="export_failed">Esportazione Fallita</string> 247 <string name="export_failed">Esportazione Fallita</string>
231 <string name="import_failed">Importazione Fallita</string> 248 <string name="import_failed">Importazione Fallita</string>
232 <string name="cancelling">Cancellazione</string> 249 <string name="cancelling">Cancellazione</string>
233 250 <string name="install">Installa</string>
251 <string name="delete">Elimina</string>
252 <string name="start">Start</string>
253 <string name="clear">Cancella</string>
254 <string name="custom">Personalizzato</string>
234 <!-- GPU driver installation --> 255 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">Seleziona il driver della GPU</string> 256 <string name="select_gpu_driver">Seleziona il driver della GPU</string>
236 <string name="select_gpu_driver_title">Vuoi sostituire il driver della tua GPU attuale?</string> 257 <string name="select_gpu_driver_title">Vuoi sostituire il driver della tua GPU attuale?</string>
237 <string name="select_gpu_driver_install">Installa</string> 258 <string name="select_gpu_driver_install">Installa</string>
238 <string name="select_gpu_driver_default">Predefinito</string> 259 <string name="select_gpu_driver_default">Predefinito</string>
239 <string name="select_gpu_driver_use_default">Utilizza il driver predefinito della GPU.</string> 260 <string name="select_gpu_driver_use_default">Utilizza il driver predefinito della GPU.</string>
240 <string name="select_gpu_driver_error">Il driver selezionato è invalido, è in utilizzo quello predefinito di sistema!</string> 261 <string name="select_gpu_driver_error">Driver selezionato non valido</string>
262 <string name="driver_already_installed">Driver già installato</string>
241 <string name="system_gpu_driver">Driver GPU del sistema</string> 263 <string name="system_gpu_driver">Driver GPU del sistema</string>
242 <string name="installing_driver">Installando i driver...</string> 264 <string name="installing_driver">Installando i driver...</string>
243 265
@@ -249,7 +271,12 @@
249 <string name="preferences_audio">Audio</string> 271 <string name="preferences_audio">Audio</string>
250 <string name="preferences_theme">Tema e colori</string> 272 <string name="preferences_theme">Tema e colori</string>
251 <string name="preferences_debug">Debug</string> 273 <string name="preferences_debug">Debug</string>
252 274 <!-- Game properties -->
275 <string name="info">Info</string>
276 <string name="path">Percorso</string>
277 <string name="developer">Sviluppatore</string>
278 <string name="version">Versione</string>
279 <string name="add_ons">Add-on</string>
253 <!-- ROM loading errors --> 280 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">La tua ROM è criptata</string> 281 <string name="loader_error_encrypted">La tua ROM è criptata</string>
255 <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> 282 <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>
@@ -263,20 +290,21 @@
263 <string name="emulation_exit">Arresta emulazione</string> 290 <string name="emulation_exit">Arresta emulazione</string>
264 <string name="emulation_done">Fatto</string> 291 <string name="emulation_done">Fatto</string>
265 <string name="emulation_fps_counter">Contatore FPS</string> 292 <string name="emulation_fps_counter">Contatore FPS</string>
266 <string name="emulation_toggle_controls">Controlli a interruttore</string> 293 <string name="emulation_toggle_controls">Attiva/disattiva comandi</string>
267 <string name="emulation_rel_stick_center">Centro relativo degli Stick</string> 294 <string name="emulation_rel_stick_center">Centro relativo degli Stick</string>
268 <string name="emulation_dpad_slide">DPad A Scorrimento</string> 295 <string name="emulation_dpad_slide">DPad A Scorrimento</string>
269 <string name="emulation_haptics">Feedback Aptico</string> 296 <string name="emulation_haptics">Feedback Aptico</string>
270 <string name="emulation_show_overlay">Mostra l\'Overlay</string> 297 <string name="emulation_show_overlay">Mostra l\'overlay</string>
271 <string name="emulation_toggle_all">Attiva/Disattiva tutto</string> 298 <string name="emulation_toggle_all">Attiva/Disattiva tutto</string>
272 <string name="emulation_control_adjust">Modifica l\'Overlay</string> 299 <string name="emulation_control_adjust">Regola l\'overlay</string>
273 <string name="emulation_control_scale">Scala</string> 300 <string name="emulation_control_scale">Scala</string>
274 <string name="emulation_control_opacity">Opacità</string> 301 <string name="emulation_control_opacity">Opacità</string>
275 <string name="emulation_touch_overlay_reset">Reimposta l\'Overlay</string> 302 <string name="emulation_touch_overlay_reset">Reimposta l\'overlay</string>
276 <string name="emulation_touch_overlay_edit">Modifica l\'Overlay</string> 303 <string name="emulation_touch_overlay_edit">Modifica l\'overlay</string>
277 <string name="emulation_pause">Sospendi l\'emulazione</string> 304 <string name="emulation_pause">Sospendi l\'emulazione</string>
278 <string name="emulation_unpause">Riprendi l\'emulazione</string> 305 <string name="emulation_unpause">Riprendi l\'emulazione</string>
279 <string name="emulation_input_overlay">Opzioni overlay</string> 306 <string name="emulation_input_overlay">Opzioni overlay</string>
307 <string name="touchscreen">Touchscreen</string>
280 308
281 <string name="load_settings">Carico le impostazioni...</string> 309 <string name="load_settings">Carico le impostazioni...</string>
282 310
@@ -308,6 +336,7 @@
308 336
309 <!-- Memory Sizes --> 337 <!-- Memory Sizes -->
310 <string name="memory_byte">Byte</string> 338 <string name="memory_byte">Byte</string>
339 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">Kb</string> 340 <string name="memory_kilobyte">Kb</string>
312 <string name="memory_megabyte">Mb</string> 341 <string name="memory_megabyte">Mb</string>
313 <string name="memory_gigabyte">GB</string> 342 <string name="memory_gigabyte">GB</string>
@@ -352,10 +381,9 @@
352 <string name="anti_aliasing_smaa">SMAA</string> 381 <string name="anti_aliasing_smaa">SMAA</string>
353 382
354 <!-- Screen Layouts --> 383 <!-- Screen Layouts -->
384 <string name="screen_layout_auto">Automatico</string>
355 <string name="screen_layout_landscape">Layout Orizzontale</string> 385 <string name="screen_layout_landscape">Layout Orizzontale</string>
356 <string name="screen_layout_portrait">Layout Verticale</string> 386 <string name="screen_layout_portrait">Layout Verticale</string>
357 <string name="screen_layout_auto">Automatico</string>
358
359 <!-- Aspect Ratios --> 387 <!-- Aspect Ratios -->
360 <string name="ratio_default">Predefinito (16:9)</string> 388 <string name="ratio_default">Predefinito (16:9)</string>
361 <string name="ratio_force_four_three">Forza 4:3</string> 389 <string name="ratio_force_four_three">Forza 4:3</string>
@@ -390,9 +418,14 @@
390 <string name="theme_mode_light">Chiaro</string> 418 <string name="theme_mode_light">Chiaro</string>
391 <string name="theme_mode_dark">Scuro</string> 419 <string name="theme_mode_dark">Scuro</string>
392 420
393 <!-- Audio output engines -->
394 <string name="cubeb">cubeb</string> 421 <string name="cubeb">cubeb</string>
395 422
423 <!-- Anisotropic filtering options -->
424 <string name="multiplier_two">2x</string>
425 <string name="multiplier_four">4x</string>
426 <string name="multiplier_eight">8x</string>
427 <string name="multiplier_sixteen">16x</string>
428
396 <!-- Black backgrounds theme --> 429 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">Sfondi neri</string> 430 <string name="use_black_backgrounds">Sfondi neri</string>
398 <string name="use_black_backgrounds_description">Quando utilizzi il tema scuro, applica sfondi neri.</string> 431 <string name="use_black_backgrounds_description">Quando utilizzi il tema scuro, applica sfondi neri.</string>
diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml
index 3be4e7d26..0cff40bb6 100644
--- a/src/android/app/src/main/res/values-ja/strings.xml
+++ b/src/android/app/src/main/res/values-ja/strings.xml
@@ -39,7 +39,7 @@
39 <string name="add_games_warning_description">ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ãªã„ã¨ã€ã‚²ãƒ¼ãƒ ãŒãƒªã‚¹ãƒˆã«è¡¨ç¤ºã•れã¾ã›ã‚“。</string> 39 <string name="add_games_warning_description">ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ãªã„ã¨ã€ã‚²ãƒ¼ãƒ ãŒãƒªã‚¹ãƒˆã«è¡¨ç¤ºã•れã¾ã›ã‚“。</string>
40 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> 40 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
41 <string name="home_search_games">ゲームを検索</string> 41 <string name="home_search_games">ゲームを検索</string>
42 <string name="search_settings">検索設定</string> 42 <string name="search_settings">設定を検索</string>
43 <string name="games_dir_selected">ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã—ãŸ</string> 43 <string name="games_dir_selected">ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã—ãŸ</string>
44 <string name="install_prod_keys">prod.keys</string> 44 <string name="install_prod_keys">prod.keys</string>
45 <string name="install_prod_keys_description">製å“版ゲームã®å¾©å·åŒ–ã«å¿…è¦ã§ã™</string> 45 <string name="install_prod_keys_description">製å“版ゲームã®å¾©å·åŒ–ã«å¿…è¦ã§ã™</string>
@@ -68,6 +68,7 @@
68 <string name="invalid_keys_error">æš—å·åŒ–キーãŒç„¡åй</string> 68 <string name="invalid_keys_error">æš—å·åŒ–キーãŒç„¡åй</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">ファイルãŒé–“é•ã£ã¦ã„ã‚‹ã‹ç ´æã—ã¦ã„ã¾ã™ã€‚キーをå†ãƒ€ãƒ³ãƒ—ã—ã¦ãã ã•ã„。</string> 70 <string name="install_keys_failure_description">ファイルãŒé–“é•ã£ã¦ã„ã‚‹ã‹ç ´æã—ã¦ã„ã¾ã™ã€‚キーをå†ãƒ€ãƒ³ãƒ—ã—ã¦ãã ã•ã„。</string>
71 <string name="gpu_driver_manager">GPUドライãƒãƒ¼ã®ç®¡ç†</string>
71 <string name="install_gpu_driver">GPUドライãƒãƒ¼</string> 72 <string name="install_gpu_driver">GPUドライãƒãƒ¼</string>
72 <string name="install_gpu_driver_description">代替ドライãƒãƒ¼ã‚’インストールã—ã¦ãƒ‘フォーマンスや精度をå‘上ã•ã›ã¾ã™</string> 73 <string name="install_gpu_driver_description">代替ドライãƒãƒ¼ã‚’インストールã—ã¦ãƒ‘フォーマンスや精度をå‘上ã•ã›ã¾ã™</string>
73 <string name="advanced_settings">高度ãªè¨­å®š</string> 74 <string name="advanced_settings">高度ãªè¨­å®š</string>
@@ -111,6 +112,9 @@
111 <string name="custom_driver_not_supported">カスタムドライãƒã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“</string> 112 <string name="custom_driver_not_supported">カスタムドライãƒã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“</string>
112 <string name="manage_yuzu_data">yuzu データを管ç†</string> 113 <string name="manage_yuzu_data">yuzu データを管ç†</string>
113 <string name="share_save_file">セーブファイルを共有</string> 114 <string name="share_save_file">セーブファイルを共有</string>
115 <string name="applets_error_firmware">ファームウェア未インストール</string>
116 <string name="album_applet">アルãƒãƒ </string>
117 <string name="cabinet_nickname_and_owner">ニックãƒãƒ¼ãƒ ã¨æ‰€æœ‰è€…ã®è¨­å®š</string>
114 <!-- About screen strings --> 118 <!-- About screen strings -->
115 <string name="gaia_is_not_real">ガイアã¯å®Ÿåœ¨ã—ãªã„</string> 119 <string name="gaia_is_not_real">ガイアã¯å®Ÿåœ¨ã—ãªã„</string>
116 <string name="copied_to_clipboard">クリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ</string> 120 <string name="copied_to_clipboard">クリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ</string>
@@ -178,10 +182,9 @@
178 <string name="renderer_reactive_flushing_description">一部ã®ã‚²ãƒ¼ãƒ ã«ãŠã„ã¦ã€ãƒ‘フォーマンスを犠牲ã«ã—ãªãŒã‚‰ã‚‚ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ç²¾åº¦ã‚’å‘上ã•ã›ã¾ã™ã€‚</string> 182 <string name="renderer_reactive_flushing_description">一部ã®ã‚²ãƒ¼ãƒ ã«ãŠã„ã¦ã€ãƒ‘フォーマンスを犠牲ã«ã—ãªãŒã‚‰ã‚‚ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ç²¾åº¦ã‚’å‘上ã•ã›ã¾ã™ã€‚</string>
179 <string name="use_disk_shader_cache">ディスクシェーダーキャッシュ</string> 183 <string name="use_disk_shader_cache">ディスクシェーダーキャッシュ</string>
180 <string name="use_disk_shader_cache_description">生æˆã—ãŸã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ã‚’端末ã«ä¿å­˜ã—ã¦èª­ã¿è¾¼ã¿ã€ã‚³ãƒžè½ã¡ã‚’軽減ã—ã¾ã™ã€‚</string> 184 <string name="use_disk_shader_cache_description">生æˆã—ãŸã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ã‚’端末ã«ä¿å­˜ã—ã¦èª­ã¿è¾¼ã¿ã€ã‚³ãƒžè½ã¡ã‚’軽減ã—ã¾ã™ã€‚</string>
181
182 <!-- Debug settings strings --> 185 <!-- Debug settings strings -->
183 <string name="cpu">CPU</string> 186 <string name="cpu">CPU</string>
184 <string name="cpu_debug_mode">CPU デãƒãƒƒã‚®ãƒ³ã‚°</string> 187 <string name="cpu_debug_mode">CPUデãƒãƒƒã‚°</string>
185 <string name="gpu">GPU</string> 188 <string name="gpu">GPU</string>
186 <string name="renderer_api">API</string> 189 <string name="renderer_api">API</string>
187 <string name="renderer_debug">グラフィックデãƒãƒƒã‚°</string> 190 <string name="renderer_debug">グラフィックデãƒãƒƒã‚°</string>
@@ -215,14 +218,17 @@
215 <string name="export_failed">エクスãƒãƒ¼ãƒˆå¤±æ•—</string> 218 <string name="export_failed">エクスãƒãƒ¼ãƒˆå¤±æ•—</string>
216 <string name="import_failed">インãƒãƒ¼ãƒˆå¤±æ•—</string> 219 <string name="import_failed">インãƒãƒ¼ãƒˆå¤±æ•—</string>
217 <string name="cancelling">キャンセル中</string> 220 <string name="cancelling">キャンセル中</string>
218 221 <string name="install">インストール</string>
222 <string name="delete">削除</string>
223 <string name="start">é–‹å§‹</string>
224 <string name="clear">クリア</string>
225 <string name="custom">カスタム</string>
219 <!-- GPU driver installation --> 226 <!-- GPU driver installation -->
220 <string name="select_gpu_driver">GPUドライãƒã‚’é¸æŠž</string> 227 <string name="select_gpu_driver">GPUドライãƒã‚’é¸æŠž</string>
221 <string name="select_gpu_driver_title">ç¾åœ¨ã®GPUドライãƒã‚’ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ</string> 228 <string name="select_gpu_driver_title">ç¾åœ¨ã®GPUドライãƒã‚’ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ</string>
222 <string name="select_gpu_driver_install">インストール</string> 229 <string name="select_gpu_driver_install">インストール</string>
223 <string name="select_gpu_driver_default">デフォルト</string> 230 <string name="select_gpu_driver_default">デフォルト</string>
224 <string name="select_gpu_driver_use_default">デフォルトã®ãƒ‰ãƒ©ã‚¤ãƒã‚’使用ã—ã¾ã™</string> 231 <string name="select_gpu_driver_use_default">デフォルトã®ãƒ‰ãƒ©ã‚¤ãƒã‚’使用ã—ã¾ã™</string>
225 <string name="select_gpu_driver_error">é¸æŠžã•れãŸãƒ‰ãƒ©ã‚¤ãƒãŒç„¡åйã€ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ‡ãƒ•ォルトを使用ã—ã¾ã™!</string>
226 <string name="system_gpu_driver">システムã®GPUドライãƒ</string> 232 <string name="system_gpu_driver">システムã®GPUドライãƒ</string>
227 <string name="installing_driver">インストール中…</string> 233 <string name="installing_driver">インストール中…</string>
228 234
@@ -234,7 +240,12 @@
234 <string name="preferences_audio">サウンド</string> 240 <string name="preferences_audio">サウンド</string>
235 <string name="preferences_theme">テーマã¨è‰²</string> 241 <string name="preferences_theme">テーマã¨è‰²</string>
236 <string name="preferences_debug">デãƒãƒƒã‚°</string> 242 <string name="preferences_debug">デãƒãƒƒã‚°</string>
237 243 <!-- Game properties -->
244 <string name="info">情報</string>
245 <string name="path">パス</string>
246 <string name="developer">開発元</string>
247 <string name="version">ãƒãƒ¼ã‚¸ãƒ§ãƒ³</string>
248 <string name="add_ons">アドオン</string>
238 <!-- ROM loading errors --> 249 <!-- ROM loading errors -->
239 <string name="loader_error_encrypted">ROMãŒæš—å·åŒ–ã•れã¦ã„ã¾ã™</string> 250 <string name="loader_error_encrypted">ROMãŒæš—å·åŒ–ã•れã¦ã„ã¾ã™</string>
240 <string name="loader_error_encrypted_keys_description"><![CDATA[ゲームã®å¾©å·åŒ–ã«å¿…è¦ãª <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> ファイルãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。]]></string> 251 <string name="loader_error_encrypted_keys_description"><![CDATA[ゲームã®å¾©å·åŒ–ã«å¿…è¦ãª <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> ファイルãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。]]></string>
@@ -261,6 +272,7 @@
261 <string name="emulation_pause">ä¸€æ™‚åœæ­¢</string> 272 <string name="emulation_pause">ä¸€æ™‚åœæ­¢</string>
262 <string name="emulation_unpause">å†é–‹</string> 273 <string name="emulation_unpause">å†é–‹</string>
263 <string name="emulation_input_overlay">表示オプション</string> 274 <string name="emulation_input_overlay">表示オプション</string>
275 <string name="touchscreen">タッãƒã‚¹ã‚¯ãƒªãƒ¼ãƒ³</string>
264 276
265 <string name="load_settings">設定をロード中…</string> 277 <string name="load_settings">設定をロード中…</string>
266 278
@@ -292,6 +304,7 @@
292 304
293 <!-- Memory Sizes --> 305 <!-- Memory Sizes -->
294 <string name="memory_byte">Byte</string> 306 <string name="memory_byte">Byte</string>
307 <string name="memory_byte_shorthand">B</string>
295 <string name="memory_kilobyte">KB</string> 308 <string name="memory_kilobyte">KB</string>
296 <string name="memory_megabyte">MB</string> 309 <string name="memory_megabyte">MB</string>
297 <string name="memory_gigabyte">GB</string> 310 <string name="memory_gigabyte">GB</string>
@@ -336,10 +349,9 @@
336 <string name="anti_aliasing_smaa">SMAA</string> 349 <string name="anti_aliasing_smaa">SMAA</string>
337 350
338 <!-- Screen Layouts --> 351 <!-- Screen Layouts -->
352 <string name="screen_layout_auto">自動</string>
339 <string name="screen_layout_landscape">横長</string> 353 <string name="screen_layout_landscape">横長</string>
340 <string name="screen_layout_portrait">縦長</string> 354 <string name="screen_layout_portrait">縦長</string>
341 <string name="screen_layout_auto">自動</string>
342
343 <!-- Aspect Ratios --> 355 <!-- Aspect Ratios -->
344 <string name="ratio_default">デフォルト (16:9)</string> 356 <string name="ratio_default">デフォルト (16:9)</string>
345 <string name="ratio_force_four_three">強制 4:3</string> 357 <string name="ratio_force_four_three">強制 4:3</string>
@@ -374,9 +386,14 @@
374 <string name="theme_mode_light">ライト</string> 386 <string name="theme_mode_light">ライト</string>
375 <string name="theme_mode_dark">ダーク</string> 387 <string name="theme_mode_dark">ダーク</string>
376 388
377 <!-- Audio output engines -->
378 <string name="cubeb">cubeb</string> 389 <string name="cubeb">cubeb</string>
379 390
391 <!-- Anisotropic filtering options -->
392 <string name="multiplier_two">2x</string>
393 <string name="multiplier_four">4x</string>
394 <string name="multiplier_eight">8x</string>
395 <string name="multiplier_sixteen">16x</string>
396
380 <!-- Black backgrounds theme --> 397 <!-- Black backgrounds theme -->
381 <string name="use_black_backgrounds">完全ãªé»’を使用</string> 398 <string name="use_black_backgrounds">完全ãªé»’を使用</string>
382 <string name="use_black_backgrounds_description">ダークテーマã®èƒŒæ™¯è‰²ã«é»’ãŒé©ç”¨ã•れã¾ã™ã€‚</string> 399 <string name="use_black_backgrounds_description">ダークテーマã®èƒŒæ™¯è‰²ã«é»’ãŒé©ç”¨ã•れã¾ã™ã€‚</string>
diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml
index 1b9160a23..eaa6c23ce 100644
--- a/src/android/app/src/main/res/values-ko/strings.xml
+++ b/src/android/app/src/main/res/values-ko/strings.xml
@@ -25,6 +25,8 @@
25 <string name="back">ì´ì „</string> 25 <string name="back">ì´ì „</string>
26 <string name="add_games">게임 추가</string> 26 <string name="add_games">게임 추가</string>
27 <string name="add_games_description">게임 í´ë” ì„ íƒ</string> 27 <string name="add_games_description">게임 í´ë” ì„ íƒ</string>
28 <string name="step_complete">완료ë˜ì—ˆìŠµë‹ˆë‹¤!</string>
29
28 <!-- Home strings --> 30 <!-- Home strings -->
29 <string name="home_games">게임</string> 31 <string name="home_games">게임</string>
30 <string name="home_search">검색</string> 32 <string name="home_search">검색</string>
@@ -32,11 +34,13 @@
32 <string name="empty_gamelist">파ì¼ì„ ì°¾ì„ ìˆ˜ 없거나 ì•„ì§ ê²Œìž„ 디렉터리를 ì„ íƒí•˜ì§€ 않았습니다.</string> 34 <string name="empty_gamelist">파ì¼ì„ ì°¾ì„ ìˆ˜ 없거나 ì•„ì§ ê²Œìž„ 디렉터리를 ì„ íƒí•˜ì§€ 않았습니다.</string>
33 <string name="search_and_filter_games">게임 검색 ë° í•„í„°ë§</string> 35 <string name="search_and_filter_games">게임 검색 ë° í•„í„°ë§</string>
34 <string name="select_games_folder">게임 í´ë” ì„ íƒ</string> 36 <string name="select_games_folder">게임 í´ë” ì„ íƒ</string>
35 <string name="select_games_folder_description">yuzuê°€ 게임 목ë¡ì„ 채울 수 있ë„ë¡ í—ˆìš©</string> 37 <string name="manage_game_folders">게임 í´ë” 관리</string>
38 <string name="select_games_folder_description">yuzuì— ê²Œìž„ ëª©ë¡ ì¶”ê°€í•˜ê¸°</string>
36 <string name="add_games_warning">게임 í´ë” ì„ íƒì„ 건너뛰겠습니까?</string> 39 <string name="add_games_warning">게임 í´ë” ì„ íƒì„ 건너뛰겠습니까?</string>
37 <string name="add_games_warning_description">í´ë”를 ì„ íƒí•˜ì§€ 않으면 게임 목ë¡ì— ê²Œìž„ì´ í‘œì‹œë˜ì§€ 않습니다.</string> 40 <string name="add_games_warning_description">í´ë”를 ì„ íƒí•˜ì§€ 않으면 게임 목ë¡ì— ê²Œìž„ì´ í‘œì‹œë˜ì§€ 않습니다.</string>
38 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> 41 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
39 <string name="home_search_games">게임 검색</string> 42 <string name="home_search_games">게임 검색</string>
43 <string name="search_settings">검색 설정</string>
40 <string name="games_dir_selected">게임 디렉터리를 설정했습니다.</string> 44 <string name="games_dir_selected">게임 디렉터리를 설정했습니다.</string>
41 <string name="install_prod_keys">prod.keys 설치</string> 45 <string name="install_prod_keys">prod.keys 설치</string>
42 <string name="install_prod_keys_description">패키지 게임 암호 í•´ë…ì— í•„ìš”</string> 46 <string name="install_prod_keys_description">패키지 게임 암호 í•´ë…ì— í•„ìš”</string>
@@ -65,9 +69,11 @@
65 <string name="invalid_keys_error">암호화 키가 올바르지 않ìŒ</string> 69 <string name="invalid_keys_error">암호화 키가 올바르지 않ìŒ</string>
66 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
67 <string name="install_keys_failure_description">ì„ íƒí•œ 파ì¼ì´ 잘못ë˜ì—ˆê±°ë‚˜ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤. 키를 다시 ë¤í”„하세요.</string> 71 <string name="install_keys_failure_description">ì„ íƒí•œ 파ì¼ì´ 잘못ë˜ì—ˆê±°ë‚˜ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤. 키를 다시 ë¤í”„하세요.</string>
72 <string name="gpu_driver_manager">GPU 드ë¼ì´ë²„ 관리ìž</string>
68 <string name="install_gpu_driver">GPU 드ë¼ì´ë²„ 설치</string> 73 <string name="install_gpu_driver">GPU 드ë¼ì´ë²„ 설치</string>
69 <string name="install_gpu_driver_description">잠재ì ìœ¼ë¡œ ë” ë‚˜ì€ ì„±ëŠ¥ ë˜ëŠ” ì •í™•ì„±ì„ ìœ„í•´ 대체 드ë¼ì´ë²„를 설치하세요.</string> 74 <string name="install_gpu_driver_description">잠재ì ì¸ 성능 ë˜ëŠ” ì •í™•ë„ ê°œì„ ì„ ìœ„í•´ 대체 드ë¼ì´ë²„ 설치</string>
70 <string name="advanced_settings">고급 설정</string> 75 <string name="advanced_settings">고급 설정</string>
76 <string name="advanced_settings_game">고급 설정: %1$s</string>
71 <string name="settings_description">ì—뮬레ì´í„° 설정 구성</string> 77 <string name="settings_description">ì—뮬레ì´í„° 설정 구성</string>
72 <string name="search_recently_played">최근 플레ì´</string> 78 <string name="search_recently_played">최근 플레ì´</string>
73 <string name="search_recently_added">최근 추가</string> 79 <string name="search_recently_added">최근 추가</string>
@@ -79,9 +85,13 @@
79 <string name="no_file_manager">íŒŒì¼ ê´€ë¦¬ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ</string> 85 <string name="no_file_manager">íŒŒì¼ ê´€ë¦¬ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ</string>
80 <string name="notification_no_directory_link">yuzu 디렉터리를 ì—´ 수 ì—†ìŒ</string> 86 <string name="notification_no_directory_link">yuzu 디렉터리를 ì—´ 수 ì—†ìŒ</string>
81 <string name="notification_no_directory_link_description">íŒŒì¼ ê´€ë¦¬ìžì˜ 사ì´ë“œ 패ë„ì—서 ì‚¬ìš©ìž í´ë”를 수ë™ìœ¼ë¡œ 찾아주세요.</string> 87 <string name="notification_no_directory_link_description">íŒŒì¼ ê´€ë¦¬ìžì˜ 사ì´ë“œ 패ë„ì—서 ì‚¬ìš©ìž í´ë”를 수ë™ìœ¼ë¡œ 찾아주세요.</string>
82 <string name="manage_save_data">저장 ë°ì´í„° 관리</string> 88 <string name="manage_save_data">세ì´ë¸Œ ë°ì´í„° 관리</string>
83 <string name="manage_save_data_description">저장 ë°ì´í„°ë¥¼ 발견했습니다. 아래ì—서 ì˜µì…˜ì„ ì„ íƒí•˜ì„¸ìš”.</string> 89 <string name="manage_save_data_description">세ì´ë¸Œ ë°ì´í„°ë¥¼ 발견했습니다. 아래ì—서 ì˜µì…˜ì„ ì„ íƒí•˜ì„¸ìš”.</string>
84 <string name="import_export_saves_description">저장 íŒŒì¼ ê°€ì ¸ì˜¤ê¸° ë˜ëŠ” 내보내기</string> 90 <string name="import_save_warning">세ì´ë¸Œ ë°ì´í„° 가져오기</string>
91 <string name="import_save_warning_description">ì´ ìž‘ì—…ì€ ê¸°ì¡´ ë°ì´í„° 전체를 ì„ íƒí•œ 파ì¼ë¡œ ë®ì–´ì”Œì›ë‹ˆë‹¤. 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</string>
92 <string name="import_export_saves_description">세ì´ë¸Œ íŒŒì¼ ê°€ì ¸ì˜¤ê¸° ë˜ëŠ” 내보내기</string>
93 <string name="save_files_importing">세ì´ë¸Œ íŒŒì¼ ê°€ì ¸ì˜¤ëŠ” 중...</string>
94 <string name="save_files_exporting">세ì´ë¸Œ íŒŒì¼ ë‚´ë³´ë‚´ëŠ” 중...</string>
85 <string name="save_file_imported_success">ë°ì´í„°ë¥¼ 불러왔습니다.</string> 95 <string name="save_file_imported_success">ë°ì´í„°ë¥¼ 불러왔습니다.</string>
86 <string name="save_file_invalid_zip_structure">올바르지 ì•Šì€ ì €ìž¥ 디렉터리 구조</string> 96 <string name="save_file_invalid_zip_structure">올바르지 ì•Šì€ ì €ìž¥ 디렉터리 구조</string>
87 <string name="save_file_invalid_zip_structure_description">첫 번째 하위 í´ë” ì´ë¦„ì€ ê²Œìž„ì˜ íƒ€ì´í‹€ ID여야 합니다.</string> 97 <string name="save_file_invalid_zip_structure_description">첫 번째 하위 í´ë” ì´ë¦„ì€ ê²Œìž„ì˜ íƒ€ì´í‹€ ID여야 합니다.</string>
@@ -89,15 +99,62 @@
89 <string name="export_saves">내보내기</string> 99 <string name="export_saves">내보내기</string>
90 <string name="install_firmware">펌웨어 설치</string> 100 <string name="install_firmware">펌웨어 설치</string>
91 <string name="install_firmware_description">펌웨어는 ZIP 파ì¼ì´ë©° ì¼ë¶€ ê²Œìž„ì„ ë¶€íŒ…í•˜ëŠ” ë° í•„ìš”í•©ë‹ˆë‹¤.</string> 101 <string name="install_firmware_description">펌웨어는 ZIP 파ì¼ì´ë©° ì¼ë¶€ ê²Œìž„ì„ ë¶€íŒ…í•˜ëŠ” ë° í•„ìš”í•©ë‹ˆë‹¤.</string>
92 <string name="firmware_installing">펌웨어 설치</string> 102 <string name="firmware_installing">펌웨어 설치 중...</string>
93 <string name="firmware_installed_success">펌웨어를 설치했습니다.</string> 103 <string name="firmware_installed_success">펌웨어를 설치했습니다.</string>
94 <string name="firmware_installed_failure">펌웨어 설치 실패</string> 104 <string name="firmware_installed_failure">펌웨어 설치 실패</string>
105 <string name="firmware_installed_failure_description">펌웨어 NCA 파ì¼ì´ ZIP 파ì¼ì˜ 루트 ë””ë ‰í† ë¦¬ì— ìœ„ì¹˜í•œì§€ 확ì¸í•˜ê³  다시 시ë„하세요.</string>
95 <string name="share_log">디버그 로그 공유</string> 106 <string name="share_log">디버그 로그 공유</string>
96 <string name="share_log_description">yuzuì˜ ë¡œê·¸ 파ì¼ì„ 공유하여 문제 디버깅하기</string> 107 <string name="share_log_description">문제 í•´ê²°ì„ ìœ„í•œ yuzu 로그 íŒŒì¼ ê³µìœ </string>
97 <string name="share_log_missing">로그 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다.</string> 108 <string name="share_log_missing">로그 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다.</string>
98 <string name="install_game_content">게임 콘í…츠 설치</string> 109 <string name="install_game_content">게임 콘í…츠 설치</string>
99 <string name="install_game_content_description">게임 ì—…ë°ì´íЏ ë˜ëŠ” DLC 설치</string> 110 <string name="install_game_content_description">게임 ì—…ë°ì´íЏ ë˜ëŠ” DLC 설치</string>
111 <string name="installing_game_content">콘í…츠 설치 중...</string>
112 <string name="install_game_content_failure">NANDì— íŒŒì¼ì„ 설치하는 ë™ì•ˆ 오류 ë°œìƒ</string>
113 <string name="install_game_content_failure_description">콘í…츠가 유효하고 prod.keysê°€ 설치ë˜ì—ˆëŠ”ì§€ 확ì¸í•˜ì„¸ìš”.</string>
114 <string name="install_game_content_failure_base">ì¶©ëŒì„ 방지하기 위해 기본 게임 설치는 허용ë˜ì§€ 않습니다.</string>
115 <string name="install_game_content_failure_file_extension">NSP ë° XCI 콘í…츠만 ì§€ì›í•©ë‹ˆë‹¤. 게임 콘í…츠가 유효한지 확ì¸í•˜ì„¸ìš”.</string>
116 <string name="install_game_content_failed_count">%1$dê°œì˜ ì„¤ì¹˜ 오류</string>
117 <string name="install_game_content_success">게임 콘í…츠 설치ë¨</string>
118 <string name="install_game_content_success_install">%1$d개를 설치했습니다.</string>
119 <string name="install_game_content_success_overwrite">%1$d개를 ë®ì–´ì”Œì› ìŠµë‹ˆë‹¤.</string>
100 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string> 120 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
121 <string name="custom_driver_not_supported">ì‚¬ìš©ìž ì§€ì • 드ë¼ì´ë²„는 ì§€ì›í•˜ì§€ 않습니다.</string>
122 <string name="custom_driver_not_supported_description">ì´ ìž¥ì¹˜ì˜ ì‚¬ìš©ìž ì§€ì • 드ë¼ì´ë²„ ë¡œë”©ì€ í˜„ìž¬ ì§€ì›í•˜ì§€ 않습니다.\në‚˜ì¤‘ì— ì´ ì˜µì…˜ì„ í™•ì¸í•˜ë©´ ì§€ì›ì´ 추가ë˜ì—ˆëŠ”ì§€ 확ì¸í•  수 있습니다.</string>
123 <string name="manage_yuzu_data">yuzu ë°ì´í„° 관리</string>
124 <string name="manage_yuzu_data_description">펌웨어, 키 ê°’, 유저 ë°ì´í„° ë“±ì„ ê°€ì ¸ì˜¤ê¸° ë˜ëŠ” 내보내기</string>
125 <string name="share_save_file">세ì´ë¸Œ íŒŒì¼ ê³µìœ </string>
126 <string name="export_save_failed">세ì´ë¸Œ 내보내기 실패</string>
127 <string name="game_folders">게임 í´ë”</string>
128 <string name="deep_scan">딥 스캔(하위 í´ë” íƒìƒ‰)</string>
129 <string name="add_game_folder">게임 í´ë” 추가</string>
130 <string name="folder_already_added">ì´ í´ë”는 ì´ë¯¸ 추가ë˜ì–´ 있습니다!</string>
131 <string name="game_folder_properties">게임 í´ë” ì†ì„±</string>
132 <plurals name="saves_import_failed">
133 <item quantity="other">%dê°œì˜ ì„¸ì´ë¸Œ 가져오기 실패</item>
134 </plurals>
135 <plurals name="saves_import_success">
136 <item quantity="other">%dê°œì˜ ì„¸ì´ë¸Œë¥¼ 가져왔습니다.</item>
137 </plurals>
138 <string name="no_save_data_found">세ì´ë¸Œ ë°ì´í„°ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ</string>
139
140 <!-- Applet launcher strings -->
141 <string name="applets">애플릿 런처</string>
142 <string name="applets_description">ì„¤ì¹˜ëœ íŽŒì›¨ì–´ë¥¼ 사용해 시스템 ì• í”Œë¦¿ì„ ì‹¤í–‰í•©ë‹ˆë‹¤.</string>
143 <string name="applets_error_firmware">펌웨어가 설치ë˜ì§€ 않았습니다.</string>
144 <string name="applets_error_applet">ì• í”Œë¦¿ì„ ì‚¬ìš©í•  수 ì—†ìŒ</string>
145 <string name="applets_error_description"><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 파ì¼ê³¼ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">펌웨어가</a> 설치ë˜ì—ˆëŠ”ì§€ 확ì¸í•˜ê³  다시 시ë„하세요.]]></string>
146 <string name="album_applet">앨범</string>
147 <string name="album_applet_description">시스템 사진 뷰어로 유저 스í¬ë¦°ìƒ· í´ë”ì— ì €ìž¥ëœ ì´ë¯¸ì§€ë¥¼ 확ì¸í•©ë‹ˆë‹¤. </string>
148 <string name="mii_edit_applet">Mii 편집</string>
149 <string name="mii_edit_applet_description">시스템 ì—디터로 Mii를 ë³´ê³  편집합니다.</string>
150 <string name="cabinet_applet">ìºë¹„ë‹›</string>
151 <string name="cabinet_applet_description">amiiboì— ì €ìž¥ëœ ë°ì´í„°ë¥¼ 편집하고 삭제합니다.</string>
152 <string name="cabinet_launcher">ìºë¹„ë‹› 런처</string>
153 <string name="cabinet_nickname_and_owner">닉네임 ë° ì†Œìœ ìž ì„¤ì •</string>
154 <string name="cabinet_game_data_eraser">게임 ë°ì´í„° ì‚­ì œ</string>
155 <string name="cabinet_restorer">ë³µì›</string>
156 <string name="cabinet_formatter">í¬ë§·í„°</string>
157
101 <!-- About screen strings --> 158 <!-- About screen strings -->
102 <string name="gaia_is_not_real">ê°€ì´ì•„는 진짜가 아님</string> 159 <string name="gaia_is_not_real">ê°€ì´ì•„는 진짜가 아님</string>
103 <string name="copied_to_clipboard">í´ë¦½ë³´ë“œì— 복사ë˜ì—ˆìŠµë‹ˆë‹¤.</string> 160 <string name="copied_to_clipboard">í´ë¦½ë³´ë“œì— 복사ë˜ì—ˆìŠµë‹ˆë‹¤.</string>
@@ -107,6 +164,16 @@
107 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> 164 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
108 <string name="licenses_description">Androidìš© yuzu를 가능하게 하는 프로ì íЏ</string> 165 <string name="licenses_description">Androidìš© yuzu를 가능하게 하는 프로ì íЏ</string>
109 <string name="build">빌드</string> 166 <string name="build">빌드</string>
167 <string name="user_data">유저 ë°ì´í„°</string>
168 <string name="user_data_description">모든 앱 ë°ì´í„°ë¥¼ 가져오거나 내보냅니다.\n\n유저 ë°ì´í„°ë¥¼ 가져올 경우 í˜„ìž¬ì˜ ëª¨ë“  ë°ì´í„°ëŠ” ì‚­ì œë©ë‹ˆë‹¤.</string>
169 <string name="exporting_user_data">유저 ë°ì´í„° 내보내는 중...</string>
170 <string name="importing_user_data">유저 ë°ì´í„° 가져오는 중...</string>
171 <string name="import_user_data">유저 ë°ì´í„° 가져오기</string>
172 <string name="invalid_yuzu_backup">올바르지 ì•Šì€ yuzu 백업 파ì¼</string>
173 <string name="user_data_export_success">유저 ë°ì´í„°ë¥¼ 내보냈습니다.</string>
174 <string name="user_data_import_success">유저 ë°ì´í„°ë¥¼ 가져왔습니다.</string>
175 <string name="user_data_export_cancelled">내보내기 취소ë¨</string>
176 <string name="user_data_import_failed_description">유저 ë°ì´í„° í´ë”ê°€ ZIP í´ë”ì˜ ë£¨íŠ¸ ë””ë ‰í† ë¦¬ì— ìœ„ì¹˜í•˜ê³  config/config.ini 구성 파ì¼ì´ 있는지 확ì¸í•˜ê³  다시 시ë„하세요.</string>
110 <string name="support_link">https://discord.gg/u77vRWY</string> 177 <string name="support_link">https://discord.gg/u77vRWY</string>
111 <string name="website_link">https://yuzu-emu.org/</string> 178 <string name="website_link">https://yuzu-emu.org/</string>
112 <string name="github_link">https://github.com/yuzu-emu</string> 179 <string name="github_link">https://github.com/yuzu-emu</string>
@@ -130,7 +197,10 @@
130 <string name="frame_limit_enable_description">ì—뮬레ì´ì…˜ ì†ë„를 ì •ìƒ ì†ë„ì˜ ì§€ì •ëœ ë¹„ìœ¨ë¡œ 제한합니다.</string> 197 <string name="frame_limit_enable_description">ì—뮬레ì´ì…˜ ì†ë„를 ì •ìƒ ì†ë„ì˜ ì§€ì •ëœ ë¹„ìœ¨ë¡œ 제한합니다.</string>
131 <string name="frame_limit_slider">ì†ë„ 제한 비율</string> 198 <string name="frame_limit_slider">ì†ë„ 제한 비율</string>
132 <string name="frame_limit_slider_description">ì—뮬레ì´ì…˜ ì†ë„ì˜ ì œí•œ ë¹„ìœ¨ì„ ì§€ì •í•©ë‹ˆë‹¤. 100%ê°€ ì •ìƒ ì†ë„입니다. ê°’ì´ ë†’ê±°ë‚˜ 낮으면 ì†ë„ ì œí•œì´ ì¦ê°€í•˜ê±°ë‚˜ ê°ì†Œí•©ë‹ˆë‹¤.</string> 199 <string name="frame_limit_slider_description">ì—뮬레ì´ì…˜ ì†ë„ì˜ ì œí•œ ë¹„ìœ¨ì„ ì§€ì •í•©ë‹ˆë‹¤. 100%ê°€ ì •ìƒ ì†ë„입니다. ê°’ì´ ë†’ê±°ë‚˜ 낮으면 ì†ë„ ì œí•œì´ ì¦ê°€í•˜ê±°ë‚˜ ê°ì†Œí•©ë‹ˆë‹¤.</string>
200 <string name="cpu_backend">CPU 백엔드</string>
133 <string name="cpu_accuracy">CPU 정확ë„</string> 201 <string name="cpu_accuracy">CPU 정확ë„</string>
202 <string name="value_with_units">%1$s%2$s</string>
203
134 <!-- System settings strings --> 204 <!-- System settings strings -->
135 <string name="use_docked_mode">ë… ëª¨ë“œ</string> 205 <string name="use_docked_mode">ë… ëª¨ë“œ</string>
136 <string name="use_docked_mode_description">í•´ìƒë„를 높ì´ë©° ì„±ëŠ¥ì´ ì €í•˜ë©ë‹ˆë‹¤. 비활성화시 휴대 모드가 사용ë˜ë©° í•´ìƒë„는 낮아지고 ì„±ëŠ¥ì€ í–¥ìƒë©ë‹ˆë‹¤.</string> 206 <string name="use_docked_mode_description">í•´ìƒë„를 높ì´ë©° ì„±ëŠ¥ì´ ì €í•˜ë©ë‹ˆë‹¤. 비활성화시 휴대 모드가 사용ë˜ë©° í•´ìƒë„는 낮아지고 ì„±ëŠ¥ì€ í–¥ìƒë©ë‹ˆë‹¤.</string>
@@ -139,13 +209,14 @@
139 <string name="select_rtc_date">RTC ë‚ ì§œ ì„ íƒ</string> 209 <string name="select_rtc_date">RTC ë‚ ì§œ ì„ íƒ</string>
140 <string name="select_rtc_time">RTC 시간 ì„ íƒ</string> 210 <string name="select_rtc_time">RTC 시간 ì„ íƒ</string>
141 <string name="use_custom_rtc">ì‚¬ìš©ìž ì§€ì • RTC</string> 211 <string name="use_custom_rtc">ì‚¬ìš©ìž ì§€ì • RTC</string>
142 <string name="use_custom_rtc_description">현재 시스템 시간과 별ë„로 ì‚¬ìš©ìž ì§€ì • 실시간 시계를 설정할 수 있습니다.</string> 212 <string name="use_custom_rtc_description">현재 시스템 시간과 별ë„로 ì‚¬ìš©ìž ì§€ì • RTC를 설정할 수 있습니다.</string>
143 <string name="set_custom_rtc">ì‚¬ìš©ìž ì§€ì • RTC 설정</string> 213 <string name="set_custom_rtc">ì‚¬ìš©ìž ì§€ì • RTC 설정</string>
144 214
145 <!-- Graphics settings strings --> 215 <!-- Graphics settings strings -->
146 <string name="renderer_accuracy">ì •í™•ë„ ìˆ˜ì¤€</string> 216 <string name="renderer_accuracy">ì •í™•ë„ ìˆ˜ì¤€</string>
147 <string name="renderer_resolution">í•´ìƒë„ (휴대 모드/ë… ëª¨ë“œ)</string> 217 <string name="renderer_resolution">í•´ìƒë„ (휴대 모드/ë… ëª¨ë“œ)</string>
148 <string name="renderer_vsync">수ì§ë™ê¸°í™” 모드</string> 218 <string name="renderer_vsync">수ì§ë™ê¸°í™” 모드</string>
219 <string name="renderer_screen_layout">화면 방향</string>
149 <string name="renderer_aspect_ratio">화면비</string> 220 <string name="renderer_aspect_ratio">화면비</string>
150 <string name="renderer_scaling_filter">윈ë„ìš° ì ì‘ í•„í„°</string> 221 <string name="renderer_scaling_filter">윈ë„ìš° ì ì‘ í•„í„°</string>
151 <string name="renderer_anti_aliasing">안티ì—ì¼ë¦¬ì–´ì‹± 방법</string> 222 <string name="renderer_anti_aliasing">안티ì—ì¼ë¦¬ì–´ì‹± 방법</string>
@@ -157,12 +228,21 @@
157 <string name="renderer_reactive_flushing_description">ì¼ë¶€ 게임ì—서 성능 저하를 ê°ìˆ˜í•˜ê³  ë Œë”ë§ ì •í™•ë„를 í–¥ìƒí•©ë‹ˆë‹¤.</string> 228 <string name="renderer_reactive_flushing_description">ì¼ë¶€ 게임ì—서 성능 저하를 ê°ìˆ˜í•˜ê³  ë Œë”ë§ ì •í™•ë„를 í–¥ìƒí•©ë‹ˆë‹¤.</string>
158 <string name="use_disk_shader_cache">ë””ìŠ¤í¬ ì…°ì´ë” ìºì‹œ</string> 229 <string name="use_disk_shader_cache">ë””ìŠ¤í¬ ì…°ì´ë” ìºì‹œ</string>
159 <string name="use_disk_shader_cache_description">ìƒì„±ëœ ì…°ì´ë”를 ë¡œì»¬ì— ì €ìž¥í•˜ê³  로드하여 ëŠê¹€ 현ìƒì„ 줄입니다.</string> 230 <string name="use_disk_shader_cache_description">ìƒì„±ëœ ì…°ì´ë”를 ë¡œì»¬ì— ì €ìž¥í•˜ê³  로드하여 ëŠê¹€ 현ìƒì„ 줄입니다.</string>
231 <string name="anisotropic_filtering">비등방성 í•„í„°ë§</string>
232 <string name="anisotropic_filtering_description">경사ê°ì—서 ë³´ì´ëŠ” í…ìŠ¤ì²˜ì˜ í’ˆì§ˆì„ í–¥ìƒì‹œí‚µë‹ˆë‹¤.</string>
160 233
161 <!-- Debug settings strings --> 234 <!-- Debug settings strings -->
162 <string name="cpu">CPU</string> 235 <string name="cpu">CPU</string>
236 <string name="cpu_debug_mode">CPU 디버깅</string>
237 <string name="cpu_debug_mode_description">CPU를 ëŠë¦° 디버깅 모드로 설정합니다.</string>
238 <string name="gpu">GPU</string>
163 <string name="renderer_api">API</string> 239 <string name="renderer_api">API</string>
164 <string name="renderer_debug">그래픽 디버깅</string> 240 <string name="renderer_debug">그래픽 디버깅</string>
165 <string name="renderer_debug_description">그래픽 API를 ëŠë¦° 디버깅 모드로 설정합니다.</string> 241 <string name="renderer_debug_description">그래픽 API를 ëŠë¦° 디버깅 모드로 설정합니다.</string>
242 <string name="fastmem">Fastmem</string>
243
244 <!-- Audio settings strings -->
245 <string name="audio_output_engine">출력 엔진</string>
166 <string name="audio_volume">볼륨</string> 246 <string name="audio_volume">볼륨</string>
167 <string name="audio_volume_description">오디오 ì¶œë ¥ì˜ ë³¼ë¥¨ì„ ì§€ì •í•©ë‹ˆë‹¤.</string> 247 <string name="audio_volume_description">오디오 ì¶œë ¥ì˜ ë³¼ë¥¨ì„ ì§€ì •í•©ë‹ˆë‹¤.</string>
168 248
@@ -171,12 +251,15 @@
171 <string name="ini_saved">ì„¤ì •ì´ ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤.</string> 251 <string name="ini_saved">ì„¤ì •ì´ ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤.</string>
172 <string name="gameid_saved">%1$s ì „ìš© ì„¤ì •ì´ ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤.</string> 252 <string name="gameid_saved">%1$s ì „ìš© ì„¤ì •ì´ ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤.</string>
173 <string name="error_saving">%1$s.ini 저장 중 오류 ë°œìƒ: %2$s</string> 253 <string name="error_saving">%1$s.ini 저장 중 오류 ë°œìƒ: %2$s</string>
254 <string name="unimplemented_menu">구현ë˜ì§€ ì•Šì€ ë©”ë‰´</string>
174 <string name="loading">불러오는 중...</string> 255 <string name="loading">불러오는 중...</string>
256 <string name="shutting_down">종료하는 중...</string>
175 <string name="reset_setting_confirmation">ì´ ì„¤ì •ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 재설정하겠습니까?</string> 257 <string name="reset_setting_confirmation">ì´ ì„¤ì •ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 재설정하겠습니까?</string>
176 <string name="reset_to_default">기본값으로 재설정</string> 258 <string name="reset_to_default">기본값으로 재설정</string>
259 <string name="reset_to_default_description">모든 고급 설정 초기화</string>
177 <string name="reset_all_settings">모든 ì„¤ì •ì„ ì´ˆê¸°í™”í•˜ê² ìŠµë‹ˆê¹Œ?</string> 260 <string name="reset_all_settings">모든 ì„¤ì •ì„ ì´ˆê¸°í™”í•˜ê² ìŠµë‹ˆê¹Œ?</string>
178 <string name="reset_all_settings_description">모든 고급 ì„¤ì •ì´ ê¸°ë³¸ 구성으로 재설정ë©ë‹ˆë‹¤. ì´ ìž‘ì—…ì€ ë˜ëŒë¦´ 수 없습니다.</string> 261 <string name="reset_all_settings_description">모든 고급 ì„¤ì •ì´ ê¸°ë³¸ 구성으로 재설정ë©ë‹ˆë‹¤. ì´ ìž‘ì—…ì€ ë˜ëŒë¦´ 수 없습니다.</string>
179 <string name="settings_reset">설정 초기화</string> 262 <string name="settings_reset">ì„¤ì •ì„ ì´ˆê¸°í™”í–ˆìŠµë‹ˆë‹¤.</string>
180 <string name="close">닫기</string> 263 <string name="close">닫기</string>
181 <string name="learn_more">ìžì„¸ížˆ</string> 264 <string name="learn_more">ìžì„¸ížˆ</string>
182 <string name="auto">ìžë™</string> 265 <string name="auto">ìžë™</string>
@@ -184,13 +267,30 @@
184 <string name="string_null">Null</string> 267 <string name="string_null">Null</string>
185 <string name="string_import">가져오기</string> 268 <string name="string_import">가져오기</string>
186 <string name="export">내보내기</string> 269 <string name="export">내보내기</string>
270 <string name="export_failed">내보내기 실패</string>
271 <string name="import_failed">가져오기 실패</string>
272 <string name="cancelling">취소하는 중</string>
273 <string name="install">설치</string>
274 <string name="delete">삭제</string>
275 <string name="edit">편집</string>
276 <string name="export_success">ë°ì´í„°ë¥¼ 내보냈습니다.</string>
277 <string name="start">시작</string>
278 <string name="clear">초기화</string>
279 <string name="global">글로벌</string>
280 <string name="custom">커스텀</string>
281 <string name="notice">알림</string>
282 <string name="import_complete">가져오기 완료</string>
283 <string name="more_options">추가 옵션</string>
284 <string name="use_global_setting">글로벌 설정 사용</string>
285
187 <!-- GPU driver installation --> 286 <!-- GPU driver installation -->
188 <string name="select_gpu_driver">GPU 드ë¼ì´ë²„ ì„ íƒ</string> 287 <string name="select_gpu_driver">GPU 드ë¼ì´ë²„ ì„ íƒ</string>
189 <string name="select_gpu_driver_title">현재 ì‚¬ìš©ì¤‘ì¸ GPU 드ë¼ì´ë²„를 변경하겠습니까?</string> 288 <string name="select_gpu_driver_title">현재 ì‚¬ìš©ì¤‘ì¸ GPU 드ë¼ì´ë²„를 변경하겠습니까?</string>
190 <string name="select_gpu_driver_install">설치</string> 289 <string name="select_gpu_driver_install">설치</string>
191 <string name="select_gpu_driver_default">기본값</string> 290 <string name="select_gpu_driver_default">기본값</string>
192 <string name="select_gpu_driver_use_default">기본 GPU 드ë¼ì´ë²„를 사용합니다.</string> 291 <string name="select_gpu_driver_use_default">기본 GPU 드ë¼ì´ë²„를 사용합니다.</string>
193 <string name="select_gpu_driver_error">ìž˜ëª»ëœ ë“œë¼ì´ë¸Œê°€ ì„ íƒë˜ì—ˆìŠµë‹ˆë‹¤. 시스템 ê¸°ë³¸ê°’ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.</string> 292 <string name="select_gpu_driver_error">ìž˜ëª»ëœ ë“œë¼ì´ë²„ê°€ ì„ íƒë˜ì—ˆìŠµë‹ˆë‹¤.</string>
293 <string name="driver_already_installed">ì´ë¯¸ ì„¤ì¹˜ëœ ë“œë¼ì´ë²„입니다.</string>
194 <string name="system_gpu_driver">시스템 GPU 드ë¼ì´ë²„</string> 294 <string name="system_gpu_driver">시스템 GPU 드ë¼ì´ë²„</string>
195 <string name="installing_driver">드ë¼ì´ë²„ 설치 중...</string> 295 <string name="installing_driver">드ë¼ì´ë²„ 설치 중...</string>
196 296
@@ -198,13 +298,58 @@
198 <string name="preferences_settings">설정</string> 298 <string name="preferences_settings">설정</string>
199 <string name="preferences_general">ì¼ë°˜</string> 299 <string name="preferences_general">ì¼ë°˜</string>
200 <string name="preferences_system">시스템</string> 300 <string name="preferences_system">시스템</string>
301 <string name="preferences_system_description">ë… ëª¨ë“œ, 지역, 언어</string>
201 <string name="preferences_graphics">그래픽</string> 302 <string name="preferences_graphics">그래픽</string>
303 <string name="preferences_graphics_description">ì •í™•ë„ ìˆ˜ì¤€, í•´ìƒë„, ì…°ì´ë” ìºì‹œ</string>
202 <string name="preferences_audio">오디오</string> 304 <string name="preferences_audio">오디오</string>
305 <string name="preferences_audio_description">출력 엔진, 불륨</string>
203 <string name="preferences_theme">테마 ë° ìƒ‰ìƒ</string> 306 <string name="preferences_theme">테마 ë° ìƒ‰ìƒ</string>
204 <string name="preferences_debug">디버그</string> 307 <string name="preferences_debug">디버그</string>
308 <string name="preferences_debug_description">CPU/GPU 디버깅, 그래픽 API, Fastmem</string>
309
310 <!-- Game properties -->
311 <string name="info">ì •ë³´</string>
312 <string name="info_description">프로그램 ID, 개발ìž, 버전</string>
313 <string name="per_game_settings">게임별 설정</string>
314 <string name="per_game_settings_description">현재 ê²Œìž„ì— ì ìš©ë˜ëŠ” ì„¤ì •ì„ íŽ¸ì§‘í•©ë‹ˆë‹¤.</string>
315 <string name="launch_options">실행 구성</string>
316 <string name="path">주소</string>
317 <string name="program_id">프로그램 ID</string>
318 <string name="developer">개발ìž</string>
319 <string name="version">버전</string>
320 <string name="copy_details">세부사항 복사</string>
321 <string name="add_ons">부가 기능</string>
322 <string name="add_ons_description">모드, ì—…ë°ì´íЏ ë° DLC 전환하기</string>
323 <string name="clear_shader_cache">ì…°ì´ë” ìºì‹œ 비우기</string>
324 <string name="clear_shader_cache_description">현재 ê²Œìž„ì„ ì‹¤í–‰í•˜ëŠ” ì¤‘ì— ìƒì„±ëœ 모든 ì…°ì´ë”를 삭제합니다.</string>
325 <string name="clear_shader_cache_warning_description">ì…°ì´ë” ìºì‹œê°€ 재ìƒì„±ë˜ì–´ ê²Œìž„ì´ ë²„ë²…ì¼ ìˆ˜ 있습니다.</string>
326 <string name="cleared_shaders_successfully">ì…°ì´ë”를 비웠습니다.</string>
327 <string name="addons_game">애드온: %1$s</string>
328 <string name="save_data">세ì´ë¸Œ ë°ì´í„°</string>
329 <string name="save_data_description">현재 ê²Œìž„ì— ì‚¬ìš©ë˜ëŠ” 세ì´ë¸Œ ë°ì´í„°ë¥¼ 관리합니다.</string>
330 <string name="delete_save_data">세ì´ë¸Œ ë°ì´í„° 삭제하기</string>
331 <string name="delete_save_data_description">현재 ê²Œìž„ì— ì‚¬ìš©ë˜ëŠ” 모든 세ì´ë¸Œ ë°ì´í„°ë¥¼ 삭제합니다.</string>
332 <string name="delete_save_data_warning_description">ì´ ìž‘ì—…ì€ í˜„ìž¬ ê²Œìž„ì˜ ì„¸ì´ë¸Œ ë°ì´í„°ë¥¼ ëª¨ë‘ ì‚­ì œí•˜ê³  ë˜ëŒë¦´ 수 없습니다. 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</string>
333 <string name="save_data_deleted_successfully">세ì´ë¸Œ ë°ì´í„°ë¥¼ 삭제했습니다.</string>
334 <string name="select_content_type">콘í…츠 형태</string>
335 <string name="updates_and_dlc">ì—…ë°ì´íЏ ë° DLC</string>
336 <string name="mods_and_cheats">모드 ë° ì¹˜íŠ¸</string>
337 <string name="addon_notice">중요 애드온 알림</string>
338 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
339 <string name="addon_notice_description">모드와 치트를 설치하려면 cheats/, romfs/, ë˜ëŠ” exefs/ 디렉토리를 í¬í•¨í•˜ëŠ” í´ë”를 ì„ íƒí•´ì•¼ 합니다. ê²Œìž„ê³¼ì˜ í˜¸í™˜ 여부를 확ì¸í•  수 없기 ë•Œë¬¸ì— ì‹ ì¤‘í•˜ê²Œ 결정하세요.</string>
340 <string name="invalid_directory">ìž˜ëª»ëœ ë””ë ‰í† ë¦¬</string>
341 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
342 <string name="invalid_directory_description">ì„ íƒí•œ 디렉토리가 cheats/, romfs/, ë˜ëŠ” exefs/ í´ë”를 í¬í•¨í•˜ëŠ”ì§€ 확ì¸í•˜ê³  다시 시ë„하세요.</string>
343 <string name="addon_installed_successfully">ì• ë“œì˜¨ì„ ì„¤ì¹˜í–ˆìŠµë‹ˆë‹¤.</string>
344 <string name="verifying_content">콘í…츠 í™•ì¸ ì¤‘...</string>
345 <string name="content_install_notice">콘í…츠 설치 안내</string>
346 <string name="content_install_notice_description">ì„ íƒí•œ 콘í…츠가 현재 게임과 ì¼ì¹˜í•˜ì§€ 않습니다.\n무시하고 설치하시겠습니까?</string>
347 <string name="confirm_uninstall">제거 확ì¸</string>
348 <string name="confirm_uninstall_description">ì´ ì• ë“œì˜¨ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</string>
205 349
206 <!-- ROM loading errors --> 350 <!-- ROM loading errors -->
207 <string name="loader_error_encrypted">롬 파ì¼ì´ 암호화ë˜ì–´ìžˆìŒ</string> 351 <string name="loader_error_encrypted">롬 파ì¼ì´ 암호화ë˜ì–´ìžˆìŒ</string>
352 <string name="loader_error_encrypted_roms_description"><![CDATA[ê°€ì´ë“œì— ë”°ë¼ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">게임 카트리지</a> ë˜ëŠ” <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">ì„¤ì¹˜ëœ íƒ€ì´í‹€</a>ì„ ë‹¤ì‹œ ë¤í”„하세요.]]></string>
208 <string name="loader_error_encrypted_keys_description"><![CDATA[ê²Œìž„ì„ í•´ë…í•  수 있ë„ë¡ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 파ì¼ì´ 설치ë˜ì–´ 있는지 확ì¸í•˜ì„¸ìš”.]]></string> 353 <string name="loader_error_encrypted_keys_description"><![CDATA[ê²Œìž„ì„ í•´ë…í•  수 있ë„ë¡ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 파ì¼ì´ 설치ë˜ì–´ 있는지 확ì¸í•˜ì„¸ìš”.]]></string>
209 <string name="loader_error_video_core">비디오 코어를 초기화하는 ë™ì•ˆ 오류 ë°œìƒ</string> 354 <string name="loader_error_video_core">비디오 코어를 초기화하는 ë™ì•ˆ 오류 ë°œìƒ</string>
210 <string name="loader_error_video_core_description">ì¼ë°˜ì ìœ¼ë¡œ ì´ ë¬¸ì œëŠ” 호환ë˜ì§€ 않는 GPU 드ë¼ì´ë²„로 ì¸í•´ ë°œìƒí•©ë‹ˆë‹¤. ì‚¬ìš©ìž ì§€ì • GPU 드ë¼ì´ë²„를 설치하면 ì´ ë¬¸ì œê°€ í•´ê²°ë  ìˆ˜ 있습니다.</string> 355 <string name="loader_error_video_core_description">ì¼ë°˜ì ìœ¼ë¡œ ì´ ë¬¸ì œëŠ” 호환ë˜ì§€ 않는 GPU 드ë¼ì´ë²„로 ì¸í•´ ë°œìƒí•©ë‹ˆë‹¤. ì‚¬ìš©ìž ì§€ì • GPU 드ë¼ì´ë²„를 설치하면 ì´ ë¬¸ì œê°€ í•´ê²°ë  ìˆ˜ 있습니다.</string>
@@ -229,6 +374,7 @@
229 <string name="emulation_pause">ì—뮬레ì´ì…˜ ì¼ì‹œ 중지</string> 374 <string name="emulation_pause">ì—뮬레ì´ì…˜ ì¼ì‹œ 중지</string>
230 <string name="emulation_unpause">ì—뮬레ì´ì…˜ ì¼ì‹œ 중지 í•´ì œ</string> 375 <string name="emulation_unpause">ì—뮬레ì´ì…˜ ì¼ì‹œ 중지 í•´ì œ</string>
231 <string name="emulation_input_overlay">화면 ì˜¤ë²„ë ˆì´ ì„¤ì •</string> 376 <string name="emulation_input_overlay">화면 ì˜¤ë²„ë ˆì´ ì„¤ì •</string>
377 <string name="touchscreen">터치 스í¬ë¦°</string>
232 378
233 <string name="load_settings">설정 불러오는 중...</string> 379 <string name="load_settings">설정 불러오는 중...</string>
234 380
@@ -245,6 +391,10 @@
245 <string name="fatal_error">ì¹˜ëª…ì  ì˜¤ë¥˜</string> 391 <string name="fatal_error">ì¹˜ëª…ì  ì˜¤ë¥˜</string>
246 <string name="fatal_error_message">ì¹˜ëª…ì  ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ ë¡œê·¸ë¥¼ 확ì¸í•˜ì‹­ì‹œì˜¤.\nì—뮬레ì´ì…˜ì„ 계ì†í•˜ë©´ ì¶©ëŒ ë° ë²„ê·¸ê°€ ë°œìƒí•  수 있습니다.</string> 392 <string name="fatal_error_message">ì¹˜ëª…ì  ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ ë¡œê·¸ë¥¼ 확ì¸í•˜ì‹­ì‹œì˜¤.\nì—뮬레ì´ì…˜ì„ 계ì†í•˜ë©´ ì¶©ëŒ ë° ë²„ê·¸ê°€ ë°œìƒí•  수 있습니다.</string>
247 <string name="performance_warning">ì´ ì„¤ì •ì„ ë„ë©´ ì—뮬레ì´ì…˜ ì„±ëŠ¥ì´ í¬ê²Œ 저하ë©ë‹ˆë‹¤! 최ìƒì˜ í™˜ê²½ì„ ìœ„í•´ ì´ ì„¤ì •ì„ í™œì„±í™”ëœ ìƒíƒœë¡œ ë‘는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.</string> 393 <string name="performance_warning">ì´ ì„¤ì •ì„ ë„ë©´ ì—뮬레ì´ì…˜ ì„±ëŠ¥ì´ í¬ê²Œ 저하ë©ë‹ˆë‹¤! 최ìƒì˜ í™˜ê²½ì„ ìœ„í•´ ì´ ì„¤ì •ì„ í™œì„±í™”ëœ ìƒíƒœë¡œ ë‘는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.</string>
394 <string name="device_memory_inadequate">장치 RAM: %1$s\n권장: %2$s</string>
395 <string name="memory_formatted">%1$s %2$s</string>
396 <string name="no_game_present">실행 가능한 ê²Œìž„ì´ ì—†ìŠµë‹ˆë‹¤!</string>
397
248 <!-- Region Names --> 398 <!-- Region Names -->
249 <string name="region_japan">ì¼ë³¸</string> 399 <string name="region_japan">ì¼ë³¸</string>
250 <string name="region_usa">미국</string> 400 <string name="region_usa">미국</string>
@@ -254,7 +404,16 @@
254 <string name="region_korea">대한민국</string> 404 <string name="region_korea">대한민국</string>
255 <string name="region_taiwan">대만</string> 405 <string name="region_taiwan">대만</string>
256 406
407 <!-- Memory Sizes -->
408 <string name="memory_byte">Byte</string>
409 <string name="memory_byte_shorthand">B</string>
410 <string name="memory_kilobyte">KB</string>
411 <string name="memory_megabyte">MB</string>
257 <string name="memory_gigabyte">ì˜êµ­ 하계 표준시(GB)</string> 412 <string name="memory_gigabyte">ì˜êµ­ 하계 표준시(GB)</string>
413 <string name="memory_terabyte">TB</string>
414 <string name="memory_petabyte">PB</string>
415 <string name="memory_exabyte">EB</string>
416
258 <!-- Renderer APIs --> 417 <!-- Renderer APIs -->
259 <string name="renderer_vulkan">Vulcan</string> 418 <string name="renderer_vulkan">Vulcan</string>
260 <string name="renderer_none">ì—†ìŒ</string> 419 <string name="renderer_none">ì—†ìŒ</string>
@@ -291,7 +450,14 @@
291 <string name="anti_aliasing_fxaa">FXAA</string> 450 <string name="anti_aliasing_fxaa">FXAA</string>
292 <string name="anti_aliasing_smaa">SMAA</string> 451 <string name="anti_aliasing_smaa">SMAA</string>
293 452
453 <!-- Screen Layouts -->
294 <string name="screen_layout_auto">ìžë™</string> 454 <string name="screen_layout_auto">ìžë™</string>
455 <string name="screen_layout_sensor_landscape">가로 ê³ ì • (ë°©í–¥ ê°ì§€)</string>
456 <string name="screen_layout_landscape">가로</string>
457 <string name="screen_layout_reverse_landscape">가로 고정 (역방향 고정)</string>
458 <string name="screen_layout_sensor_portrait">세로 ê³ ì • (ë°©í–¥ ê°ì§€)</string>
459 <string name="screen_layout_portrait">세로</string>
460 <string name="screen_layout_reverse_portrait">세로 고정 (역방향 고정)</string>
295 461
296 <!-- Aspect Ratios --> 462 <!-- Aspect Ratios -->
297 <string name="ratio_default">기본 (16:9)</string> 463 <string name="ratio_default">기본 (16:9)</string>
@@ -300,6 +466,10 @@
300 <string name="ratio_force_sixteen_ten">강제 16:10</string> 466 <string name="ratio_force_sixteen_ten">강제 16:10</string>
301 <string name="ratio_stretch">í™”ë©´ì— ë§žì¶¤</string> 467 <string name="ratio_stretch">í™”ë©´ì— ë§žì¶¤</string>
302 468
469 <!-- CPU Backend -->
470 <string name="cpu_backend_dynarmic">Dynarmic (ëŠë¦¼)</string>
471 <string name="cpu_backend_nce">네ì´í‹°ë¸Œ 코드 실행 (NCE)</string>
472
303 <!-- CPU Accuracy --> 473 <!-- CPU Accuracy -->
304 <string name="cpu_accuracy_accurate">정확함</string> 474 <string name="cpu_accuracy_accurate">정확함</string>
305 <string name="cpu_accuracy_unsafe">최ì í™” (안전하지 않ìŒ)</string> 475 <string name="cpu_accuracy_unsafe">최ì í™” (안전하지 않ìŒ)</string>
@@ -327,14 +497,29 @@
327 <string name="theme_mode_light">ë¼ì´íЏ 모드</string> 497 <string name="theme_mode_light">ë¼ì´íЏ 모드</string>
328 <string name="theme_mode_dark">ë‹¤í¬ ëª¨ë“œ</string> 498 <string name="theme_mode_dark">ë‹¤í¬ ëª¨ë“œ</string>
329 499
500 <!-- Audio output engines -->
501 <string name="oboe">oboe</string>
502 <string name="cubeb">cubeb</string>
503
504 <!-- Anisotropic filtering options -->
505 <string name="multiplier_two">2x</string>
506 <string name="multiplier_four">4x</string>
507 <string name="multiplier_eight">8x</string>
508 <string name="multiplier_sixteen">16x</string>
509
330 <!-- Black backgrounds theme --> 510 <!-- Black backgrounds theme -->
331 <string name="use_black_backgrounds">검정 배경</string> 511 <string name="use_black_backgrounds">검정 배경</string>
332 <string name="use_black_backgrounds_description">ì–´ë‘ìš´ 테마를 사용할 때는 검정 ë°°ê²½ì„ ì ìš©í•©ë‹ˆë‹¤.</string> 512 <string name="use_black_backgrounds_description">ì–´ë‘ìš´ 테마 사용 시 검정 ë°°ê²½ì„ ì ìš©í•©ë‹ˆë‹¤.</string>
333 513
514 <!-- Picture-In-Picture -->
515 <string name="picture_in_picture">픽처 ì¸ í”½ì²˜ (Picture-in-Picture)</string>
516 <string name="picture_in_picture_description">ì•±ì„ ë°±ê·¸ë¼ìš´ë“œì—서 실행할 때 ì°½ì„ ìµœì†Œí™”í•©ë‹ˆë‹¤.</string>
517 <string name="pause">ì¼ì‹œì¤‘ì§€</string>
518 <string name="play">재ìƒ</string>
334 <string name="mute">ìŒì†Œê±°</string> 519 <string name="mute">ìŒì†Œê±°</string>
335 <string name="unmute">ìŒì†Œê±° í•´ì œ</string> 520 <string name="unmute">ìŒì†Œê±° í•´ì œ</string>
336 521
337 <!-- Licenses screen strings --> 522 <!-- Licenses screen strings -->
338 <string name="licenses">ë¼ì´ì„¼ìФ</string> 523 <string name="licenses">ë¼ì´ì„¼ìФ</string>
339 <string name="license_fidelityfx_fsr_description">AMDì˜ ê³ í’ˆì§ˆ 업스케ì¼ë§</string> 524 <string name="license_fidelityfx_fsr_description">AMD 고품질 업스케ì¼ë§</string>
340 </resources> 525 </resources>
diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml
index 3162a9d41..e92dc62d9 100644
--- a/src/android/app/src/main/res/values-nb/strings.xml
+++ b/src/android/app/src/main/res/values-nb/strings.xml
@@ -157,7 +157,6 @@
157 <string name="renderer_reactive_flushing_description">Forbedrer gjengivelsesnøyaktigheten i enkelte spill på bekostning av ytelsen.</string> 157 <string name="renderer_reactive_flushing_description">Forbedrer gjengivelsesnøyaktigheten i enkelte spill på bekostning av ytelsen.</string>
158 <string name="use_disk_shader_cache">Disk shader-hurtigbuffer</string> 158 <string name="use_disk_shader_cache">Disk shader-hurtigbuffer</string>
159 <string name="use_disk_shader_cache_description">Reduserer hakking ved å lagre og laste inn genererte shaders lokalt.</string> 159 <string name="use_disk_shader_cache_description">Reduserer hakking ved å lagre og laste inn genererte shaders lokalt.</string>
160
161 <!-- Debug settings strings --> 160 <!-- Debug settings strings -->
162 <string name="cpu">CPU</string> 161 <string name="cpu">CPU</string>
163 <string name="renderer_api">API</string> 162 <string name="renderer_api">API</string>
@@ -184,13 +183,16 @@
184 <string name="string_null">Null</string> 183 <string name="string_null">Null</string>
185 <string name="string_import">Importer</string> 184 <string name="string_import">Importer</string>
186 <string name="export">Eksporter</string> 185 <string name="export">Eksporter</string>
186 <string name="install">Installer</string>
187 <string name="delete">Slett</string>
188 <string name="start">Start</string>
189 <string name="clear">Fjern</string>
187 <!-- GPU driver installation --> 190 <!-- GPU driver installation -->
188 <string name="select_gpu_driver">Velg GPU-driver</string> 191 <string name="select_gpu_driver">Velg GPU-driver</string>
189 <string name="select_gpu_driver_title">Ønsker du å bytte ut din nåværende GPU-driver?</string> 192 <string name="select_gpu_driver_title">Ønsker du å bytte ut din nåværende GPU-driver?</string>
190 <string name="select_gpu_driver_install">Installer</string> 193 <string name="select_gpu_driver_install">Installer</string>
191 <string name="select_gpu_driver_default">Standard</string> 194 <string name="select_gpu_driver_default">Standard</string>
192 <string name="select_gpu_driver_use_default">Bruk av standard GPU-driver</string> 195 <string name="select_gpu_driver_use_default">Bruk av standard GPU-driver</string>
193 <string name="select_gpu_driver_error">Ugyldig driver valgt, bruker systemstandard!</string>
194 <string name="system_gpu_driver">Systemets GPU-driver</string> 196 <string name="system_gpu_driver">Systemets GPU-driver</string>
195 <string name="installing_driver">Installerer driver...</string> 197 <string name="installing_driver">Installerer driver...</string>
196 198
@@ -202,7 +204,12 @@
202 <string name="preferences_audio">Lyd</string> 204 <string name="preferences_audio">Lyd</string>
203 <string name="preferences_theme">Tema og farge</string> 205 <string name="preferences_theme">Tema og farge</string>
204 <string name="preferences_debug">Feilsøk</string> 206 <string name="preferences_debug">Feilsøk</string>
205 207 <!-- Game properties -->
208 <string name="info">Info</string>
209 <string name="path">Sti</string>
210 <string name="developer">Utvikler</string>
211 <string name="version">Versjon</string>
212 <string name="add_ons">Tilleggsprogrammer</string>
206 <!-- ROM loading errors --> 213 <!-- ROM loading errors -->
207 <string name="loader_error_encrypted">ROM-en din er kryptert</string> 214 <string name="loader_error_encrypted">ROM-en din er kryptert</string>
208 <string name="loader_error_encrypted_keys_description"><![CDATA[Vennligst sørg for at <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> filen er installert slik at spillene kan dekrypteres.]]></string> 215 <string name="loader_error_encrypted_keys_description"><![CDATA[Vennligst sørg for at <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> filen er installert slik at spillene kan dekrypteres.]]></string>
@@ -229,6 +236,7 @@
229 <string name="emulation_pause">Pause emulering</string> 236 <string name="emulation_pause">Pause emulering</string>
230 <string name="emulation_unpause">Ta emuleringen ut av pause</string> 237 <string name="emulation_unpause">Ta emuleringen ut av pause</string>
231 <string name="emulation_input_overlay">Overlay-alternativer</string> 238 <string name="emulation_input_overlay">Overlay-alternativer</string>
239 <string name="touchscreen">Touch-skjerm</string>
232 240
233 <string name="load_settings">Laster inn innstillinger...</string> 241 <string name="load_settings">Laster inn innstillinger...</string>
234 242
@@ -254,6 +262,7 @@
254 <string name="region_korea">Korea</string> 262 <string name="region_korea">Korea</string>
255 <string name="region_taiwan">Taiwan</string> 263 <string name="region_taiwan">Taiwan</string>
256 264
265 <string name="memory_byte_shorthand">B</string>
257 <string name="memory_gigabyte">GB</string> 266 <string name="memory_gigabyte">GB</string>
258 <!-- Renderer APIs --> 267 <!-- Renderer APIs -->
259 <string name="renderer_vulkan">Vulkan</string> 268 <string name="renderer_vulkan">Vulkan</string>
@@ -291,8 +300,8 @@
291 <string name="anti_aliasing_fxaa">FXAA</string> 300 <string name="anti_aliasing_fxaa">FXAA</string>
292 <string name="anti_aliasing_smaa">SMAA</string> 301 <string name="anti_aliasing_smaa">SMAA</string>
293 302
303 <!-- Screen Layouts -->
294 <string name="screen_layout_auto">Auto</string> 304 <string name="screen_layout_auto">Auto</string>
295
296 <!-- Aspect Ratios --> 305 <!-- Aspect Ratios -->
297 <string name="ratio_default">Standard (16:9)</string> 306 <string name="ratio_default">Standard (16:9)</string>
298 <string name="ratio_force_four_three">Tving 4:3</string> 307 <string name="ratio_force_four_three">Tving 4:3</string>
@@ -327,6 +336,12 @@
327 <string name="theme_mode_light">Lys</string> 336 <string name="theme_mode_light">Lys</string>
328 <string name="theme_mode_dark">Mørk</string> 337 <string name="theme_mode_dark">Mørk</string>
329 338
339 <!-- Anisotropic filtering options -->
340 <string name="multiplier_two">2x</string>
341 <string name="multiplier_four">4x</string>
342 <string name="multiplier_eight">8x</string>
343 <string name="multiplier_sixteen">16x</string>
344
330 <!-- Black backgrounds theme --> 345 <!-- Black backgrounds theme -->
331 <string name="use_black_backgrounds">Svart bakgrunn</string> 346 <string name="use_black_backgrounds">Svart bakgrunn</string>
332 <string name="use_black_backgrounds_description">Bruk svart bakgrunn når du bruker det mørke temaet.</string> 347 <string name="use_black_backgrounds_description">Bruk svart bakgrunn når du bruker det mørke temaet.</string>
diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml
index f4d9920c2..fbd0ad7e9 100644
--- a/src/android/app/src/main/res/values-pl/strings.xml
+++ b/src/android/app/src/main/res/values-pl/strings.xml
@@ -157,7 +157,6 @@
157 <string name="renderer_reactive_flushing_description">Poprawia jakość renderowania w kilku grach, kosztem wydajności.</string> 157 <string name="renderer_reactive_flushing_description">Poprawia jakość renderowania w kilku grach, kosztem wydajności.</string>
158 <string name="use_disk_shader_cache">Pamięć podręczna shaderów</string> 158 <string name="use_disk_shader_cache">Pamięć podręczna shaderów</string>
159 <string name="use_disk_shader_cache_description">Zmniejsza przycięcia przez przechowywanie gotowych wygenerowanych plików oświetlenia w pamięci urządzenia.</string> 159 <string name="use_disk_shader_cache_description">Zmniejsza przycięcia przez przechowywanie gotowych wygenerowanych plików oświetlenia w pamięci urządzenia.</string>
160
161 <!-- Debug settings strings --> 160 <!-- Debug settings strings -->
162 <string name="cpu">CPU</string> 161 <string name="cpu">CPU</string>
163 <string name="renderer_api">Interfejs graficzny</string> 162 <string name="renderer_api">Interfejs graficzny</string>
@@ -183,13 +182,17 @@
183 <string name="submit">Zatwierdź</string> 182 <string name="submit">Zatwierdź</string>
184 <string name="string_import">Importuj</string> 183 <string name="string_import">Importuj</string>
185 <string name="export">Eksportuj</string> 184 <string name="export">Eksportuj</string>
185 <string name="install">Zainstaluj</string>
186 <string name="delete">Usuń</string>
187 <string name="start">Start</string>
188 <string name="clear">Wyczyść</string>
189 <string name="custom">Losowy</string>
186 <!-- GPU driver installation --> 190 <!-- GPU driver installation -->
187 <string name="select_gpu_driver">Wybierz sterownik GPU </string> 191 <string name="select_gpu_driver">Wybierz sterownik GPU </string>
188 <string name="select_gpu_driver_title">Chcesz zastąpić obecny sterownik układu graficznego?</string> 192 <string name="select_gpu_driver_title">Chcesz zastąpić obecny sterownik układu graficznego?</string>
189 <string name="select_gpu_driver_install">Zainstaluj</string> 193 <string name="select_gpu_driver_install">Zainstaluj</string>
190 <string name="select_gpu_driver_default">Domyślne</string> 194 <string name="select_gpu_driver_default">Domyślne</string>
191 <string name="select_gpu_driver_use_default">Aktywny domyślny sterownik GPU</string> 195 <string name="select_gpu_driver_use_default">Aktywny domyślny sterownik GPU</string>
192 <string name="select_gpu_driver_error">Wybrano błędny sterownik, powrót do domyślnego. </string>
193 <string name="system_gpu_driver">Systemowy sterownik GPU</string> 196 <string name="system_gpu_driver">Systemowy sterownik GPU</string>
194 <string name="installing_driver">Instalowanie sterownika...</string> 197 <string name="installing_driver">Instalowanie sterownika...</string>
195 198
@@ -201,7 +204,12 @@
201 <string name="preferences_audio">Dźwięk</string> 204 <string name="preferences_audio">Dźwięk</string>
202 <string name="preferences_theme">Motyw i kolor</string> 205 <string name="preferences_theme">Motyw i kolor</string>
203 <string name="preferences_debug">Debug</string> 206 <string name="preferences_debug">Debug</string>
204 207 <!-- Game properties -->
208 <string name="info">Informacje</string>
209 <string name="path">Ścieżka</string>
210 <string name="developer">Deweloper</string>
211 <string name="version">Wersja</string>
212 <string name="add_ons">Dodatki</string>
205 <!-- ROM loading errors --> 213 <!-- ROM loading errors -->
206 <string name="loader_error_encrypted">Twój ROM jest zakodowany</string> 214 <string name="loader_error_encrypted">Twój ROM jest zakodowany</string>
207 <string name="loader_error_encrypted_keys_description"><![CDATA[Upewnij się że plik kluczy <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> jest zainstalowany aby gry mogły zostać odczytane.]]></string> 215 <string name="loader_error_encrypted_keys_description"><![CDATA[Upewnij się że plik kluczy <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> jest zainstalowany aby gry mogły zostać odczytane.]]></string>
@@ -228,6 +236,7 @@
228 <string name="emulation_pause">Wstrzymaj emulacjÄ™</string> 236 <string name="emulation_pause">Wstrzymaj emulacjÄ™</string>
229 <string name="emulation_unpause">Wznów emulację</string> 237 <string name="emulation_unpause">Wznów emulację</string>
230 <string name="emulation_input_overlay">Opcje nakładki</string> 238 <string name="emulation_input_overlay">Opcje nakładki</string>
239 <string name="touchscreen">Ekran dotykowy</string>
231 240
232 <string name="load_settings">WczytujÄ™ ustawienia...</string> 241 <string name="load_settings">WczytujÄ™ ustawienia...</string>
233 242
@@ -253,6 +262,7 @@
253 <string name="region_korea">Korea</string> 262 <string name="region_korea">Korea</string>
254 <string name="region_taiwan">Tajwan</string> 263 <string name="region_taiwan">Tajwan</string>
255 264
265 <string name="memory_byte_shorthand">B</string>
256 <string name="memory_gigabyte">GB</string> 266 <string name="memory_gigabyte">GB</string>
257 <!-- Renderer APIs --> 267 <!-- Renderer APIs -->
258 <string name="renderer_vulkan">Vulkan</string> 268 <string name="renderer_vulkan">Vulkan</string>
@@ -290,8 +300,8 @@
290 <string name="anti_aliasing_fxaa">FXAA</string> 300 <string name="anti_aliasing_fxaa">FXAA</string>
291 <string name="anti_aliasing_smaa">SMAA</string> 301 <string name="anti_aliasing_smaa">SMAA</string>
292 302
303 <!-- Screen Layouts -->
293 <string name="screen_layout_auto">Automatyczny</string> 304 <string name="screen_layout_auto">Automatyczny</string>
294
295 <!-- Aspect Ratios --> 305 <!-- Aspect Ratios -->
296 <string name="ratio_default">Domyślne (16:9)</string> 306 <string name="ratio_default">Domyślne (16:9)</string>
297 <string name="ratio_force_four_three">WymuÅ› 4:3</string> 307 <string name="ratio_force_four_three">WymuÅ› 4:3</string>
@@ -326,6 +336,12 @@
326 <string name="theme_mode_light">Jasny</string> 336 <string name="theme_mode_light">Jasny</string>
327 <string name="theme_mode_dark">Ciemny</string> 337 <string name="theme_mode_dark">Ciemny</string>
328 338
339 <!-- Anisotropic filtering options -->
340 <string name="multiplier_two">2x</string>
341 <string name="multiplier_four">4x</string>
342 <string name="multiplier_eight">8x</string>
343 <string name="multiplier_sixteen">16x</string>
344
329 <!-- Black backgrounds theme --> 345 <!-- Black backgrounds theme -->
330 <string name="use_black_backgrounds">Czarne tła</string> 346 <string name="use_black_backgrounds">Czarne tła</string>
331 <string name="use_black_backgrounds_description">Kiedy używany ciemny motyw, tła zostają zastąpione czernią.</string> 347 <string name="use_black_backgrounds_description">Kiedy używany ciemny motyw, tła zostają zastąpione czernią.</string>
diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml
index 8888fc750..a87eb11e4 100644
--- a/src/android/app/src/main/res/values-pt-rBR/strings.xml
+++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml
@@ -1,10 +1,10 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves. &lt;br /&gt;&lt;br /&gt;Antes de começar, por favor localize o arquivo <![CDATA[1 prod.keys 1]]> no armazenamento de seu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[2Saiba mais2]]></string> 4 <string name="app_disclaimer">Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.&lt;br /&gt;&lt;br /&gt;Antes de começar, por favor localize o arquivo <![CDATA[<b> prod.keys </b>]]> no armazenamento de seu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saiba mais</a>]]></string>
5 <string name="emulation_notification_channel_name">Emulação está Ativa</string> 5 <string name="emulation_notification_channel_name">A emulação está Ativa</string>
6 <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação estiver em andamento.</string> 6 <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação estiver em andamento.</string>
7 <string name="emulation_notification_running">Yuzu está em execução </string> 7 <string name="emulation_notification_running">O Yuzu está em execução </string>
8 <string name="notice_notification_channel_name">Notificações e erros</string> 8 <string name="notice_notification_channel_name">Notificações e erros</string>
9 <string name="notice_notification_channel_description">Mostra notificações quando algo dá errado.</string> 9 <string name="notice_notification_channel_description">Mostra notificações quando algo dá errado.</string>
10 <string name="notification_permission_not_granted">Acesso às notificações não concedido!</string> 10 <string name="notification_permission_not_granted">Acesso às notificações não concedido!</string>
@@ -17,7 +17,7 @@
17 <string name="keys_description">Selecione seu arquivo &lt;b>prod.keys&lt;/b> com o botão abaixo.</string> 17 <string name="keys_description">Selecione seu arquivo &lt;b>prod.keys&lt;/b> com o botão abaixo.</string>
18 <string name="select_keys">Selecione as Keys</string> 18 <string name="select_keys">Selecione as Keys</string>
19 <string name="games">Jogos</string> 19 <string name="games">Jogos</string>
20 <string name="games_description">Seleciona sua pasta &lt;b>Jogos&lt;/b> com o botão abaixo.</string> 20 <string name="games_description">Selecione sua pasta &lt;b>Jogos&lt;/b> com o botão abaixo.</string>
21 <string name="done">Feito</string> 21 <string name="done">Feito</string>
22 <string name="done_description">Tudo pronto.\nAproveite seus jogos!</string> 22 <string name="done_description">Tudo pronto.\nAproveite seus jogos!</string>
23 <string name="text_continue">Continuar</string> 23 <string name="text_continue">Continuar</string>
@@ -34,61 +34,67 @@
34 <string name="empty_gamelist">Não foram encontrados jogos ou a pasta de Jogos ainda não foi definida. </string> 34 <string name="empty_gamelist">Não foram encontrados jogos ou a pasta de Jogos ainda não foi definida. </string>
35 <string name="search_and_filter_games">Procura e filtra jogos.</string> 35 <string name="search_and_filter_games">Procura e filtra jogos.</string>
36 <string name="select_games_folder">Seleciona a pasta de jogos.</string> 36 <string name="select_games_folder">Seleciona a pasta de jogos.</string>
37 <string name="manage_game_folders">Gerencie as pastas de jogos</string>
37 <string name="select_games_folder_description">Permite que o Yuzu preencha a lista de jogos</string> 38 <string name="select_games_folder_description">Permite que o Yuzu preencha a lista de jogos</string>
38 <string name="add_games_warning">Ignorar a seleção da pasta de jogos?</string> 39 <string name="add_games_warning">Ignorar a seleção da pasta de jogos?</string>
39 <string name="add_games_warning_description">Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada.</string> 40 <string name="add_games_warning_description">Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada.</string>
40 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> 41 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
41 <string name="home_search_games">Procurar jogos</string> 42 <string name="home_search_games">Procurar jogos</string>
42 <string name="search_settings">Procurar nas definições</string> 43 <string name="search_settings">Procurar nas configurações</string>
43 <string name="games_dir_selected">Pasta de Jogos selecionada</string> 44 <string name="games_dir_selected">Pasta de jogos selecionada</string>
44 <string name="install_prod_keys">Instala prod.keys</string> 45 <string name="install_prod_keys">Instalar prod.keys</string>
45 <string name="install_prod_keys_description">Necessário para desencriptar jogos comerciais</string> 46 <string name="install_prod_keys_description">Necessário para desencriptar jogos comerciais</string>
46 <string name="install_prod_keys_warning">Ignorar a adição de chaves?</string> 47 <string name="install_prod_keys_warning">Ignorar a adição de chaves?</string>
47 <string name="install_prod_keys_warning_description">São necessárias chaves válidas para emular jogos comerciais. Somente aplicativos homebrew funcionarão se você continuar.</string> 48 <string name="install_prod_keys_warning_description">São necessárias chaves válidas para emular jogos comerciais. Somente aplicativos homebrew funcionarão se você continuar.</string>
48 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#Guia de introdução</string> 49 <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
49 <string name="notifications">Notificações</string> 50 <string name="notifications">Notificações</string>
50 <string name="notifications_description">Conceda a permissão de notificação com o botão abaixo.</string> 51 <string name="notifications_description">Conceda a permissão de notificação com o botão abaixo.</string>
51 <string name="give_permission">Conceda permissão</string> 52 <string name="give_permission">Conceder permissão</string>
52 <string name="notification_warning">Saltar a concessão da permissão de notificação?</string> 53 <string name="notification_warning">Ignorar a concessão da permissão de notificação?</string>
53 <string name="notification_warning_description">Yuzu não conseguirá te notificar de informações importantes. </string> 54 <string name="notification_warning_description">Yuzu não conseguirá te notificar de informações importantes. </string>
54 <string name="permission_denied">Permissão negada</string> 55 <string name="permission_denied">Permissão negada</string>
55 <string name="permission_denied_description">Você negou essa permissão muitas vezes e agora precisa concedê-la manualmente nas configurações do sistema.</string> 56 <string name="permission_denied_description">Você negou essa permissão muitas vezes e agora precisa concedê-la manualmente nas configurações do sistema.</string>
56 <string name="about">Sobre</string> 57 <string name="about">Sobre</string>
57 <string name="about_description">Versão de compilação, créditos e mais</string> 58 <string name="about_description">Versão de compilação, créditos e mais</string>
58 <string name="warning_help">Ajuda</string> 59 <string name="warning_help">Ajuda</string>
59 <string name="warning_skip">Saltar</string> 60 <string name="warning_skip">Ignorar</string>
60 <string name="warning_cancel">Cancelar</string> 61 <string name="warning_cancel">Cancelar</string>
61 <string name="install_amiibo_keys">Instala chaves Amiibo</string> 62 <string name="install_amiibo_keys">Instalar chaves Amiibo</string>
62 <string name="install_amiibo_keys_description">Necessário para usares Amiibo no jogo</string> 63 <string name="install_amiibo_keys_description">Necessário para usar Amiibos em um jogo</string>
63 <string name="invalid_keys_file">Ficheiro de chaves inválido</string> 64 <string name="invalid_keys_file">Arquivo de chaves selecionado inválido</string>
64 <string name="install_keys_success">Chaves instaladas com sucesso</string> 65 <string name="install_keys_success">Chaves instaladas com sucesso</string>
65 <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> 66 <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string>
66 <string name="install_prod_keys_failure_extension_description">Verifique se seu arquivo keys possui a extensão .keys e tente novamente.</string> 67 <string name="install_prod_keys_failure_extension_description">Verifique se seu arquivo de chaves possui a extensão .keys e tente novamente.</string>
67 <string name="install_amiibo_keys_failure_extension_description">Verifique se seu arquivo keys possui a extensão .bin e tente novamente.</string> 68 <string name="install_amiibo_keys_failure_extension_description">Verifique se seu arquivo de chaves possui a extensão .bin e tente novamente.</string>
68 <string name="invalid_keys_error">Chaves de encriptação inválidas</string> 69 <string name="invalid_keys_error">Chaves de encriptação inválidas</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> 71 <string name="install_keys_failure_description">O arquivo selecionado está incorreto ou corrompido. Por favor extraia suas chaves novamente.</string>
72 <string name="gpu_driver_manager">Gerenciador de driver de GPU</string>
71 <string name="install_gpu_driver">Instala driver para GPU</string> 73 <string name="install_gpu_driver">Instala driver para GPU</string>
72 <string name="install_gpu_driver_description">Instala drivers alternativos para desempenho ou precisão potencialmente melhores</string> 74 <string name="install_gpu_driver_description">Instala drivers alternativos para desempenho ou precisão potencialmente melhores</string>
73 <string name="advanced_settings">Definições avançadas</string> 75 <string name="advanced_settings">Configurações avançadas</string>
74 <string name="advanced_settings_game">Definições avançadas: %1$s</string> 76 <string name="advanced_settings_game">Configurações avançadas: %1$s</string>
75 <string name="settings_description">Configura definições do emulador</string> 77 <string name="settings_description">Configure opções do emulador</string>
76 <string name="search_recently_played">Jogado recentemente</string> 78 <string name="search_recently_played">Jogado recentemente</string>
77 <string name="search_recently_added">Adicionado recentemente</string> 79 <string name="search_recently_added">Adicionado recentemente</string>
78 <string name="search_retail">Jogos comerciais</string> 80 <string name="search_retail">Jogos comerciais</string>
79 <string name="search_homebrew">Homebrew</string> 81 <string name="search_homebrew">Homebrew</string>
80 <string name="open_user_folder">Abre a pasta Yuzu</string> 82 <string name="open_user_folder">Abrir a pasta do Yuzu</string>
81 <string name="open_user_folder_description">Gere os ficheiro internos do Yuzu</string> 83 <string name="open_user_folder_description">Gerencie os arquivos internos do Yuzu</string>
82 <string name="theme_and_color_description">Modifica a aparência da App</string> 84 <string name="theme_and_color_description">Altere a aparência do aplicativo</string>
83 <string name="no_file_manager">Nenhum gestor de ficheiros encontrado</string> 85 <string name="no_file_manager">Nenhum gerenciador de arquivos encontrado</string>
84 <string name="notification_no_directory_link">Impossível abrir pasta Yuzu</string> 86 <string name="notification_no_directory_link">Não foi possível abrir a pasta do Yuzu</string>
85 <string name="notification_no_directory_link_description">Localiza a pasta de utilizador manualmente com o painel lateral do gestor de ficheiros.</string> 87 <string name="notification_no_directory_link_description">Por favor localize a pasta do usuário com o painel lateral do gerenciador de arquivos manualmente.</string>
86 <string name="manage_save_data">Gerir dados guardados</string> 88 <string name="manage_save_data">Gerenciar os dados salvos dos jogos</string>
87 <string name="manage_save_data_description">Dados não encontrados. Por favor seleciona uma opção abaixo.</string> 89 <string name="manage_save_data_description">Dados salvos encontrados. Por favor selecione uma opção abaixo.</string>
88 <string name="import_export_saves_description">Importa ou exporta dados guardados</string> 90 <string name="import_save_warning">Importar dados salvos</string>
91 <string name="import_save_warning_description">Isso irá sobrescrever seus dados salvos com o arquivo selecionado. Você tem certeza que quer continuar?</string>
92 <string name="import_export_saves_description">Importa ou exporta arquivos de dados salvos</string>
93 <string name="save_files_importing">Importando dados salvos...</string>
94 <string name="save_files_exporting">Exportando arquivos de dados salvos...</string>
89 <string name="save_file_imported_success">Importado com sucesso</string> 95 <string name="save_file_imported_success">Importado com sucesso</string>
90 <string name="save_file_invalid_zip_structure">Estrutura de diretório de dados invalida</string> 96 <string name="save_file_invalid_zip_structure">Estrutura de diretório de dados salvos inválida</string>
91 <string name="save_file_invalid_zip_structure_description">O nome da primeira sub pasta tem de ser a ID do jogo.</string> 97 <string name="save_file_invalid_zip_structure_description">O nome da primeira sub pasta deve ser a ID do jogo.</string>
92 <string name="import_saves">Importar</string> 98 <string name="import_saves">Importar</string>
93 <string name="export_saves">Exportar</string> 99 <string name="export_saves">Exportar</string>
94 <string name="install_firmware">Instalar firmware</string> 100 <string name="install_firmware">Instalar firmware</string>
@@ -96,55 +102,89 @@
96 <string name="firmware_installing">Instalando firmware</string> 102 <string name="firmware_installing">Instalando firmware</string>
97 <string name="firmware_installed_success">Firmware instalado com sucesso.</string> 103 <string name="firmware_installed_success">Firmware instalado com sucesso.</string>
98 <string name="firmware_installed_failure">Falha na instalação do firmware</string> 104 <string name="firmware_installed_failure">Falha na instalação do firmware</string>
99 <string name="firmware_installed_failure_description">Cofirma que os ficheiros firmware nca estão no root do finheiro zip e tenta de novo.</string> 105 <string name="firmware_installed_failure_description">Verifique se os arquivos nca do firmware estão na raiz do arquivo zip e tente novamente.</string>
100 <string name="share_log">Compartilhe registros de debug.</string> 106 <string name="share_log">Compartilhar registros de debug</string>
101 <string name="share_log_description">Compartilhe o arquivo de registro do yuzu para obter ajuda com problemas</string> 107 <string name="share_log_description">Compartilhe o arquivo de registro do yuzu para obter ajuda com problemas</string>
102 <string name="share_log_missing">Arquivo de registro não encontrado</string> 108 <string name="share_log_missing">Arquivo de registro não encontrado</string>
103 <string name="install_game_content">Instalar conteúdo de jogos</string> 109 <string name="install_game_content">Instalar conteúdo de jogos</string>
104 <string name="install_game_content_description">Instalar atualizações de jogos ou DLC</string> 110 <string name="install_game_content_description">Instala atualizações de jogos ou DLC</string>
105 <string name="installing_game_content">A instalar conteúdo...</string> 111 <string name="installing_game_content">Instalando conteúdo...</string>
106 <string name="install_game_content_failure">Erro ao instalar ficheiro(s) para NAND</string> 112 <string name="install_game_content_failure">Erro ao instalar arquivo(s) na NAND</string>
107 <string name="install_game_content_failure_description">Por favor confitma que o conteúdo(s) é válido e que as prod.keys estão instaladas.</string> 113 <string name="install_game_content_failure_description">Por favor certifique-se de que o(s) conteúdo(s) é (são) válido(s) e que as prod.keys estão instaladas.</string>
108 <string name="install_game_content_failure_base">A instalação de jogos base não é permitida para evitar possíveis conflitos.</string> 114 <string name="install_game_content_failure_base">A instalação de jogos base não é permitida para evitar possíveis conflitos.</string>
109 <string name="install_game_content_failure_file_extension">Sò conteúdos NSP e XCI são suportados. Por favor verifica que o conteúdo(s) do jogo são válidos.</string> 115 <string name="install_game_content_failure_file_extension">Somente conteúdos NSP e XCI são suportados. Por favor verifique se o(s) conteúdo(s) do jogo é (são) válido(s).</string>
110 <string name="install_game_content_failed_count">%1$d erro(s) de instalação</string> 116 <string name="install_game_content_failed_count">%1$d erro(s) de instalação</string>
111 <string name="install_game_content_success">Conteúdo(s) de jogo instalados com sucesso</string> 117 <string name="install_game_content_success">Conteúdo(s) de jogo instalado(s) com sucesso</string>
112 <string name="install_game_content_success_install">%1$d instalado com sucesso</string> 118 <string name="install_game_content_success_install">%1$d instalado com sucesso</string>
113 <string name="install_game_content_success_overwrite">%1$d substituída com êxito</string> 119 <string name="install_game_content_success_overwrite">%1$d substituído com sucesso</string>
114 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string> 120 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
115 <string name="custom_driver_not_supported">Drivers personalizados não suportados</string> 121 <string name="custom_driver_not_supported">Drivers personalizados não suportados</string>
116 <string name="custom_driver_not_supported_description">Carrea«gamento de drivers personalizados não é suportado pr este dispositivo. \nCheck verifica esta opção de futuro para confirmar se o suporte foi adicionado!</string> 122 <string name="custom_driver_not_supported_description">Carregamento de drivers personalizados não suportado para este dispositivo no momento.\nVerifique esse opção novamente no futuro para ver se o suporte foi adicionado!</string>
117 <string name="manage_yuzu_data">Administrar dados yuzu</string> 123 <string name="manage_yuzu_data">Administrar dados do yuzu</string>
118 <string name="manage_yuzu_data_description">Importa/exporta firmware, chaves, dados do usuário e mais!</string> 124 <string name="manage_yuzu_data_description">Importa/exporta firmware, chaves, dados do usuário e mais!</string>
119 <string name="share_save_file">Partilha ficheiro duardado</string> 125 <string name="share_save_file">Compartilhar arquivo de dados salvos</string>
120 <string name="export_save_failed">Erro ao exportar dados guardados</string> 126 <string name="export_save_failed">Erro ao exportar arquivo de dados salvos</string>
127 <string name="game_folders">Pastas de jogos</string>
128 <string name="deep_scan">Varredura profunda</string>
129 <string name="add_game_folder">Adicionar pasta de jogo</string>
130 <string name="folder_already_added">Esta pasta já foi adicionada!</string>
131 <string name="game_folder_properties">Propriedades da pasta de jogo</string>
132 <plurals name="saves_import_failed">
133 <item quantity="one">Falha ao importar dado salvo de %d</item>
134 <item quantity="many">Falha ao importar dados salvos de %d</item>
135 <item quantity="other">Falha ao importar dados salvos de %d</item>
136 </plurals>
137 <plurals name="saves_import_success">
138 <item quantity="one">Dado salvo de %d importado com sucesso</item>
139 <item quantity="many">Dados salvos de %d importados com sucesso</item>
140 <item quantity="other">Dados salvos de %d importados com sucesso</item>
141 </plurals>
142 <string name="no_save_data_found">Dados salvos não encontrados</string>
143
144 <!-- Applet launcher strings -->
145 <string name="applets">Launcher de miniaplicativos</string>
146 <string name="applets_description">Inicia miniaplicativos do sistema usando o firmware instalado</string>
147 <string name="applets_error_firmware">Firmware não instalado</string>
148 <string name="applets_error_applet">Miniaplicativo não disponível</string>
149 <string name="applets_error_description"><![CDATA[Por favor verifique se o arquivo 1prod.keys1 e o 2firmware2 estão instalados e tente novamente.]]></string>
150 <string name="album_applet">Ãlbum</string>
151 <string name="album_applet_description">Visualize imagens armazenadas na pasta de capturas de telas do usuário com o visualizador de imagens do sistema</string>
152 <string name="mii_edit_applet">Editor de Mii</string>
153 <string name="mii_edit_applet_description">Visualize e edite os Miis com o editor do sistema</string>
154 <string name="cabinet_applet">Arquivo</string>
155 <string name="cabinet_applet_description">Edite e delete dados armazenados nos amiibos</string>
156 <string name="cabinet_launcher">Inicializador do Arquivo</string>
157 <string name="cabinet_nickname_and_owner">Apelido e configurações do proprietário</string>
158 <string name="cabinet_game_data_eraser">Apagar dados de jogo</string>
159 <string name="cabinet_restorer">Restaurar</string>
160 <string name="cabinet_formatter">Formatar</string>
121 161
122 <!-- About screen strings --> 162 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia não é real</string> 163 <string name="gaia_is_not_real">Gaia não é real</string>
124 <string name="copied_to_clipboard">Copiado para a área de transferência</string> 164 <string name="copied_to_clipboard">Copiado para a área de transferência</string>
125 <string name="about_app_description">Um emulador Switch de código aberto</string> 165 <string name="about_app_description">Um emulador de Switch de código aberto</string>
126 <string name="contributors">Contribuidores</string> 166 <string name="contributors">Colaboradores</string>
127 <string name="contributors_description">Feito com \u2764 da equipa do Yuzu</string> 167 <string name="contributors_description">Feito com \u2764 da equipe do Yuzu</string>
128 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> 168 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
129 <string name="licenses_description">Projetos que tornam o yuzu para Android possível</string> 169 <string name="licenses_description">Projetos que tornam o yuzu para Android possível</string>
130 <string name="build">Versão</string> 170 <string name="build">Versão</string>
131 <string name="user_data">Dado de utilizados</string> 171 <string name="user_data">Dados do usuário</string>
132 <string name="user_data_description">Importar/exportar todos dados da aplicação data.\n\n Ao importar dados do utilizados, todos os dados existentes do utilizados serão excluídos!</string> 172 <string name="user_data_description">Importar/exportar todos os dados do aplicativo.\n\n Ao importar dados de usuário, todos os dados existentes do usuário serão excluídos!</string>
133 <string name="exporting_user_data">A exportar dados de utilizados...</string> 173 <string name="exporting_user_data">Exportando dados do usuário...</string>
134 <string name="importing_user_data">A importar dados de utilizador...</string> 174 <string name="importing_user_data">Importando dados do usuário...</string>
135 <string name="import_user_data">Importar dados de utilizados...</string> 175 <string name="import_user_data">Importar dados do usuário</string>
136 <string name="invalid_yuzu_backup">Backup yuzu inválido</string> 176 <string name="invalid_yuzu_backup">Backup do yuzu inválido</string>
137 <string name="user_data_export_success">Dados de utilizados exportados com sucesso</string> 177 <string name="user_data_export_success">Dados de usuário exportados com sucesso</string>
138 <string name="user_data_import_success">Dados de utilizador importado com sucesso</string> 178 <string name="user_data_import_success">Dados de usuário importados com sucesso</string>
139 <string name="user_data_export_cancelled">Exportação cancelada</string> 179 <string name="user_data_export_cancelled">Exportação cancelada</string>
140 <string name="user_data_import_failed_description">Verifiqua se as pastas de dados do utilizados estão na raiz da pasta zip e contêm um arquivo de configuração em config/config.ini e tenta novamente.</string> 180 <string name="user_data_import_failed_description">Verifiqua se as pastas de dados do usuário estão na raiz da pasta zip e contêm um arquivo de configuração em config/config.ini e tente novamente.</string>
141 <string name="support_link">https://discord.gg/u77vRWY</string> 181 <string name="support_link">https://discord.gg/u77vRWY</string>
142 <string name="website_link">https://yuzu-emu.org/</string> 182 <string name="website_link">https://yuzu-emu.org/</string>
143 <string name="github_link">https://github.com/yuzu-emu</string> 183 <string name="github_link">https://github.com/yuzu-emu</string>
144 184
145 <!-- Early access upgrade strings --> 185 <!-- Early access upgrade strings -->
146 <string name="early_access">Acesso antecipado</string> 186 <string name="early_access">Acesso Antecipado</string>
147 <string name="get_early_access">Obtém Acesso Antecipado</string> 187 <string name="get_early_access">Obtenha o Acesso Antecipado</string>
148 <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string> 188 <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
149 <string name="get_early_access_description">Recursos de ponta, acesso antecipado a atualizações e muito mais</string> 189 <string name="get_early_access_description">Recursos de ponta, acesso antecipado a atualizações e muito mais</string>
150 <string name="early_access_benefits">Benefícios do Acesso Antecipado</string> 190 <string name="early_access_benefits">Benefícios do Acesso Antecipado</string>
@@ -154,18 +194,19 @@
154 <string name="prioritized_support">Suporte prioritário</string> 194 <string name="prioritized_support">Suporte prioritário</string>
155 <string name="helping_game_preservation">Ajuda na preservação dos jogos</string> 195 <string name="helping_game_preservation">Ajuda na preservação dos jogos</string>
156 <string name="our_eternal_gratitude">A nossa eterna gratidão</string> 196 <string name="our_eternal_gratitude">A nossa eterna gratidão</string>
157 <string name="are_you_interested">Estás interessado?</string> 197 <string name="are_you_interested">Tem interesse?</string>
158 198
159 <!-- General settings strings --> 199 <!-- General settings strings -->
160 <string name="frame_limit_enable">Limite de velocidade</string> 200 <string name="frame_limit_enable">Limite de velocidade</string>
161 <string name="frame_limit_enable_description">Limita a velocidade da emulação a uma porcentagem específica da velocidade normal.</string> 201 <string name="frame_limit_enable_description">Limita a velocidade da emulação a uma porcentagem específica da velocidade normal.</string>
162 <string name="frame_limit_slider">Percentagem do limite de velocidade</string> 202 <string name="frame_limit_slider">Porcentagem do limite de velocidade</string>
163 <string name="frame_limit_slider_description">Especifica a porcentagem para limitar a velocidade de emulação. 100% é o normal. Valores mais altos ou mais baixos irão aumentar ou diminuir o limite de velocidade.</string> 203 <string name="frame_limit_slider_description">Especifica a porcentagem para limitar a velocidade de emulação. 100% é o normal. Valores mais altos ou mais baixos irão aumentar ou diminuir o limite de velocidade.</string>
164 <string name="cpu_accuracy">Precisão do CPU</string> 204 <string name="cpu_backend">Backend da CPU</string>
205 <string name="cpu_accuracy">Precisão da CPU</string>
165 <string name="value_with_units">%1$s%2$s</string> 206 <string name="value_with_units">%1$s%2$s</string>
166 207
167 <!-- System settings strings --> 208 <!-- System settings strings -->
168 <string name="use_docked_mode">Modo Ancorado</string> 209 <string name="use_docked_mode">Modo TV</string>
169 <string name="use_docked_mode_description">Aumenta a resolução, diminuindo o desempenho. O Modo Portátil é utilizado quando estiver desabilitado, diminuindo a resolução e melhorando o desempenho.</string> 210 <string name="use_docked_mode_description">Aumenta a resolução, diminuindo o desempenho. O Modo Portátil é utilizado quando estiver desabilitado, diminuindo a resolução e melhorando o desempenho.</string>
170 <string name="emulated_region">Região da emulação</string> 211 <string name="emulated_region">Região da emulação</string>
171 <string name="emulated_language">Idioma da emulação</string> 212 <string name="emulated_language">Idioma da emulação</string>
@@ -177,20 +218,22 @@
177 218
178 <!-- Graphics settings strings --> 219 <!-- Graphics settings strings -->
179 <string name="renderer_accuracy">Nível de precisão</string> 220 <string name="renderer_accuracy">Nível de precisão</string>
180 <string name="renderer_resolution">Resolução (Portátil/Ancorado)</string> 221 <string name="renderer_resolution">Resolução (Portátil/Modo TV)</string>
181 <string name="renderer_vsync">Modo VSync</string> 222 <string name="renderer_vsync">Modo VSync</string>
182 <string name="renderer_screen_layout">Oriantação</string> 223 <string name="renderer_screen_layout">Oriantação</string>
183 <string name="renderer_aspect_ratio">Proporção da tela</string> 224 <string name="renderer_aspect_ratio">Proporção da tela</string>
184 <string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string> 225 <string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
185 <string name="renderer_anti_aliasing">Método de Anti-Serrilhado</string> 226 <string name="renderer_anti_aliasing">Método de Anti-Serrilhado</string>
186 <string name="renderer_force_max_clock">Força velocidade máxima (Adreno only)</string> 227 <string name="renderer_force_max_clock">Forçar velocidade máxima (somente Adreno)</string>
187 <string name="renderer_force_max_clock_description">Força o GPU a correr à velocidade máxima (restrições térmicas serão aplicadas)</string> 228 <string name="renderer_force_max_clock_description">Força o GPU a rodar na velocidade máxima (restrições térmicas serão aplicadas)</string>
188 <string name="renderer_asynchronous_shaders">Usa shaders assíncronos </string> 229 <string name="renderer_asynchronous_shaders">Usar shaders assíncronos </string>
189 <string name="renderer_asynchronous_shaders_description">Compila os shaders de forma assíncrona, reduzindo travamentos, mas pode apresentar problemas.</string> 230 <string name="renderer_asynchronous_shaders_description">Compila os shaders de forma assíncrona, reduzindo travamentos, mas pode apresentar problemas.</string>
190 <string name="renderer_reactive_flushing">Usar flushing reativo</string> 231 <string name="renderer_reactive_flushing">Usar flushing reativo</string>
191 <string name="renderer_reactive_flushing_description">Melhora a precisão da renderização em alguns jogos ao custo de desempenho.</string> 232 <string name="renderer_reactive_flushing_description">Melhora a precisão da renderização em alguns jogos ao custo de desempenho.</string>
192 <string name="use_disk_shader_cache">Cache de shaders em disco</string> 233 <string name="use_disk_shader_cache">Cache de shaders em disco</string>
193 <string name="use_disk_shader_cache_description">Reduz travamentos ao armazenar e carregar localmente os shaders.</string> 234 <string name="use_disk_shader_cache_description">Reduz travamentos ao armazenar e carregar localmente os shaders.</string>
235 <string name="anisotropic_filtering">Filtragem anisotrópica</string>
236 <string name="anisotropic_filtering_description">Melhora a qualidade das texturas quando visualizadas de ângulos oblíquos</string>
194 237
195 <!-- Debug settings strings --> 238 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 239 <string name="cpu">CPU</string>
@@ -198,28 +241,29 @@
198 <string name="cpu_debug_mode_description">Coloca a CPU em um modo de depuração lento.</string> 241 <string name="cpu_debug_mode_description">Coloca a CPU em um modo de depuração lento.</string>
199 <string name="gpu">GPU</string> 242 <string name="gpu">GPU</string>
200 <string name="renderer_api">API</string> 243 <string name="renderer_api">API</string>
201 <string name="renderer_debug">Ativar depuração de gráficos</string> 244 <string name="renderer_debug">Depuração de gráficos</string>
202 <string name="renderer_debug_description">Quando selecionado, a API gráfica entra num modo de depuração mais lento.</string> 245 <string name="renderer_debug_description">Define a API gráfica para um modo de depuração mais lento.</string>
203 <string name="fastmem">Fastmem</string> 246 <string name="fastmem">Fastmem</string>
204 247
205 <!-- Audio settings strings --> 248 <!-- Audio settings strings -->
206 <string name="audio_output_engine">Motor de saída</string> 249 <string name="audio_output_engine">Engine de reprodução</string>
207 <string name="audio_volume">Volume</string> 250 <string name="audio_volume">Volume</string>
208 <string name="audio_volume_description">Especifica o volume de saída.</string> 251 <string name="audio_volume_description">Especifica o volume de reprodução.</string>
209 252
210 <!-- Miscellaneous --> 253 <!-- Miscellaneous -->
211 <string name="slider_default">Padrão</string> 254 <string name="slider_default">Padrão</string>
212 <string name="ini_saved">Definições guardadas</string> 255 <string name="ini_saved">Configurações salvas</string>
213 <string name="gameid_saved">Definições guardadas para %1$s</string> 256 <string name="gameid_saved">Configurações salvas para %1$s</string>
214 <string name="error_saving">Erro ao guardar %1$s.ini: %2$s</string> 257 <string name="error_saving">Erro ao salvar %1$s.ini: %2$s</string>
215 <string name="unimplemented_menu">Menu não implementado</string> 258 <string name="unimplemented_menu">Menu não implementado</string>
216 <string name="loading">A carregar...</string> 259 <string name="loading">Carregando...</string>
217 <string name="shutting_down">A desligar...</string> 260 <string name="shutting_down">Encerrando...</string>
218 <string name="reset_setting_confirmation">Queres reverter esta definição para os valores padrão?</string> 261 <string name="reset_setting_confirmation">Deseja reverter esta configuração para os valores padrões?</string>
219 <string name="reset_to_default">Reverter para padrão</string> 262 <string name="reset_to_default">Reverter para o padrão</string>
220 <string name="reset_all_settings">Redefinir todas as definições?</string> 263 <string name="reset_to_default_description">Redefine todas as configurações avançadas</string>
264 <string name="reset_all_settings">Redefinir todas as configurações?</string>
221 <string name="reset_all_settings_description">Todas as configurações avançadas retornarão ao padrão. Isto não pode ser desfeito.</string> 265 <string name="reset_all_settings_description">Todas as configurações avançadas retornarão ao padrão. Isto não pode ser desfeito.</string>
222 <string name="settings_reset">Redefinir definições</string> 266 <string name="settings_reset">Configurações redefinidas</string>
223 <string name="close">Fechar</string> 267 <string name="close">Fechar</string>
224 <string name="learn_more">Saiba mais</string> 268 <string name="learn_more">Saiba mais</string>
225 <string name="auto">Automático</string> 269 <string name="auto">Automático</string>
@@ -227,44 +271,95 @@
227 <string name="string_null">Nenhum (desativado)</string> 271 <string name="string_null">Nenhum (desativado)</string>
228 <string name="string_import">Importar</string> 272 <string name="string_import">Importar</string>
229 <string name="export">Exportar</string> 273 <string name="export">Exportar</string>
230 <string name="export_failed">Exportação falhada</string> 274 <string name="export_failed">Falha ao exportar</string>
231 <string name="import_failed">IMportação falhada</string> 275 <string name="import_failed">Falha ao importar</string>
232 <string name="cancelling">A cancelar</string> 276 <string name="cancelling">Cancelando</string>
233 277 <string name="install">Instalar</string>
278 <string name="delete">Deletar</string>
279 <string name="edit">Editar</string>
280 <string name="export_success">Exportado com sucesso</string>
281 <string name="start">Start</string>
282 <string name="clear">Limpar</string>
283 <string name="global">Global</string>
284 <string name="custom">Personalizado</string>
285 <string name="notice">Aviso</string>
286 <string name="import_complete">Importação concluída</string>
234 <!-- GPU driver installation --> 287 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">Seleciona a driver para o GPU</string> 288 <string name="select_gpu_driver">Selecione o driver para a GPU</string>
236 <string name="select_gpu_driver_title">Queres substituir o driver do GPU atual? </string> 289 <string name="select_gpu_driver_title">Gostaria de substituir o driver atual da GPU? </string>
237 <string name="select_gpu_driver_install">Instalar</string> 290 <string name="select_gpu_driver_install">Instalar</string>
238 <string name="select_gpu_driver_default">Padrão</string> 291 <string name="select_gpu_driver_default">Padrão</string>
239 <string name="select_gpu_driver_use_default">Usar o driver padrão do GPU</string> 292 <string name="select_gpu_driver_use_default">Usar o driver padrão da GPU</string>
240 <string name="select_gpu_driver_error">Driver selecionado inválido, a usar o padrão do sistema!</string> 293 <string name="select_gpu_driver_error">Driver selecionado inválido</string>
241 <string name="system_gpu_driver">Driver do GPU padrão</string> 294 <string name="driver_already_installed">Driver já instalado</string>
242 <string name="installing_driver">A instalar o Driver...</string> 295 <string name="system_gpu_driver">Driver padrão da GPU</string>
296 <string name="installing_driver">Instalando driver...</string>
243 297
244 <!-- Preferences Screen --> 298 <!-- Preferences Screen -->
245 <string name="preferences_settings">Configurações</string> 299 <string name="preferences_settings">Configurações</string>
246 <string name="preferences_general">Geral</string> 300 <string name="preferences_general">Geral</string>
247 <string name="preferences_system">Sistema</string> 301 <string name="preferences_system">Sistema</string>
302 <string name="preferences_system_description">Modo TV, região, idioma</string>
248 <string name="preferences_graphics">Gráficos</string> 303 <string name="preferences_graphics">Gráficos</string>
304 <string name="preferences_graphics_description">Nível de precisão, resolução, cache de shader</string>
249 <string name="preferences_audio">Ãudio</string> 305 <string name="preferences_audio">Ãudio</string>
250 <string name="preferences_theme">Cor e tema.</string> 306 <string name="preferences_audio_description">Engine de reprodução, volume</string>
307 <string name="preferences_theme">Tema e cor</string>
251 <string name="preferences_debug">Depuração</string> 308 <string name="preferences_debug">Depuração</string>
252 309 <string name="preferences_debug_description">Depuração de CPU/GPU, API gráfica, fastmem</string>
310
311 <!-- Game properties -->
312 <string name="info">Informações</string>
313 <string name="info_description">ID do Programa, desenvolvedora, versão</string>
314 <string name="per_game_settings">Configurações por jogo</string>
315 <string name="per_game_settings_description">Edite configurações específicas para este jogo</string>
316 <string name="launch_options">Configurações de inicialização</string>
317 <string name="path">Caminho</string>
318 <string name="program_id">ID do Programa</string>
319 <string name="developer">Desenvolvedora</string>
320 <string name="version">Versão</string>
321 <string name="copy_details">Copiar detalhes</string>
322 <string name="add_ons">Adicionais</string>
323 <string name="add_ons_description">Gerencie mods, atualizações e DLC</string>
324 <string name="clear_shader_cache">Excluir cache de shaders</string>
325 <string name="clear_shader_cache_description">Remove todos os shaders compilados durante a execução do jogo</string>
326 <string name="clear_shader_cache_warning_description">Você terá mais travamentos enquanto o cache de shaders for recompilado</string>
327 <string name="cleared_shaders_successfully">Shaders excluídos com sucesso</string>
328 <string name="addons_game">Adicionais: %1$s</string>
329 <string name="save_data">Dados salvos</string>
330 <string name="save_data_description">Gerencie dados salvos específicos deste jogo</string>
331 <string name="delete_save_data">Deletar dados salvos</string>
332 <string name="delete_save_data_description">Remove todos os dados salvos específicos deste jogo</string>
333 <string name="delete_save_data_warning_description">Isso removerá permanentemente todos os dados salvos do jogo. Tem certeza de que quer continuar?</string>
334 <string name="save_data_deleted_successfully">Dados salvos deletados com sucesso </string>
335 <string name="select_content_type">Tipo de conteúdo</string>
336 <string name="updates_and_dlc">Atualizações e DLC</string>
337 <string name="mods_and_cheats">Mods e cheats</string>
338 <string name="addon_notice">Aviso importante sobre os adicionais</string>
339 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
340 <string name="addon_notice_description">Para instalar mods e cheats, você deve selecionar uma pasta que contenha um diretório cheats/, romfs/ ou exefs. Não podemos verificar se eles são compatíveis com seu jogo, então tenha cuidado!</string>
341 <string name="invalid_directory">Diretório inválido </string>
342 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
343 <string name="invalid_directory_description">Por favor verifique se o diretório selecionado contém uma pasta cheats/, romfs/ ou exefs/ e tente novamente.</string>
344 <string name="addon_installed_successfully">Adicional instalado com sucesso</string>
345 <string name="verifying_content">Verificando conteúdo...</string>
346 <string name="content_install_notice">Aviso sobre conteúdo adicional</string>
347 <string name="content_install_notice_description">O conteúdo que você selecionou não corresponde a este jogo.\nInstalar mesmo assim?</string>
253 <!-- ROM loading errors --> 348 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">A tua ROM está encriptada</string> 349 <string name="loader_error_encrypted">Sua ROM está encriptada</string>
255 <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga os guias para despejar novamente o seu <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">cartucho de jogo</a> or <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">títulos instalados</a>.]]></string> 350 <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga os guias para extrair novamente o seu <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">cartucho de jogo</a> ou <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">títulos instalados</a>.]]></string>
256 <string name="loader_error_encrypted_keys_description"><![CDATA[Por favor confirma que o teu ficheiro <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> está instalado para que os jogos possam ser desencriptados.]]></string> 351 <string name="loader_error_encrypted_keys_description"><![CDATA[Por favor verifique se o seu arquivo <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> está instalado para que os jogos possam ser decriptados.]]></string>
257 <string name="loader_error_video_core">Ocorreu um erro ao iniciar o núcleo de vídeo.</string> 352 <string name="loader_error_video_core">Ocorreu um erro ao iniciar o núcleo de vídeo.</string>
258 <string name="loader_error_video_core_description">Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver GPU pode resolver este problema.</string> 353 <string name="loader_error_video_core_description">Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver de GPU pode resolver este problema.</string>
259 <string name="loader_error_invalid_format">Impossível carregar a tua ROM</string> 354 <string name="loader_error_invalid_format">Impossível carregar a ROM</string>
260 <string name="loader_error_file_not_found">O ficheiro da ROM não existe</string> 355 <string name="loader_error_file_not_found">O arquivo ROM não existe</string>
261 356
262 <!-- Emulation Menu --> 357 <!-- Emulation Menu -->
263 <string name="emulation_exit">Parar emulação</string> 358 <string name="emulation_exit">Sair da emulação</string>
264 <string name="emulation_done">Feito</string> 359 <string name="emulation_done">Feito</string>
265 <string name="emulation_fps_counter">Contador de FPS</string> 360 <string name="emulation_fps_counter">Contador de FPS</string>
266 <string name="emulation_toggle_controls">Alterar controles</string> 361 <string name="emulation_toggle_controls">Marcar/Desmarcar botões</string>
267 <string name="emulation_rel_stick_center">Centro Relativo de Analógico</string> 362 <string name="emulation_rel_stick_center">Centro Relativo do Analógico</string>
268 <string name="emulation_dpad_slide">Deslizamento dos Botões Direcionais</string> 363 <string name="emulation_dpad_slide">Deslizamento dos Botões Direcionais</string>
269 <string name="emulation_haptics">Vibração ao tocar</string> 364 <string name="emulation_haptics">Vibração ao tocar</string>
270 <string name="emulation_show_overlay">Mostrar overlay</string> 365 <string name="emulation_show_overlay">Mostrar overlay</string>
@@ -272,28 +367,29 @@
272 <string name="emulation_control_adjust">Ajustar overlay</string> 367 <string name="emulation_control_adjust">Ajustar overlay</string>
273 <string name="emulation_control_scale">Escala</string> 368 <string name="emulation_control_scale">Escala</string>
274 <string name="emulation_control_opacity">Opacidade</string> 369 <string name="emulation_control_opacity">Opacidade</string>
275 <string name="emulation_touch_overlay_reset">Restaurar overlay padrão</string> 370 <string name="emulation_touch_overlay_reset">Resetar overlay</string>
276 <string name="emulation_touch_overlay_edit">Editar overlay</string> 371 <string name="emulation_touch_overlay_edit">Editar overlay</string>
277 <string name="emulation_pause">Pausar emulação</string> 372 <string name="emulation_pause">Pausar emulação</string>
278 <string name="emulation_unpause">Retomar emulação</string> 373 <string name="emulation_unpause">Retomar a emulação</string>
279 <string name="emulation_input_overlay">Opções de overlay</string> 374 <string name="emulation_input_overlay">Opções de overlay</string>
375 <string name="touchscreen">Tela de toque</string>
280 376
281 <string name="load_settings">Carregando configurações...</string> 377 <string name="load_settings">Carregando configurações...</string>
282 378
283 <!-- Software keyboard --> 379 <!-- Software keyboard -->
284 <string name="software_keyboard">Teclado de software</string> 380 <string name="software_keyboard">Teclado do software</string>
285 381
286 <!-- Errors and warnings --> 382 <!-- Errors and warnings -->
287 <string name="abort_button">Abortar</string> 383 <string name="abort_button">Abortar</string>
288 <string name="continue_button">Continuar</string> 384 <string name="continue_button">Continuar</string>
289 <string name="system_archive_not_found">Arquivo do sistema não encontrado</string> 385 <string name="system_archive_not_found">Arquivo do Sistema Não Encontrado</string>
290 <string name="system_archive_not_found_message">%s está em falta. Por favor apaga os teus ficheiros de sistema.\nContinuar a emulação pode causar erros.</string> 386 <string name="system_archive_not_found_message">%s está faltando. Por favor extraia seus arquivos de sistema.\nContinuar a emulação pode causar travamentos e bugs.</string>
291 <string name="system_archive_general">Um arquivo do sistema</string> 387 <string name="system_archive_general">Um arquivo do sistema</string>
292 <string name="save_load_error">Erro Guardar/Carregar</string> 388 <string name="save_load_error">Erro de Salvamento/Carregamento</string>
293 <string name="fatal_error">Erro fatal</string> 389 <string name="fatal_error">Erro fatal</string>
294 <string name="fatal_error_message">Ocorreu um erro fatal. Verifica o teu registro para detalhes. \nContinuar a emulação pode causar erros.</string> 390 <string name="fatal_error_message">Ocorreu um erro fatal. Verifique o arquivo de registro para detalhes.\nContinuar a emulação pode causar travamentos e bugs.</string>
295 <string name="performance_warning">Desligar esta configuração irá reduzir a performance da emulação significantemente! Para a melhor experiência é recomendado que deixes esta configuração ativada.</string> 391 <string name="performance_warning">Desligar esta configuração irá reduzir a performance da emulação significantemente! Para a melhor experiência é recomendado deixar esta configuração ativada.</string>
296 <string name="device_memory_inadequate">RAM do dispositivo: %1$s\nRecommended: %2$s</string> 392 <string name="device_memory_inadequate">RAM do dispositivo: %1$s\nRecomendada: %2$s</string>
297 <string name="memory_formatted">%1$s %2$s</string> 393 <string name="memory_formatted">%1$s %2$s</string>
298 <string name="no_game_present">Nenhum jogo inicializável presente!</string> 394 <string name="no_game_present">Nenhum jogo inicializável presente!</string>
299 395
@@ -308,6 +404,7 @@
308 404
309 <!-- Memory Sizes --> 405 <!-- Memory Sizes -->
310 <string name="memory_byte">Byte</string> 406 <string name="memory_byte">Byte</string>
407 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">KB</string> 408 <string name="memory_kilobyte">KB</string>
312 <string name="memory_megabyte">MB</string> 409 <string name="memory_megabyte">MB</string>
313 <string name="memory_gigabyte">GB</string> 410 <string name="memory_gigabyte">GB</string>
@@ -316,19 +413,19 @@
316 <string name="memory_exabyte">EB</string> 413 <string name="memory_exabyte">EB</string>
317 414
318 <!-- Renderer APIs --> 415 <!-- Renderer APIs -->
319 <string name="renderer_vulkan">Vulcano</string> 416 <string name="renderer_vulkan">Vulkan</string>
320 <string name="renderer_none">Nenhum</string> 417 <string name="renderer_none">Nenhum</string>
321 418
322 <!-- Renderer Accuracy --> 419 <!-- Renderer Accuracy -->
323 <string name="renderer_accuracy_normal">Normal</string> 420 <string name="renderer_accuracy_normal">Normal</string>
324 <string name="renderer_accuracy_high">Alto</string> 421 <string name="renderer_accuracy_high">Alto</string>
325 <string name="renderer_accuracy_extreme">Estremo (Lento)</string> 422 <string name="renderer_accuracy_extreme">Extremo (Lento)</string>
326 423
327 <!-- Resolutions --> 424 <!-- Resolutions -->
328 <string name="resolution_half">0.5X (360p/540p)</string> 425 <string name="resolution_half">0.5X (360p/540p)</string>
329 <string name="resolution_three_quarter">0.75X (540p/810p)</string> 426 <string name="resolution_three_quarter">0.75X (540p/810p)</string>
330 <string name="resolution_one">1X (720p/1080p)</string> 427 <string name="resolution_one">1X (720p/1080p)</string>
331 <string name="resolution_two">2X (1440p/2160p) (Slow)</string> 428 <string name="resolution_two">2X (1440p/2160p) (Lento)</string>
332 <string name="resolution_three">3X (2160p/3240p) (Lento)</string> 429 <string name="resolution_three">3X (2160p/3240p) (Lento)</string>
333 <string name="resolution_four">4X (2880p/4320p) (Lento)</string> 430 <string name="resolution_four">4X (2880p/4320p) (Lento)</string>
334 431
@@ -352,9 +449,13 @@
352 <string name="anti_aliasing_smaa">SMAA</string> 449 <string name="anti_aliasing_smaa">SMAA</string>
353 450
354 <!-- Screen Layouts --> 451 <!-- Screen Layouts -->
355 <string name="screen_layout_landscape">Landscape</string> 452 <string name="screen_layout_auto">Automática</string>
356 <string name="screen_layout_portrait">Portrait</string> 453 <string name="screen_layout_sensor_landscape">Paisagem pelo sensor</string>
357 <string name="screen_layout_auto">Automático</string> 454 <string name="screen_layout_landscape">Paisagem</string>
455 <string name="screen_layout_reverse_landscape">Paisagem invertida</string>
456 <string name="screen_layout_sensor_portrait">Retrato pelo sensor</string>
457 <string name="screen_layout_portrait">Retrato</string>
458 <string name="screen_layout_reverse_portrait">Retrato invertido</string>
358 459
359 <!-- Aspect Ratios --> 460 <!-- Aspect Ratios -->
360 <string name="ratio_default">Padrão (16:9)</string> 461 <string name="ratio_default">Padrão (16:9)</string>
@@ -363,21 +464,25 @@
363 <string name="ratio_force_sixteen_ten">Forçar 16:10</string> 464 <string name="ratio_force_sixteen_ten">Forçar 16:10</string>
364 <string name="ratio_stretch">Esticar à janela</string> 465 <string name="ratio_stretch">Esticar à janela</string>
365 466
467 <!-- CPU Backend -->
468 <string name="cpu_backend_dynarmic">Dynarmic (Lento)</string>
469 <string name="cpu_backend_nce">Execução de código nativo (NCE)</string>
470
366 <!-- CPU Accuracy --> 471 <!-- CPU Accuracy -->
367 <string name="cpu_accuracy_accurate">Preciso</string> 472 <string name="cpu_accuracy_accurate">Preciso</string>
368 <string name="cpu_accuracy_unsafe">Não seguro</string> 473 <string name="cpu_accuracy_unsafe">Não seguro</string>
369 <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string> 474 <string name="cpu_accuracy_paranoid">Paranóico (Lento)</string>
370 475
371 <!-- Gamepad Buttons --> 476 <!-- Gamepad Buttons -->
372 <string name="gamepad_d_pad">Botões Direcionais</string> 477 <string name="gamepad_d_pad">Botões Direcionais</string>
373 <string name="gamepad_left_stick">Analógico esquerdo</string> 478 <string name="gamepad_left_stick">Analógico esquerdo</string>
374 <string name="gamepad_right_stick">Analógico direito</string> 479 <string name="gamepad_right_stick">Analógico direito</string>
375 <string name="gamepad_home">Botão Home</string> 480 <string name="gamepad_home">Botão Home</string>
376 <string name="gamepad_screenshot">Captura de ecrã</string> 481 <string name="gamepad_screenshot">Captura de tela</string>
377 482
378 <!-- Disk shader cache --> 483 <!-- Disk shader cache -->
379 <string name="preparing_shaders">A preparar shaders</string> 484 <string name="preparing_shaders">Preparando shaders</string>
380 <string name="building_shaders">A criar shaders</string> 485 <string name="building_shaders">Criando shaders</string>
381 486
382 <!-- Theme options --> 487 <!-- Theme options -->
383 <string name="change_app_theme">Mudar o tema do aplicativo</string> 488 <string name="change_app_theme">Mudar o tema do aplicativo</string>
@@ -391,19 +496,26 @@
391 <string name="theme_mode_dark">Escuro</string> 496 <string name="theme_mode_dark">Escuro</string>
392 497
393 <!-- Audio output engines --> 498 <!-- Audio output engines -->
499 <string name="oboe">oboe</string>
394 <string name="cubeb">cubeb</string> 500 <string name="cubeb">cubeb</string>
395 501
502 <!-- Anisotropic filtering options -->
503 <string name="multiplier_two">2x</string>
504 <string name="multiplier_four">4x</string>
505 <string name="multiplier_eight">8x</string>
506 <string name="multiplier_sixteen">16x</string>
507
396 <!-- Black backgrounds theme --> 508 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">Plano de fundo preto</string> 509 <string name="use_black_backgrounds">Plano de fundo preto</string>
398 <string name="use_black_backgrounds_description">Quando usar tema escuro, aplicar fundos escuros</string> 510 <string name="use_black_backgrounds_description">Quando usar o tema escuro, aplicar fundos pretos</string>
399 511
400 <!-- Picture-In-Picture --> 512 <!-- Picture-In-Picture -->
401 <string name="picture_in_picture">Picture in Picture</string> 513 <string name="picture_in_picture">Picture in Picture</string>
402 <string name="picture_in_picture_description">Minimizar a janela quando colocada em segundo plano</string> 514 <string name="picture_in_picture_description">Minimiza a janela quando colocada em segundo plano</string>
403 <string name="pause">Pausa</string> 515 <string name="pause">Pausar</string>
404 <string name="play">Correr</string> 516 <string name="play">Executar</string>
405 <string name="mute">Mudo</string> 517 <string name="mute">Mudo</string>
406 <string name="unmute">Unmute</string> 518 <string name="unmute">Tirar do Mudo</string>
407 519
408 <!-- Licenses screen strings --> 520 <!-- Licenses screen strings -->
409 <string name="licenses">Licenças</string> 521 <string name="licenses">Licenças</string>
diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml
index 6afea9b03..684a71616 100644
--- a/src/android/app/src/main/res/values-pt-rPT/strings.xml
+++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">Não foram encontrados jogos ou a pasta de Jogos ainda não foi definida. </string> 34 <string name="empty_gamelist">Não foram encontrados jogos ou a pasta de Jogos ainda não foi definida. </string>
35 <string name="search_and_filter_games">Procura e filtra jogos.</string> 35 <string name="search_and_filter_games">Procura e filtra jogos.</string>
36 <string name="select_games_folder">Seleciona a pasta de jogos.</string> 36 <string name="select_games_folder">Seleciona a pasta de jogos.</string>
37 <string name="manage_game_folders">Gerencie as pastas de jogos</string>
37 <string name="select_games_folder_description">Permite que o Yuzu preencha a lista de jogos</string> 38 <string name="select_games_folder_description">Permite que o Yuzu preencha a lista de jogos</string>
38 <string name="add_games_warning">Ignorar a seleção da pasta de jogos?</string> 39 <string name="add_games_warning">Ignorar a seleção da pasta de jogos?</string>
39 <string name="add_games_warning_description">Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada.</string> 40 <string name="add_games_warning_description">Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada.</string>
@@ -68,6 +69,7 @@
68 <string name="invalid_keys_error">Chaves de encriptação inválidas</string> 69 <string name="invalid_keys_error">Chaves de encriptação inválidas</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> 71 <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string>
72 <string name="gpu_driver_manager">Gerenciador de driver de GPU</string>
71 <string name="install_gpu_driver">Instala driver para GPU</string> 73 <string name="install_gpu_driver">Instala driver para GPU</string>
72 <string name="install_gpu_driver_description">Instala drivers alternativos para desempenho ou precisão potencialmente melhores</string> 74 <string name="install_gpu_driver_description">Instala drivers alternativos para desempenho ou precisão potencialmente melhores</string>
73 <string name="advanced_settings">Configurações avançadas</string> 75 <string name="advanced_settings">Configurações avançadas</string>
@@ -85,7 +87,11 @@
85 <string name="notification_no_directory_link_description">Localiza a pasta de utilizador manualmente com o painel lateral do gestor de ficheiros.</string> 87 <string name="notification_no_directory_link_description">Localiza a pasta de utilizador manualmente com o painel lateral do gestor de ficheiros.</string>
86 <string name="manage_save_data">Gerir dados guardados</string> 88 <string name="manage_save_data">Gerir dados guardados</string>
87 <string name="manage_save_data_description">Dados não encontrados. Por favor seleciona uma opção abaixo.</string> 89 <string name="manage_save_data_description">Dados não encontrados. Por favor seleciona uma opção abaixo.</string>
90 <string name="import_save_warning">Importar dados salvos</string>
91 <string name="import_save_warning_description">Isso irá sobrescrever seus dados salvos com o arquivo selecionado. Você tem certeza que quer continuar?</string>
88 <string name="import_export_saves_description">Importa ou exporta dados guardados</string> 92 <string name="import_export_saves_description">Importa ou exporta dados guardados</string>
93 <string name="save_files_importing">Importando dados salvos...</string>
94 <string name="save_files_exporting">Exportando arquivos de dados salvos...</string>
89 <string name="save_file_imported_success">Importado com sucesso</string> 95 <string name="save_file_imported_success">Importado com sucesso</string>
90 <string name="save_file_invalid_zip_structure">Estrutura de diretório de dados invalida</string> 96 <string name="save_file_invalid_zip_structure">Estrutura de diretório de dados invalida</string>
91 <string name="save_file_invalid_zip_structure_description">O nome da primeira sub pasta tem de ser a ID do jogo.</string> 97 <string name="save_file_invalid_zip_structure_description">O nome da primeira sub pasta tem de ser a ID do jogo.</string>
@@ -118,6 +124,40 @@
118 <string name="manage_yuzu_data_description">Importa/exporta firmware, chaves, dados do usuário e mais!</string> 124 <string name="manage_yuzu_data_description">Importa/exporta firmware, chaves, dados do usuário e mais!</string>
119 <string name="share_save_file">Partilha ficheiro duardado</string> 125 <string name="share_save_file">Partilha ficheiro duardado</string>
120 <string name="export_save_failed">Erro ao exportar dados guardados</string> 126 <string name="export_save_failed">Erro ao exportar dados guardados</string>
127 <string name="game_folders">Pastas de jogos</string>
128 <string name="deep_scan">Varredura profunda</string>
129 <string name="add_game_folder">Adicionar pasta de jogo</string>
130 <string name="folder_already_added">Esta pasta já foi adicionada!</string>
131 <string name="game_folder_properties">Propriedades da pasta de jogo</string>
132 <plurals name="saves_import_failed">
133 <item quantity="one">Falha ao importar dado salvo de %d</item>
134 <item quantity="many">Falha ao importar dados salvos de %d</item>
135 <item quantity="other">Falha ao importar dados salvos de %d</item>
136 </plurals>
137 <plurals name="saves_import_success">
138 <item quantity="one">Dado salvo de %d importado com sucesso</item>
139 <item quantity="many">Dados salvos de %d importados com sucesso</item>
140 <item quantity="other">Dados salvos de %d importados com sucesso</item>
141 </plurals>
142 <string name="no_save_data_found">Dados salvos não encontrados</string>
143
144 <!-- Applet launcher strings -->
145 <string name="applets">Launcher de miniaplicativos</string>
146 <string name="applets_description">Inicie miniaplicativos do sistema usando o firmware instalado</string>
147 <string name="applets_error_firmware">Firmware não instalado</string>
148 <string name="applets_error_applet">Miniaplicativo não disponível</string>
149 <string name="applets_error_description"><![CDATA[Por favor verifique se o arquivo 1prod.keys1 e o 2firmware2 estão instalados e tente novamente.]]></string>
150 <string name="album_applet">Ãlbum</string>
151 <string name="album_applet_description">Visualize imagens armazenadas na pasta de capturas de telas do usuário com o visualizador de imagens do sistema</string>
152 <string name="mii_edit_applet">Editor de Mii</string>
153 <string name="mii_edit_applet_description">Visualize e edite os Miis com o editor do sistema</string>
154 <string name="cabinet_applet">Arquivo</string>
155 <string name="cabinet_applet_description">Edite e delete dados armazenados nos amiibos</string>
156 <string name="cabinet_launcher">Inicializador do Arquivo</string>
157 <string name="cabinet_nickname_and_owner">Apelido e configurações do proprietário</string>
158 <string name="cabinet_game_data_eraser">Apagar dados de jogo</string>
159 <string name="cabinet_restorer">Restaurar</string>
160 <string name="cabinet_formatter">Formatar</string>
121 161
122 <!-- About screen strings --> 162 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia não é real</string> 163 <string name="gaia_is_not_real">Gaia não é real</string>
@@ -161,6 +201,7 @@
161 <string name="frame_limit_enable_description">Limita a velocidade da emulação a uma porcentagem específica da velocidade normal.</string> 201 <string name="frame_limit_enable_description">Limita a velocidade da emulação a uma porcentagem específica da velocidade normal.</string>
162 <string name="frame_limit_slider">Percentagem do limite de velocidade</string> 202 <string name="frame_limit_slider">Percentagem do limite de velocidade</string>
163 <string name="frame_limit_slider_description">Especifica a porcentagem para limitar a velocidade de emulação. 100% é o normal. Valores mais altos ou mais baixos irão aumentar ou diminuir o limite de velocidade.</string> 203 <string name="frame_limit_slider_description">Especifica a porcentagem para limitar a velocidade de emulação. 100% é o normal. Valores mais altos ou mais baixos irão aumentar ou diminuir o limite de velocidade.</string>
204 <string name="cpu_backend">Backend da CPU</string>
164 <string name="cpu_accuracy">Precisão do CPU</string> 205 <string name="cpu_accuracy">Precisão do CPU</string>
165 <string name="value_with_units">%1$s%2$s</string> 206 <string name="value_with_units">%1$s%2$s</string>
166 207
@@ -191,6 +232,8 @@
191 <string name="renderer_reactive_flushing_description">Melhora a precisão da renderização em alguns jogos ao custo de desempenho.</string> 232 <string name="renderer_reactive_flushing_description">Melhora a precisão da renderização em alguns jogos ao custo de desempenho.</string>
192 <string name="use_disk_shader_cache">Cache de shaders em disco</string> 233 <string name="use_disk_shader_cache">Cache de shaders em disco</string>
193 <string name="use_disk_shader_cache_description">Reduz travamentos ao armazenar e carregar localmente os shaders.</string> 234 <string name="use_disk_shader_cache_description">Reduz travamentos ao armazenar e carregar localmente os shaders.</string>
235 <string name="anisotropic_filtering">Filtragem anisotrópica</string>
236 <string name="anisotropic_filtering_description">Melhora a qualidade das texturas quando visualizadas de ângulos oblíquos</string>
194 237
195 <!-- Debug settings strings --> 238 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 239 <string name="cpu">CPU</string>
@@ -217,6 +260,7 @@
217 <string name="shutting_down">A desligar...</string> 260 <string name="shutting_down">A desligar...</string>
218 <string name="reset_setting_confirmation">Queres reverter esta definição para os valores padrão?</string> 261 <string name="reset_setting_confirmation">Queres reverter esta definição para os valores padrão?</string>
219 <string name="reset_to_default">Reverter para padrão</string> 262 <string name="reset_to_default">Reverter para padrão</string>
263 <string name="reset_to_default_description">Reverte todas as configurações avançadas</string>
220 <string name="reset_all_settings">Redefinir todas as configurações?</string> 264 <string name="reset_all_settings">Redefinir todas as configurações?</string>
221 <string name="reset_all_settings_description">Todas as configurações avançadas retornarão ao padrão. Isto não pode ser desfeito.</string> 265 <string name="reset_all_settings_description">Todas as configurações avançadas retornarão ao padrão. Isto não pode ser desfeito.</string>
222 <string name="settings_reset">Redefinir configurações </string> 266 <string name="settings_reset">Redefinir configurações </string>
@@ -230,14 +274,24 @@
230 <string name="export_failed">Exportação falhada</string> 274 <string name="export_failed">Exportação falhada</string>
231 <string name="import_failed">IMportação falhada</string> 275 <string name="import_failed">IMportação falhada</string>
232 <string name="cancelling">A cancelar</string> 276 <string name="cancelling">A cancelar</string>
233 277 <string name="install">Instalar</string>
278 <string name="delete">Apagar</string>
279 <string name="edit">Editar</string>
280 <string name="export_success">Exportado com sucesso</string>
281 <string name="start">Começar</string>
282 <string name="clear">Limpar</string>
283 <string name="global">Global</string>
284 <string name="custom">Personalizado</string>
285 <string name="notice">Aviso</string>
286 <string name="import_complete">Importação concluída</string>
234 <!-- GPU driver installation --> 287 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">Seleciona a driver para o GPU</string> 288 <string name="select_gpu_driver">Seleciona a driver para o GPU</string>
236 <string name="select_gpu_driver_title">Queres substituir o driver do GPU atual? </string> 289 <string name="select_gpu_driver_title">Queres substituir o driver do GPU atual? </string>
237 <string name="select_gpu_driver_install">Instalar</string> 290 <string name="select_gpu_driver_install">Instalar</string>
238 <string name="select_gpu_driver_default">Padrão</string> 291 <string name="select_gpu_driver_default">Padrão</string>
239 <string name="select_gpu_driver_use_default">Usar o driver padrão do GPU</string> 292 <string name="select_gpu_driver_use_default">Usar o driver padrão do GPU</string>
240 <string name="select_gpu_driver_error">Driver selecionado inválido, a usar o padrão do sistema!</string> 293 <string name="select_gpu_driver_error">Driver selecionado inválido</string>
294 <string name="driver_already_installed">Driver já instalado</string>
241 <string name="system_gpu_driver">Driver do GPU padrão</string> 295 <string name="system_gpu_driver">Driver do GPU padrão</string>
242 <string name="installing_driver">A instalar o Driver...</string> 296 <string name="installing_driver">A instalar o Driver...</string>
243 297
@@ -245,11 +299,52 @@
245 <string name="preferences_settings">Configurações</string> 299 <string name="preferences_settings">Configurações</string>
246 <string name="preferences_general">Geral</string> 300 <string name="preferences_general">Geral</string>
247 <string name="preferences_system">Sistema</string> 301 <string name="preferences_system">Sistema</string>
302 <string name="preferences_system_description">Modo ancorado, região, idioma</string>
248 <string name="preferences_graphics">Gráficos</string> 303 <string name="preferences_graphics">Gráficos</string>
304 <string name="preferences_graphics_description">Nível de precisão, resolução, cache de shader</string>
249 <string name="preferences_audio">Audio</string> 305 <string name="preferences_audio">Audio</string>
306 <string name="preferences_audio_description">Engine de reprodução, volume</string>
250 <string name="preferences_theme">Cor e tema.</string> 307 <string name="preferences_theme">Cor e tema.</string>
251 <string name="preferences_debug">Depurar</string> 308 <string name="preferences_debug">Depurar</string>
252 309 <string name="preferences_debug_description">Depuração de CPU/GPU, API gráfica, fastmem</string>
310
311 <!-- Game properties -->
312 <string name="info">Informação</string>
313 <string name="info_description">ID do programa, desenvolvedor, versão</string>
314 <string name="per_game_settings">Configurações por jogo</string>
315 <string name="per_game_settings_description">Editar configurações específicas para este jogo</string>
316 <string name="launch_options">Iniciar configuração</string>
317 <string name="path">Caminho</string>
318 <string name="program_id">ID do programa</string>
319 <string name="developer">Desenvolvedor</string>
320 <string name="version">Versão</string>
321 <string name="copy_details">Copiar detalhes</string>
322 <string name="add_ons">Add-ons</string>
323 <string name="add_ons_description">Gerencie mods, atualizações e DLC</string>
324 <string name="clear_shader_cache">Limpar cache de shaders</string>
325 <string name="clear_shader_cache_description">Remove todos os shaders compilados enquanto esse jogo era jogado</string>
326 <string name="clear_shader_cache_warning_description">Você terá mais travamentos enquanto o cache de shaders for recompilado</string>
327 <string name="cleared_shaders_successfully">Shaders excluídos com sucesso</string>
328 <string name="addons_game">Adicionais: %1$s</string>
329 <string name="save_data">Salvar dados</string>
330 <string name="save_data_description">Gerenciar dados salvos específicos deste jogo</string>
331 <string name="delete_save_data">Apagar dados salvos</string>
332 <string name="delete_save_data_description">Remover todos os dados salvos específicos deste jogo</string>
333 <string name="delete_save_data_warning_description">Isso removerá permanentemente todos os dados salvos do jogo. Tem certeza de que quer continuar?</string>
334 <string name="save_data_deleted_successfully">Dados salvos removidos com sucesso </string>
335 <string name="select_content_type">Tipo de conteúdo</string>
336 <string name="updates_and_dlc">Atualizações e DLC</string>
337 <string name="mods_and_cheats">Mods e trapaças</string>
338 <string name="addon_notice">Aviso importante sobre os adicionais</string>
339 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
340 <string name="addon_notice_description">Para instalar mods e cheats, você deve selecionar uma pasta que contenha um diretório cheats/, romfs/ ou exefs. Não podemos verificar se eles são compatíveis com seu jogo, então tenha cuidado!</string>
341 <string name="invalid_directory">Diretório inválido </string>
342 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
343 <string name="invalid_directory_description">Por favor verifique se o diretório selecionado contém uma pasta cheats/, romfs ou exefs e tente novamente.</string>
344 <string name="addon_installed_successfully">Adicional instalado com sucesso</string>
345 <string name="verifying_content">Verificando conteúdo</string>
346 <string name="content_install_notice">Aviso sobre conteúdo adicional</string>
347 <string name="content_install_notice_description">O conteúdo que você selecionou não corresponde a este jogo.\nInstalar mesmo assim?</string>
253 <!-- ROM loading errors --> 348 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">A tua ROM está encriptada</string> 349 <string name="loader_error_encrypted">A tua ROM está encriptada</string>
255 <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga os guias para despejar novamente o seu <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">cartucho de jogo</a> or <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">títulos instalados</a>.]]></string> 350 <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga os guias para despejar novamente o seu <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">cartucho de jogo</a> or <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">títulos instalados</a>.]]></string>
@@ -277,6 +372,7 @@
277 <string name="emulation_pause">Pausar emulação</string> 372 <string name="emulation_pause">Pausar emulação</string>
278 <string name="emulation_unpause">Despausar emulação</string> 373 <string name="emulation_unpause">Despausar emulação</string>
279 <string name="emulation_input_overlay">Opções de overlay</string> 374 <string name="emulation_input_overlay">Opções de overlay</string>
375 <string name="touchscreen">Ecrã Táctil</string>
280 376
281 <string name="load_settings">Carregando configurações...</string> 377 <string name="load_settings">Carregando configurações...</string>
282 378
@@ -308,6 +404,7 @@
308 404
309 <!-- Memory Sizes --> 405 <!-- Memory Sizes -->
310 <string name="memory_byte">Byte</string> 406 <string name="memory_byte">Byte</string>
407 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">KB</string> 408 <string name="memory_kilobyte">KB</string>
312 <string name="memory_megabyte">MB</string> 409 <string name="memory_megabyte">MB</string>
313 <string name="memory_gigabyte">GB</string> 410 <string name="memory_gigabyte">GB</string>
@@ -352,9 +449,13 @@
352 <string name="anti_aliasing_smaa">SMAA</string> 449 <string name="anti_aliasing_smaa">SMAA</string>
353 450
354 <!-- Screen Layouts --> 451 <!-- Screen Layouts -->
452 <string name="screen_layout_auto">Automático</string>
453 <string name="screen_layout_sensor_landscape">Paisagem pelo sensor</string>
355 <string name="screen_layout_landscape">Landscape</string> 454 <string name="screen_layout_landscape">Landscape</string>
455 <string name="screen_layout_reverse_landscape">Paisagem invertida</string>
456 <string name="screen_layout_sensor_portrait">Retrato pelo sensor</string>
356 <string name="screen_layout_portrait">Portrait</string> 457 <string name="screen_layout_portrait">Portrait</string>
357 <string name="screen_layout_auto">Automático</string> 458 <string name="screen_layout_reverse_portrait">Retrato invertido</string>
358 459
359 <!-- Aspect Ratios --> 460 <!-- Aspect Ratios -->
360 <string name="ratio_default">Padrão (16:9)</string> 461 <string name="ratio_default">Padrão (16:9)</string>
@@ -363,6 +464,10 @@
363 <string name="ratio_force_sixteen_ten">Forçar 16:10</string> 464 <string name="ratio_force_sixteen_ten">Forçar 16:10</string>
364 <string name="ratio_stretch">Esticar à janela</string> 465 <string name="ratio_stretch">Esticar à janela</string>
365 466
467 <!-- CPU Backend -->
468 <string name="cpu_backend_dynarmic">Dynarmic (Lento)</string>
469 <string name="cpu_backend_nce">Native code execution (NCE)</string>
470
366 <!-- CPU Accuracy --> 471 <!-- CPU Accuracy -->
367 <string name="cpu_accuracy_accurate">Preciso</string> 472 <string name="cpu_accuracy_accurate">Preciso</string>
368 <string name="cpu_accuracy_unsafe">Inseguro</string> 473 <string name="cpu_accuracy_unsafe">Inseguro</string>
@@ -391,8 +496,15 @@
391 <string name="theme_mode_dark">Escuro</string> 496 <string name="theme_mode_dark">Escuro</string>
392 497
393 <!-- Audio output engines --> 498 <!-- Audio output engines -->
499 <string name="oboe">oboe</string>
394 <string name="cubeb">cubeb</string> 500 <string name="cubeb">cubeb</string>
395 501
502 <!-- Anisotropic filtering options -->
503 <string name="multiplier_two">2x</string>
504 <string name="multiplier_four">4x</string>
505 <string name="multiplier_eight">8x</string>
506 <string name="multiplier_sixteen">16x</string>
507
396 <!-- Black backgrounds theme --> 508 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">Plano de fundo preto</string> 509 <string name="use_black_backgrounds">Plano de fundo preto</string>
398 <string name="use_black_backgrounds_description">Quando usar tema escuro, aplicar fundos escuros</string> 510 <string name="use_black_backgrounds_description">Quando usar tema escuro, aplicar fundos escuros</string>
diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml
index c614257a8..099b2c9eb 100644
--- a/src/android/app/src/main/res/values-ru/strings.xml
+++ b/src/android/app/src/main/res/values-ru/strings.xml
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">Ðе найдены файлы или еще не выбрана папка Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸.</string> 34 <string name="empty_gamelist">Ðе найдены файлы или еще не выбрана папка Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸.</string>
35 <string name="search_and_filter_games">ПоиÑк и Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¸Ð³Ñ€</string> 35 <string name="search_and_filter_games">ПоиÑк и Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¸Ð³Ñ€</string>
36 <string name="select_games_folder">Выберите папку Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸</string> 36 <string name="select_games_folder">Выберите папку Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸</string>
37 <string name="manage_game_folders">Управление папками</string>
37 <string name="select_games_folder_description">ПозволÑет yuzu заполнить ÑпиÑок игр</string> 38 <string name="select_games_folder_description">ПозволÑет yuzu заполнить ÑпиÑок игр</string>
38 <string name="add_games_warning">ПропуÑтить выбор папки Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸?</string> 39 <string name="add_games_warning">ПропуÑтить выбор папки Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸?</string>
39 <string name="add_games_warning_description">Игры не будут отображатьÑÑ Ð² ÑпиÑке Игры, еÑли папка не выбрана.</string> 40 <string name="add_games_warning_description">Игры не будут отображатьÑÑ Ð² ÑпиÑке Игры, еÑли папка не выбрана.</string>
@@ -68,6 +69,7 @@
68 <string name="invalid_keys_error">Ðеверные ключи шифрованиÑ</string> 69 <string name="invalid_keys_error">Ðеверные ключи шифрованиÑ</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">Выбранный файл неверен или поврежден. ПожалуйÑта, пере-дампите ваши ключи.</string> 71 <string name="install_keys_failure_description">Выбранный файл неверен или поврежден. ПожалуйÑта, пере-дампите ваши ключи.</string>
72 <string name="gpu_driver_manager">Менеджер драйверов ГП</string>
71 <string name="install_gpu_driver">УÑтановить драйвер ГП</string> 73 <string name="install_gpu_driver">УÑтановить драйвер ГП</string>
72 <string name="install_gpu_driver_description">УÑтановите альтернативные драйверы Ð´Ð»Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾ лучшей производительноÑти и/или точноÑти</string> 74 <string name="install_gpu_driver_description">УÑтановите альтернативные драйверы Ð´Ð»Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾ лучшей производительноÑти и/или точноÑти</string>
73 <string name="advanced_settings">РаÑширенные наÑтройки</string> 75 <string name="advanced_settings">РаÑширенные наÑтройки</string>
@@ -85,7 +87,11 @@
85 <string name="notification_no_directory_link_description">ПожалуйÑта, найдите папку Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ боковой панели файлового менеджера вручную.</string> 87 <string name="notification_no_directory_link_description">ПожалуйÑта, найдите папку Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ боковой панели файлового менеджера вручную.</string>
86 <string name="manage_save_data">Управление данными Ñохранений</string> 88 <string name="manage_save_data">Управление данными Ñохранений</string>
87 <string name="manage_save_data_description">Ðайдено данные Ñохранений. ПожалуйÑта, выберите вариант ниже.</string> 89 <string name="manage_save_data_description">Ðайдено данные Ñохранений. ПожалуйÑта, выберите вариант ниже.</string>
90 <string name="import_save_warning">Импортировать ÑохранениÑ</string>
91 <string name="import_save_warning_description">Это перезапишет вÑе ÑущеÑтвующие данные ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ файлом. Ð’Ñ‹ уверены, что хотите продолжить?</string>
88 <string name="import_export_saves_description">Импорт или ÑкÑпорт файлов ÑохранениÑ</string> 92 <string name="import_export_saves_description">Импорт или ÑкÑпорт файлов ÑохранениÑ</string>
93 <string name="save_files_importing">Импорт файлов ÑохранениÑ…</string>
94 <string name="save_files_exporting">ЭкÑпорт файлов ÑохранениÑ…</string>
89 <string name="save_file_imported_success">УÑпешно импортировано</string> 95 <string name="save_file_imported_success">УÑпешно импортировано</string>
90 <string name="save_file_invalid_zip_structure">ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñтруктура папки ÑохранениÑ</string> 96 <string name="save_file_invalid_zip_structure">ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñтруктура папки ÑохранениÑ</string>
91 <string name="save_file_invalid_zip_structure_description">Ðазвание первой вложенной папки должно быть идентификатором игры.</string> 97 <string name="save_file_invalid_zip_structure_description">Ðазвание первой вложенной папки должно быть идентификатором игры.</string>
@@ -119,6 +125,42 @@
119 <string name="manage_yuzu_data_description">Импортируйте/ÑкÑпортируйте прошивку, ключи, пользовательÑкие данные и многое другое!</string> 125 <string name="manage_yuzu_data_description">Импортируйте/ÑкÑпортируйте прошивку, ключи, пользовательÑкие данные и многое другое!</string>
120 <string name="share_save_file">ПоделитьÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ ÑохранениÑ</string> 126 <string name="share_save_file">ПоделитьÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ ÑохранениÑ</string>
121 <string name="export_save_failed">Ðе удалоÑÑŒ ÑкÑпортировать Ñохранение</string> 127 <string name="export_save_failed">Ðе удалоÑÑŒ ÑкÑпортировать Ñохранение</string>
128 <string name="game_folders">Папки Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸</string>
129 <string name="deep_scan">Глубокий анализ</string>
130 <string name="add_game_folder">Добавить папку Ñ Ð¸Ð³Ñ€Ð¾Ð¹</string>
131 <string name="folder_already_added">Эта папка уже была добавлена!</string>
132 <string name="game_folder_properties">СвойÑтва папки игры</string>
133 <plurals name="saves_import_failed">
134 <item quantity="one">Ðе удалоÑÑŒ импортировать %d Ñохранение</item>
135 <item quantity="few">Ðе удалоÑÑŒ импортировать %d ÑохранениÑ</item>
136 <item quantity="many">Ðе удалоÑÑŒ импортировать %d Ñохранений</item>
137 <item quantity="other">Ðе удалоÑÑŒ импортировать %d Ñохранений</item>
138 </plurals>
139 <plurals name="saves_import_success">
140 <item quantity="one">Импортировано %d Ñохранение</item>
141 <item quantity="few">Импортировано %d ÑохранениÑ</item>
142 <item quantity="many">Импортировано %d Ñохранений</item>
143 <item quantity="other">Импортировано %d Ñохранений</item>
144 </plurals>
145 <string name="no_save_data_found">Ðе найдены ÑохраненмиÑ</string>
146
147 <!-- Applet launcher strings -->
148 <string name="applets">ЗапуÑк апплета</string>
149 <string name="applets_description">ЗапуÑк ÑиÑтемных апплетов на уÑтановленной прошивке</string>
150 <string name="applets_error_firmware">Прошивка не уÑтановлена</string>
151 <string name="applets_error_applet">Ðпплет недоÑтупен</string>
152 <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>
153 <string name="album_applet">Ðльбом</string>
154 <string name="album_applet_description">ПроÑмотрите изображениÑ, Ñохраненные в папке Ñкриншотов пользователÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑиÑтемного проÑмотрщика фотографий.</string>
155 <string name="mii_edit_applet">Mii редактор</string>
156 <string name="mii_edit_applet_description">ПроÑмотр и редактирование Mii Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑиÑтемного редактора</string>
157 <string name="cabinet_applet">Шкаф</string>
158 <string name="cabinet_applet_description">Редактирование и удаление данных, хранÑщихÑÑ Ð½Ð° amiibo</string>
159 <string name="cabinet_launcher">ЗапуÑк шкафа</string>
160 <string name="cabinet_nickname_and_owner">Ðикнейм и наÑтройки владельца</string>
161 <string name="cabinet_game_data_eraser">Удаление игровых данных</string>
162 <string name="cabinet_restorer">ВоÑÑтановитель</string>
163 <string name="cabinet_formatter">Форматтер</string>
122 164
123 <!-- About screen strings --> 165 <!-- About screen strings -->
124 <string name="gaia_is_not_real">Gaia не ÑущеÑтвует</string> 166 <string name="gaia_is_not_real">Gaia не ÑущеÑтвует</string>
@@ -162,6 +204,7 @@
162 <string name="frame_limit_enable_description">Ограничивает ÑкороÑть ÑмулÑции указанным процентом от нормальной ÑкороÑти.</string> 204 <string name="frame_limit_enable_description">Ограничивает ÑкороÑть ÑмулÑции указанным процентом от нормальной ÑкороÑти.</string>
163 <string name="frame_limit_slider">Ограничение процента cкороÑти</string> 205 <string name="frame_limit_slider">Ограничение процента cкороÑти</string>
164 <string name="frame_limit_slider_description">Указывает процент Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти ÑмулÑции. 100% - Ñто Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ или меньше увеличивают или уменьшают ограничение ÑкороÑти.</string> 206 <string name="frame_limit_slider_description">Указывает процент Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти ÑмулÑции. 100% - Ñто Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ или меньше увеличивают или уменьшают ограничение ÑкороÑти.</string>
207 <string name="cpu_backend">БÑкÑнд ЦП</string>
165 <string name="cpu_accuracy">ТочноÑть ЦП</string> 208 <string name="cpu_accuracy">ТочноÑть ЦП</string>
166 <string name="value_with_units">%1$s%2$s</string> 209 <string name="value_with_units">%1$s%2$s</string>
167 210
@@ -192,6 +235,8 @@
192 <string name="renderer_reactive_flushing_description">Повышение точноÑти рендеринга в некоторых играх за Ñчет ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти.</string> 235 <string name="renderer_reactive_flushing_description">Повышение точноÑти рендеринга в некоторых играх за Ñчет ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти.</string>
193 <string name="use_disk_shader_cache">КÑш шейдеров на диÑке</string> 236 <string name="use_disk_shader_cache">КÑш шейдеров на диÑке</string>
194 <string name="use_disk_shader_cache_description">Уменьшение завиÑаний за Ñчет Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ загрузки Ñгенерированных шейдеров.</string> 237 <string name="use_disk_shader_cache_description">Уменьшение завиÑаний за Ñчет Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ загрузки Ñгенерированных шейдеров.</string>
238 <string name="anisotropic_filtering">ÐÐ½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ</string>
239 <string name="anisotropic_filtering_description">Улучшает качеÑтво текÑтур под углом</string>
195 240
196 <!-- Debug settings strings --> 241 <!-- Debug settings strings -->
197 <string name="cpu">ЦП</string> 242 <string name="cpu">ЦП</string>
@@ -203,6 +248,8 @@
203 <string name="renderer_debug_description">Переводит графичеÑкий API в режим медленной отладки.</string> 248 <string name="renderer_debug_description">Переводит графичеÑкий API в режим медленной отладки.</string>
204 <string name="fastmem">Fastmem</string> 249 <string name="fastmem">Fastmem</string>
205 250
251 <!-- Audio settings strings -->
252 <string name="audio_output_engine">Движок вывода</string>
206 <string name="audio_volume">ГромкоÑть</string> 253 <string name="audio_volume">ГромкоÑть</string>
207 <string name="audio_volume_description">Задает громкоÑть аудиовыхода.</string> 254 <string name="audio_volume_description">Задает громкоÑть аудиовыхода.</string>
208 255
@@ -216,6 +263,7 @@
216 <string name="shutting_down">Выключение…</string> 263 <string name="shutting_down">Выключение…</string>
217 <string name="reset_setting_confirmation">Хотите ли вы вернуть Ñтот параметр к значению по умолчанию?</string> 264 <string name="reset_setting_confirmation">Хотите ли вы вернуть Ñтот параметр к значению по умолчанию?</string>
218 <string name="reset_to_default">Ð¡Ð±Ñ€Ð¾Ñ Ðº наÑтройкам по умолчанию</string> 265 <string name="reset_to_default">Ð¡Ð±Ñ€Ð¾Ñ Ðº наÑтройкам по умолчанию</string>
266 <string name="reset_to_default_description">СброÑить вÑе раÑширенные наÑтройки</string>
219 <string name="reset_all_settings">СброÑить вÑе наÑтройки?</string> 267 <string name="reset_all_settings">СброÑить вÑе наÑтройки?</string>
220 <string name="reset_all_settings_description">Ð’Ñе дополнительные наÑтройки будут Ñброшены к наÑтройке по умолчанию. Это невозможно отменить.</string> 268 <string name="reset_all_settings_description">Ð’Ñе дополнительные наÑтройки будут Ñброшены к наÑтройке по умолчанию. Это невозможно отменить.</string>
221 <string name="settings_reset">ÐаÑтройки Ñброшены</string> 269 <string name="settings_reset">ÐаÑтройки Ñброшены</string>
@@ -229,14 +277,24 @@
229 <string name="export_failed">Ошибка ÑкÑпорта</string> 277 <string name="export_failed">Ошибка ÑкÑпорта</string>
230 <string name="import_failed">Ошибка импортированиÑ</string> 278 <string name="import_failed">Ошибка импортированиÑ</string>
231 <string name="cancelling">ОтменÑÑŽ</string> 279 <string name="cancelling">ОтменÑÑŽ</string>
232 280 <string name="install">УÑтановить</string>
281 <string name="delete">Удалить</string>
282 <string name="edit">Редактировать</string>
283 <string name="export_success">ЭкÑпорт уÑпешно выполнен</string>
284 <string name="start">Start</string>
285 <string name="clear">ОчиÑтить</string>
286 <string name="global">Глобальный</string>
287 <string name="custom">Другое</string>
288 <string name="notice">Уведомление</string>
289 <string name="import_complete">Импорт завершен</string>
233 <!-- GPU driver installation --> 290 <!-- GPU driver installation -->
234 <string name="select_gpu_driver">Выбрать драйвер ГП</string> 291 <string name="select_gpu_driver">Выбрать драйвер ГП</string>
235 <string name="select_gpu_driver_title">Хотите заменить текущий драйвер ГП?</string> 292 <string name="select_gpu_driver_title">Хотите заменить текущий драйвер ГП?</string>
236 <string name="select_gpu_driver_install">УÑтановить</string> 293 <string name="select_gpu_driver_install">УÑтановить</string>
237 <string name="select_gpu_driver_default">По умолчанию</string> 294 <string name="select_gpu_driver_default">По умолчанию</string>
238 <string name="select_gpu_driver_use_default">ИÑпользуетÑÑ Ñтандартный драйвер ГП </string> 295 <string name="select_gpu_driver_use_default">ИÑпользуетÑÑ Ñтандартный драйвер ГП </string>
239 <string name="select_gpu_driver_error">Выбран неверный драйвер, иÑпользуетÑÑ Ñтандартный ÑиÑтемный!</string> 296 <string name="select_gpu_driver_error">Выбран неподходÑщий драйвер</string>
297 <string name="driver_already_installed">Драйвер уже уÑтановлен</string>
240 <string name="system_gpu_driver">СиÑтемный драйвер ГП</string> 298 <string name="system_gpu_driver">СиÑтемный драйвер ГП</string>
241 <string name="installing_driver">УÑтановка драйвера...</string> 299 <string name="installing_driver">УÑтановка драйвера...</string>
242 300
@@ -244,11 +302,52 @@
244 <string name="preferences_settings">ÐаÑтройки</string> 302 <string name="preferences_settings">ÐаÑтройки</string>
245 <string name="preferences_general">Общие</string> 303 <string name="preferences_general">Общие</string>
246 <string name="preferences_system">СиÑтема</string> 304 <string name="preferences_system">СиÑтема</string>
305 <string name="preferences_system_description">Режим дока, регион, Ñзык</string>
247 <string name="preferences_graphics">Графика</string> 306 <string name="preferences_graphics">Графика</string>
307 <string name="preferences_graphics_description">Уровень точноÑти, разрешение, кÑш шейдеров</string>
248 <string name="preferences_audio">Ðудио</string> 308 <string name="preferences_audio">Ðудио</string>
309 <string name="preferences_audio_description">Движок вывода, громкоÑть</string>
249 <string name="preferences_theme">Тема и цвет</string> 310 <string name="preferences_theme">Тема и цвет</string>
250 <string name="preferences_debug">Отладка</string> 311 <string name="preferences_debug">Отладка</string>
251 312 <string name="preferences_debug_description">Отладка ЦП/ГП, графичеÑкий API, fastmem</string>
313
314 <!-- Game properties -->
315 <string name="info">ИнформациÑ</string>
316 <string name="info_description">ID программы, Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð², верÑиÑ</string>
317 <string name="per_game_settings">ÐаÑтройки Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ игры</string>
318 <string name="per_game_settings_description">Изменить наÑтройки Ñтой игры</string>
319 <string name="launch_options">ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿ÑƒÑка</string>
320 <string name="path">Путь</string>
321 <string name="program_id">ID программы</string>
322 <string name="developer">Разработчик</string>
323 <string name="version">ВерÑиÑ</string>
324 <string name="copy_details">Копировать детали</string>
325 <string name="add_ons">ДополнениÑ</string>
326 <string name="add_ons_description">Включение модов, обновлений и DLC</string>
327 <string name="clear_shader_cache">ОчиÑтить кÑш шейдеров</string>
328 <string name="clear_shader_cache_description">УдалÑет вÑе шейдеры, Ñозданные во Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ñ€Ñ‹.</string>
329 <string name="clear_shader_cache_warning_description">У Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ больше лагов во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð¹ генерации кÑша шейдеров</string>
330 <string name="cleared_shaders_successfully">УÑпешно очищены шейдеры</string>
331 <string name="addons_game">Ðддоны: %1$s</string>
332 <string name="save_data">Сохранить данные</string>
333 <string name="save_data_description">УправлÑть ÑохранениÑми Ñтой игры.</string>
334 <string name="delete_save_data">Удалить ÑохранениÑ</string>
335 <string name="delete_save_data_description">Удалить вÑе ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñтой игры</string>
336 <string name="delete_save_data_warning_description">Это безвозвратно удалÑет вÑе Ñохраненные данные Ñтой игры. Ð’Ñ‹ уверены, что хотите продолжить?</string>
337 <string name="save_data_deleted_successfully">Данные уÑпешно удалены</string>
338 <string name="select_content_type">Тип контента</string>
339 <string name="updates_and_dlc">ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ DLC</string>
340 <string name="mods_and_cheats">Моды и читы</string>
341 <string name="addon_notice">Важное уведомление о дополнении</string>
342 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
343 <string name="addon_notice_description">Ð”Ð»Ñ ÑƒÑтановки модов и читов необходимо выбрать папку, Ñодержащую каталог cheats/, romfs/ или exefs/. Мы не можем гарантировать их ÑовмеÑтимоÑть Ñ Ð²Ð°ÑˆÐµÐ¹ игрой, поÑтому будьте оÑторожны!</string>
344 <string name="invalid_directory">Ðеверный каталог</string>
345 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
346 <string name="invalid_directory_description">ПожалуйÑта, убедитеÑÑŒ, что Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð²Ð°Ð¼Ð¸ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñодержит папку cheats/, romfs/ или exefs/ и попробуйте Ñнова.</string>
347 <string name="addon_installed_successfully">Ðддон уÑпешно уÑтановлен</string>
348 <string name="verifying_content">Проверка Ñодержимого...</string>
349 <string name="content_install_notice">Уведомление об уÑтановке контента</string>
350 <string name="content_install_notice_description">Содержимое, которое вы выбрали, не ÑоответÑтвует Ñтой игре.\nУÑтановить вÑе равно?</string>
252 <!-- ROM loading errors --> 351 <!-- ROM loading errors -->
253 <string name="loader_error_encrypted">Ваш ROM зашифрованный</string> 352 <string name="loader_error_encrypted">Ваш ROM зашифрованный</string>
254 <string name="loader_error_encrypted_roms_description"><![CDATA[Следуйте инÑтрукциÑм, чтобы пере-дампить игровые картриджи <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\"> или <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\"> уÑтановленные игры</a>.]]></string> 353 <string name="loader_error_encrypted_roms_description"><![CDATA[Следуйте инÑтрукциÑм, чтобы пере-дампить игровые картриджи <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\"> или <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\"> уÑтановленные игры</a>.]]></string>
@@ -276,6 +375,7 @@
276 <string name="emulation_pause">Пауза ÑмулÑции</string> 375 <string name="emulation_pause">Пауза ÑмулÑции</string>
277 <string name="emulation_unpause">Возобновить ÑмулÑцию</string> 376 <string name="emulation_unpause">Возобновить ÑмулÑцию</string>
278 <string name="emulation_input_overlay">ÐаÑтройка оверлеÑ</string> 377 <string name="emulation_input_overlay">ÐаÑтройка оверлеÑ</string>
378 <string name="touchscreen">СенÑорный Ñкран</string>
279 379
280 <string name="load_settings">Загрузка наÑтроек...</string> 380 <string name="load_settings">Загрузка наÑтроек...</string>
281 381
@@ -307,6 +407,7 @@
307 407
308 <!-- Memory Sizes --> 408 <!-- Memory Sizes -->
309 <string name="memory_byte">Байт</string> 409 <string name="memory_byte">Байт</string>
410 <string name="memory_byte_shorthand">B</string>
310 <string name="memory_kilobyte">КБ</string> 411 <string name="memory_kilobyte">КБ</string>
311 <string name="memory_megabyte">МБ</string> 412 <string name="memory_megabyte">МБ</string>
312 <string name="memory_gigabyte">GB</string> 413 <string name="memory_gigabyte">GB</string>
@@ -351,9 +452,13 @@
351 <string name="anti_aliasing_smaa">SMAA</string> 452 <string name="anti_aliasing_smaa">SMAA</string>
352 453
353 <!-- Screen Layouts --> 454 <!-- Screen Layouts -->
455 <string name="screen_layout_auto">Ðвто</string>
456 <string name="screen_layout_sensor_landscape">ÐÐ»ÑŒÐ±Ð¾Ð¼Ð½Ð°Ñ (ÑенÑор)</string>
354 <string name="screen_layout_landscape">Пейзаж</string> 457 <string name="screen_layout_landscape">Пейзаж</string>
458 <string name="screen_layout_reverse_landscape">ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð°Ð»ÑŒÐ±Ð¾Ð¼Ð½Ð°Ñ</string>
459 <string name="screen_layout_sensor_portrait">ÐŸÐ¾Ñ€Ñ‚Ñ€ÐµÑ‚Ð½Ð°Ñ (ÑенÑор)</string>
355 <string name="screen_layout_portrait">Портрет</string> 460 <string name="screen_layout_portrait">Портрет</string>
356 <string name="screen_layout_auto">Ðвто</string> 461 <string name="screen_layout_reverse_portrait">ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¿Ð¾Ñ€Ñ‚Ñ€ÐµÑ‚Ð½Ð°Ñ</string>
357 462
358 <!-- Aspect Ratios --> 463 <!-- Aspect Ratios -->
359 <string name="ratio_default">Стандартное (16:9)</string> 464 <string name="ratio_default">Стандартное (16:9)</string>
@@ -362,6 +467,10 @@
362 <string name="ratio_force_sixteen_ten">ЗаÑтавить 16:10</string> 467 <string name="ratio_force_sixteen_ten">ЗаÑтавить 16:10</string>
363 <string name="ratio_stretch">РаÑÑ‚Ñнуть до окна</string> 468 <string name="ratio_stretch">РаÑÑ‚Ñнуть до окна</string>
364 469
470 <!-- CPU Backend -->
471 <string name="cpu_backend_dynarmic">Dynarmic (Медленно)</string>
472 <string name="cpu_backend_nce">Ðативное выполнение (NCE)</string>
473
365 <!-- CPU Accuracy --> 474 <!-- CPU Accuracy -->
366 <string name="cpu_accuracy_accurate">Точно</string> 475 <string name="cpu_accuracy_accurate">Точно</string>
367 <string name="cpu_accuracy_unsafe">ÐебезопаÑно</string> 476 <string name="cpu_accuracy_unsafe">ÐебезопаÑно</string>
@@ -390,8 +499,15 @@
390 <string name="theme_mode_dark">ТемнаÑ</string> 499 <string name="theme_mode_dark">ТемнаÑ</string>
391 500
392 <!-- Audio output engines --> 501 <!-- Audio output engines -->
502 <string name="oboe">oboe</string>
393 <string name="cubeb">cubeb</string> 503 <string name="cubeb">cubeb</string>
394 504
505 <!-- Anisotropic filtering options -->
506 <string name="multiplier_two">2x</string>
507 <string name="multiplier_four">4x</string>
508 <string name="multiplier_eight">8x</string>
509 <string name="multiplier_sixteen">16x</string>
510
395 <!-- Black backgrounds theme --> 511 <!-- Black backgrounds theme -->
396 <string name="use_black_backgrounds">Чёрный фон</string> 512 <string name="use_black_backgrounds">Чёрный фон</string>
397 <string name="use_black_backgrounds_description">При иÑпользовании темной темы применÑйте черный фон.</string> 513 <string name="use_black_backgrounds_description">При иÑпользовании темной темы применÑйте черный фон.</string>
diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml
index 34809dbb8..361f0b726 100644
--- a/src/android/app/src/main/res/values-uk/strings.xml
+++ b/src/android/app/src/main/res/values-uk/strings.xml
@@ -143,13 +143,16 @@
143 <string name="string_null">Null</string> 143 <string name="string_null">Null</string>
144 <string name="string_import">Імпорт</string> 144 <string name="string_import">Імпорт</string>
145 <string name="export">ЕкÑпорт</string> 145 <string name="export">ЕкÑпорт</string>
146 <string name="install">Ð’Ñтановити</string>
147 <string name="delete">Видалити</string>
148 <string name="start">Start</string>
149 <string name="clear">ОчиÑтити</string>
146 <!-- GPU driver installation --> 150 <!-- GPU driver installation -->
147 <string name="select_gpu_driver">Вибрати драйвер ГП</string> 151 <string name="select_gpu_driver">Вибрати драйвер ГП</string>
148 <string name="select_gpu_driver_title">Хочете замінити поточний драйвер ГП?</string> 152 <string name="select_gpu_driver_title">Хочете замінити поточний драйвер ГП?</string>
149 <string name="select_gpu_driver_install">Ð’Ñтановити</string> 153 <string name="select_gpu_driver_install">Ð’Ñтановити</string>
150 <string name="select_gpu_driver_default">За замовчуваннÑм</string> 154 <string name="select_gpu_driver_default">За замовчуваннÑм</string>
151 <string name="select_gpu_driver_use_default">ВикориÑтовуєтьÑÑ Ñтандартний драйвер ГП</string> 155 <string name="select_gpu_driver_use_default">ВикориÑтовуєтьÑÑ Ñтандартний драйвер ГП</string>
152 <string name="select_gpu_driver_error">Обрано неправильний драйвер, викориÑтовуєтьÑÑ Ñтандартний ÑиÑтемний!</string>
153 <string name="system_gpu_driver">СиÑтемний драйвер ГП</string> 156 <string name="system_gpu_driver">СиÑтемний драйвер ГП</string>
154 <string name="installing_driver">Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð°...</string> 157 <string name="installing_driver">Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð°...</string>
155 158
@@ -161,7 +164,12 @@
161 <string name="preferences_audio">Ðудіо</string> 164 <string name="preferences_audio">Ðудіо</string>
162 <string name="preferences_theme">Тема і колір</string> 165 <string name="preferences_theme">Тема і колір</string>
163 <string name="preferences_debug">ÐалагодженнÑ</string> 166 <string name="preferences_debug">ÐалагодженнÑ</string>
164 167 <!-- Game properties -->
168 <string name="info">ІнформаціÑ</string>
169 <string name="path">ШлÑÑ…</string>
170 <string name="developer">Розробник</string>
171 <string name="version">ВерÑÑ–Ñ</string>
172 <string name="add_ons">ДоповненнÑ</string>
165 <!-- ROM loading errors --> 173 <!-- ROM loading errors -->
166 <string name="loader_error_encrypted">Ваш ROM зашифрований</string> 174 <string name="loader_error_encrypted">Ваш ROM зашифрований</string>
167 <string name="loader_error_encrypted_keys_description"><![CDATA[Будь лаÑка, переконайтеÑÑ, що ваш файл <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> вÑтановлено, щоб ігри можна було розшифрувати.]]></string> 175 <string name="loader_error_encrypted_keys_description"><![CDATA[Будь лаÑка, переконайтеÑÑ, що ваш файл <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> вÑтановлено, щоб ігри можна було розшифрувати.]]></string>
@@ -173,6 +181,8 @@
173 <string name="emulation_done">Готово</string> 181 <string name="emulation_done">Готово</string>
174 <string name="emulation_control_scale">МаÑштаб</string> 182 <string name="emulation_control_scale">МаÑштаб</string>
175 <string name="emulation_control_opacity">ÐепрозоріÑть</string> 183 <string name="emulation_control_opacity">ÐепрозоріÑть</string>
184 <string name="touchscreen">СенÑорний екран</string>
185
176 <!-- Errors and warnings --> 186 <!-- Errors and warnings -->
177 <string name="abort_button">Перервати</string> 187 <string name="abort_button">Перервати</string>
178 <string name="continue_button">Продовжити</string> 188 <string name="continue_button">Продовжити</string>
@@ -192,6 +202,7 @@
192 <string name="region_korea">КореÑ</string> 202 <string name="region_korea">КореÑ</string>
193 <string name="region_taiwan">Тайвань</string> 203 <string name="region_taiwan">Тайвань</string>
194 204
205 <string name="memory_byte_shorthand">B</string>
195 <string name="memory_gigabyte">GB</string> 206 <string name="memory_gigabyte">GB</string>
196 <!-- Renderer APIs --> 207 <!-- Renderer APIs -->
197 <string name="renderer_vulkan">Vulkan</string> 208 <string name="renderer_vulkan">Vulkan</string>
@@ -229,8 +240,8 @@
229 <string name="anti_aliasing_fxaa">FXAA</string> 240 <string name="anti_aliasing_fxaa">FXAA</string>
230 <string name="anti_aliasing_smaa">SMAA</string> 241 <string name="anti_aliasing_smaa">SMAA</string>
231 242
243 <!-- Screen Layouts -->
232 <string name="screen_layout_auto">Ðвто</string> 244 <string name="screen_layout_auto">Ðвто</string>
233
234 <!-- Aspect Ratios --> 245 <!-- Aspect Ratios -->
235 <string name="ratio_default">За замовчуваннÑм (16:9)</string> 246 <string name="ratio_default">За замовчуваннÑм (16:9)</string>
236 <string name="ratio_force_four_three">ЗмуÑити 4:3</string> 247 <string name="ratio_force_four_three">ЗмуÑити 4:3</string>
@@ -255,6 +266,12 @@
255 <string name="theme_mode_light">Світла</string> 266 <string name="theme_mode_light">Світла</string>
256 <string name="theme_mode_dark">Темна</string> 267 <string name="theme_mode_dark">Темна</string>
257 268
269 <!-- Anisotropic filtering options -->
270 <string name="multiplier_two">2x</string>
271 <string name="multiplier_four">4x</string>
272 <string name="multiplier_eight">8x</string>
273 <string name="multiplier_sixteen">16x</string>
274
258 <string name="use_black_backgrounds_description">У разі викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚ÐµÐ¼Ð½Ð¾Ñ— теми заÑтоÑовуйте чорне тло.</string> 275 <string name="use_black_backgrounds_description">У разі викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚ÐµÐ¼Ð½Ð¾Ñ— теми заÑтоÑовуйте чорне тло.</string>
259 276
260 <string name="mute">Вимкнути звук</string> 277 <string name="mute">Вимкнути звук</string>
diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml
index f977db3a2..0a722f329 100644
--- a/src/android/app/src/main/res/values-vi/strings.xml
+++ b/src/android/app/src/main/res/values-vi/strings.xml
@@ -157,7 +157,6 @@
157 <string name="renderer_reactive_flushing_description">Cải thiện độ chính xác kết xuất trong má»™t số game nhưng đồng thá»i giảm hiệu suất.</string> 157 <string name="renderer_reactive_flushing_description">Cải thiện độ chính xác kết xuất trong má»™t số game nhưng đồng thá»i giảm hiệu suất.</string>
158 <string name="use_disk_shader_cache">Lưu bộ nhớ đệm shader trên ổ cứng</string> 158 <string name="use_disk_shader_cache">Lưu bộ nhớ đệm shader trên ổ cứng</string>
159 <string name="use_disk_shader_cache_description">Giảm tình trạng giật lag bằng cách lưu trữ và tải các shader được tạo ra nội bộ.</string> 159 <string name="use_disk_shader_cache_description">Giảm tình trạng giật lag bằng cách lưu trữ và tải các shader được tạo ra nội bộ.</string>
160
161 <!-- Debug settings strings --> 160 <!-- Debug settings strings -->
162 <string name="cpu">CPU</string> 161 <string name="cpu">CPU</string>
163 <string name="renderer_api">API</string> 162 <string name="renderer_api">API</string>
@@ -184,13 +183,17 @@
184 <string name="string_null">Null</string> 183 <string name="string_null">Null</string>
185 <string name="string_import">Nhập</string> 184 <string name="string_import">Nhập</string>
186 <string name="export">Xuất</string> 185 <string name="export">Xuất</string>
186 <string name="install">Cài đặt</string>
187 <string name="delete">Xoá</string>
188 <string name="start">Bắt đầu</string>
189 <string name="clear">Xóa</string>
190 <string name="custom">Tùy chỉnh</string>
187 <!-- GPU driver installation --> 191 <!-- GPU driver installation -->
188 <string name="select_gpu_driver">Chá»n driver GPU</string> 192 <string name="select_gpu_driver">Chá»n driver GPU</string>
189 <string name="select_gpu_driver_title">Bạn có muốn thay thế driver GPU hiện tại không?</string> 193 <string name="select_gpu_driver_title">Bạn có muốn thay thế driver GPU hiện tại không?</string>
190 <string name="select_gpu_driver_install">Cài đặt</string> 194 <string name="select_gpu_driver_install">Cài đặt</string>
191 <string name="select_gpu_driver_default">Mặc định</string> 195 <string name="select_gpu_driver_default">Mặc định</string>
192 <string name="select_gpu_driver_use_default">Dùng driver GPU mặc định</string> 196 <string name="select_gpu_driver_use_default">Dùng driver GPU mặc định</string>
193 <string name="select_gpu_driver_error">Driver không hợp lệ đã được chá»n, dùng mặc định hệ thống!</string>
194 <string name="system_gpu_driver">Driver GPU hệ thống</string> 197 <string name="system_gpu_driver">Driver GPU hệ thống</string>
195 <string name="installing_driver">Äang cài đặt driver...</string> 198 <string name="installing_driver">Äang cài đặt driver...</string>
196 199
@@ -202,7 +205,12 @@
202 <string name="preferences_audio">Âm thanh</string> 205 <string name="preferences_audio">Âm thanh</string>
203 <string name="preferences_theme">Chủ đỠvà màu sắc</string> 206 <string name="preferences_theme">Chủ đỠvà màu sắc</string>
204 <string name="preferences_debug">Gỡ lỗi</string> 207 <string name="preferences_debug">Gỡ lỗi</string>
205 208 <!-- Game properties -->
209 <string name="info">Thông tin</string>
210 <string name="path">ÄÆ°á»ng dẫn</string>
211 <string name="developer">Nhà phát triển</string>
212 <string name="version">Phiên bản</string>
213 <string name="add_ons">Add-ons</string>
206 <!-- ROM loading errors --> 214 <!-- ROM loading errors -->
207 <string name="loader_error_encrypted">ROM của bạn đã bị mã hoá</string> 215 <string name="loader_error_encrypted">ROM của bạn đã bị mã hoá</string>
208 <string name="loader_error_encrypted_keys_description"><![CDATA[Vui lòng đảm bảo tệp <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> đã được cài đặt để các game có thể được giải mã.]]></string> 216 <string name="loader_error_encrypted_keys_description"><![CDATA[Vui lòng đảm bảo tệp <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> đã được cài đặt để các game có thể được giải mã.]]></string>
@@ -229,6 +237,7 @@
229 <string name="emulation_pause">Tạm đừng giả lập</string> 237 <string name="emulation_pause">Tạm đừng giả lập</string>
230 <string name="emulation_unpause">Tiếp tục giả lập</string> 238 <string name="emulation_unpause">Tiếp tục giả lập</string>
231 <string name="emulation_input_overlay">Tuỳ chá»n lá»›p phá»§</string> 239 <string name="emulation_input_overlay">Tuỳ chá»n lá»›p phá»§</string>
240 <string name="touchscreen">Màn hình cảm ứng</string>
232 241
233 <string name="load_settings">Äang tải cài đặt...</string> 242 <string name="load_settings">Äang tải cài đặt...</string>
234 243
@@ -254,6 +263,7 @@
254 <string name="region_korea">Hàn Quốc</string> 263 <string name="region_korea">Hàn Quốc</string>
255 <string name="region_taiwan">Äài Loan</string> 264 <string name="region_taiwan">Äài Loan</string>
256 265
266 <string name="memory_byte_shorthand">B</string>
257 <string name="memory_gigabyte">GB</string> 267 <string name="memory_gigabyte">GB</string>
258 <!-- Renderer APIs --> 268 <!-- Renderer APIs -->
259 <string name="renderer_vulkan">Vulkan</string> 269 <string name="renderer_vulkan">Vulkan</string>
@@ -291,8 +301,8 @@
291 <string name="anti_aliasing_fxaa">FXAA</string> 301 <string name="anti_aliasing_fxaa">FXAA</string>
292 <string name="anti_aliasing_smaa">SMAA</string> 302 <string name="anti_aliasing_smaa">SMAA</string>
293 303
304 <!-- Screen Layouts -->
294 <string name="screen_layout_auto">Tự động</string> 305 <string name="screen_layout_auto">Tự động</string>
295
296 <!-- Aspect Ratios --> 306 <!-- Aspect Ratios -->
297 <string name="ratio_default">Mặc định (16:9)</string> 307 <string name="ratio_default">Mặc định (16:9)</string>
298 <string name="ratio_force_four_three">Dùng 4:3</string> 308 <string name="ratio_force_four_three">Dùng 4:3</string>
@@ -327,6 +337,12 @@
327 <string name="theme_mode_light">Sáng</string> 337 <string name="theme_mode_light">Sáng</string>
328 <string name="theme_mode_dark">Tối</string> 338 <string name="theme_mode_dark">Tối</string>
329 339
340 <!-- Anisotropic filtering options -->
341 <string name="multiplier_two">2x</string>
342 <string name="multiplier_four">4x</string>
343 <string name="multiplier_eight">8x</string>
344 <string name="multiplier_sixteen">16x</string>
345
330 <!-- Black backgrounds theme --> 346 <!-- Black backgrounds theme -->
331 <string name="use_black_backgrounds">Ná»n Ä‘en</string> 347 <string name="use_black_backgrounds">Ná»n Ä‘en</string>
332 <string name="use_black_backgrounds_description">Khi sá»­ dụng chá»§ đỠtối, hãy áp dụng ná»n Ä‘en.</string> 348 <string name="use_black_backgrounds_description">Khi sá»­ dụng chá»§ đỠtối, hãy áp dụng ná»n Ä‘en.</string>
diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml
index 13455564f..b840591a4 100644
--- a/src/android/app/src/main/res/values-zh-rCN/strings.xml
+++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml
@@ -34,6 +34,7 @@
34 <string name="empty_gamelist">找ä¸åˆ°æ¸¸æˆï¼Œæˆ–è€…å°šæœªé€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹ã€‚</string> 34 <string name="empty_gamelist">找ä¸åˆ°æ¸¸æˆï¼Œæˆ–è€…å°šæœªé€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹ã€‚</string>
35 <string name="search_and_filter_games">æœç´¢æ¸¸æˆ</string> 35 <string name="search_and_filter_games">æœç´¢æ¸¸æˆ</string>
36 <string name="select_games_folder">é€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹</string> 36 <string name="select_games_folder">é€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹</string>
37 <string name="manage_game_folders">ç®¡ç†æ¸¸æˆæ–‡ä»¶å¤¹</string>
37 <string name="select_games_folder_description">å…许 yuzu 填充游æˆåˆ—表</string> 38 <string name="select_games_folder_description">å…许 yuzu 填充游æˆåˆ—表</string>
38 <string name="add_games_warning">è·³è¿‡é€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹ï¼Ÿ</string> 39 <string name="add_games_warning">è·³è¿‡é€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹ï¼Ÿ</string>
39 <string name="add_games_warning_description">å¦‚æžœæœªé€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹ï¼Œæ¸¸æˆå°†ä¸ä¼šæ˜¾ç¤ºåœ¨æ¸¸æˆåˆ—表中。</string> 40 <string name="add_games_warning_description">å¦‚æžœæœªé€‰æ‹©æ¸¸æˆæ–‡ä»¶å¤¹ï¼Œæ¸¸æˆå°†ä¸ä¼šæ˜¾ç¤ºåœ¨æ¸¸æˆåˆ—表中。</string>
@@ -68,6 +69,7 @@
68 <string name="invalid_keys_error">无效的加密密钥</string> 69 <string name="invalid_keys_error">无效的加密密钥</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">é€‰æ‹©çš„å¯†é’¥æ–‡ä»¶ä¸æ­£ç¡®æˆ–å·²æŸåã€‚è¯·é‡æ–°è½¬å‚¨å¯†é’¥æ–‡ä»¶ã€‚</string> 71 <string name="install_keys_failure_description">é€‰æ‹©çš„å¯†é’¥æ–‡ä»¶ä¸æ­£ç¡®æˆ–å·²æŸåã€‚è¯·é‡æ–°è½¬å‚¨å¯†é’¥æ–‡ä»¶ã€‚</string>
72 <string name="gpu_driver_manager">GPU 驱动管ç†å™¨</string>
71 <string name="install_gpu_driver">安装 GPU 驱动</string> 73 <string name="install_gpu_driver">安装 GPU 驱动</string>
72 <string name="install_gpu_driver_description">安装替代的驱动程åºä»¥èŽ·å¾—æ›´å¥½çš„æ€§èƒ½å’Œç²¾åº¦</string> 74 <string name="install_gpu_driver_description">安装替代的驱动程åºä»¥èŽ·å¾—æ›´å¥½çš„æ€§èƒ½å’Œç²¾åº¦</string>
73 <string name="advanced_settings">高级选项</string> 75 <string name="advanced_settings">高级选项</string>
@@ -85,8 +87,12 @@
85 <string name="notification_no_directory_link_description">请使用文件管ç†å™¨çš„ä¾§éƒ¨é¢æ¿æ‰‹åŠ¨å®šä½ç”¨æˆ·æ–‡ä»¶å¤¹ã€‚</string> 87 <string name="notification_no_directory_link_description">请使用文件管ç†å™¨çš„ä¾§éƒ¨é¢æ¿æ‰‹åŠ¨å®šä½ç”¨æˆ·æ–‡ä»¶å¤¹ã€‚</string>
86 <string name="manage_save_data">管ç†å­˜æ¡£æ•°æ®</string> 88 <string name="manage_save_data">管ç†å­˜æ¡£æ•°æ®</string>
87 <string name="manage_save_data_description">已找到存档数æ®ï¼Œè¯·é€‰æ‹©ä¸‹æ–¹çš„选项。</string> 89 <string name="manage_save_data_description">已找到存档数æ®ï¼Œè¯·é€‰æ‹©ä¸‹æ–¹çš„选项。</string>
90 <string name="import_save_warning">导入ä¿å­˜æ•°æ®</string>
91 <string name="import_save_warning_description">这将用您所æä¾›çš„ä¿å­˜æ•°æ®è¦†ç›–当剿‰€æœ‰çš„ä¿å­˜æ•°æ®ã€‚您确定è¦ç»§ç»­å—?</string>
88 <string name="import_export_saves_description">导入或导出存档</string> 92 <string name="import_export_saves_description">导入或导出存档</string>
89 <string name="save_file_imported_success">å·²æˆåŠŸå¯¼å…¥å­˜æ¡£</string> 93 <string name="save_files_importing">正在导入存档文件...</string>
94 <string name="save_files_exporting">正在导出存档文件...</string>
95 <string name="save_file_imported_success">导入æˆåŠŸ</string>
90 <string name="save_file_invalid_zip_structure">无效的存档目录</string> 96 <string name="save_file_invalid_zip_structure">无效的存档目录</string>
91 <string name="save_file_invalid_zip_structure_description">ç¬¬ä¸€ä¸ªå­æ–‡ä»¶å¤¹åç§°å¿…é¡»ä¸ºå½“å‰æ¸¸æˆçš„ ID。</string> 97 <string name="save_file_invalid_zip_structure_description">ç¬¬ä¸€ä¸ªå­æ–‡ä»¶å¤¹åç§°å¿…é¡»ä¸ºå½“å‰æ¸¸æˆçš„ ID。</string>
92 <string name="import_saves">导入</string> 98 <string name="import_saves">导入</string>
@@ -118,13 +124,43 @@
118 <string name="manage_yuzu_data_description">导入/导出固件ã€å¯†é’¥ã€ç”¨æˆ·æ•°æ®åŠå…¶ä»–。</string> 124 <string name="manage_yuzu_data_description">导入/导出固件ã€å¯†é’¥ã€ç”¨æˆ·æ•°æ®åŠå…¶ä»–。</string>
119 <string name="share_save_file">分享存档文件</string> 125 <string name="share_save_file">分享存档文件</string>
120 <string name="export_save_failed">导出存档文件失败</string> 126 <string name="export_save_failed">导出存档文件失败</string>
127 <string name="game_folders">æ¸¸æˆæ–‡ä»¶å¤¹</string>
128 <string name="deep_scan">深度扫æ</string>
129 <string name="add_game_folder">æ·»åŠ æ¸¸æˆæ–‡ä»¶å¤¹</string>
130 <string name="folder_already_added">这个文件夹先å‰å·²è¢«æ·»åŠ ï¼</string>
131 <string name="game_folder_properties">æ¸¸æˆæ–‡ä»¶å¤¹å±žæ€§</string>
132 <plurals name="saves_import_failed">
133 <item quantity="other">%d 个存档导入失败</item>
134 </plurals>
135 <plurals name="saves_import_success">
136 <item quantity="other">æˆåŠŸå¯¼å…¥ %d 个存档</item>
137 </plurals>
138 <string name="no_save_data_found">未找到存档数æ®</string>
139
140 <!-- Applet launcher strings -->
141 <string name="applets">å°ç¨‹åºå¯åЍ噍</string>
142 <string name="applets_description">使用已安装的固件å¯åŠ¨ç³»ç»Ÿå°ç¨‹åº</string>
143 <string name="applets_error_firmware">未安装固件</string>
144 <string name="applets_error_applet">å°ç¨‹åºä¸å¯ç”¨</string>
145 <string name="applets_error_description"><![CDATA[è¯·ç¡®ä¿ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 文件和<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">固件</a>已安装,然åŽå†è¯•一次。]]></string>
146 <string name="album_applet">相册</string>
147 <string name="album_applet_description">查看存储在用户å±å¹•截图文件夹中的图åƒ</string>
148 <string name="mii_edit_applet">Mii edit</string>
149 <string name="mii_edit_applet_description">查看和编辑 Mii</string>
150 <string name="cabinet_applet">Cabinet</string>
151 <string name="cabinet_applet_description">编辑ã€åˆ é™¤å­˜å‚¨åœ¨ amiibo 上的数æ®</string>
152 <string name="cabinet_launcher">Cabinet å¯åЍ噍</string>
153 <string name="cabinet_nickname_and_owner">昵称和所有者设置</string>
154 <string name="cabinet_game_data_eraser">æ¸¸æˆæ•°æ®æ“¦é™¤å™¨</string>
155 <string name="cabinet_restorer">æ¢å¤å™¨</string>
156 <string name="cabinet_formatter">æ ¼å¼åŒ–程åº</string>
121 157
122 <!-- About screen strings --> 158 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia ä¸çœŸå®ž</string> 159 <string name="gaia_is_not_real">Gaia ä¸çœŸå®ž</string>
124 <string name="copied_to_clipboard">å·²å¤åˆ¶åˆ°å‰ªè´´æ¿</string> 160 <string name="copied_to_clipboard">å·²å¤åˆ¶åˆ°å‰ªè´´æ¿</string>
125 <string name="about_app_description">一款开放æºä»£ç çš„ Switch 模拟器</string> 161 <string name="about_app_description">一款开放æºä»£ç çš„ Switch 模拟器</string>
126 <string name="contributors">贡献者</string> 162 <string name="contributors">贡献者</string>
127 <string name="contributors_description">使用æ¥è‡ª yuzu 团队的 \u2764 制作</string> 163 <string name="contributors_description">yuzu 团队的用 \u2764 制作</string>
128 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> 164 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
129 <string name="licenses_description">Android 版 yuzu 离ä¸å¼€è¿™äº›é¡¹ç›®çš„æ”¯æŒ</string> 165 <string name="licenses_description">Android 版 yuzu 离ä¸å¼€è¿™äº›é¡¹ç›®çš„æ”¯æŒ</string>
130 <string name="build">构建版本</string> 166 <string name="build">构建版本</string>
@@ -161,6 +197,7 @@
161 <string name="frame_limit_enable_description">å°†è¿è¡Œé€Ÿåº¦é™åˆ¶ä¸ºæ­£å¸¸é€Ÿåº¦çš„æŒ‡å®šç™¾åˆ†æ¯”。</string> 197 <string name="frame_limit_enable_description">å°†è¿è¡Œé€Ÿåº¦é™åˆ¶ä¸ºæ­£å¸¸é€Ÿåº¦çš„æŒ‡å®šç™¾åˆ†æ¯”。</string>
162 <string name="frame_limit_slider">é™åˆ¶é€Ÿåº¦ç™¾åˆ†æ¯”</string> 198 <string name="frame_limit_slider">é™åˆ¶é€Ÿåº¦ç™¾åˆ†æ¯”</string>
163 <string name="frame_limit_slider_description">指定é™åˆ¶è¿è¡Œé€Ÿåº¦çš„百分比。100% 为正常速度。更高或更低的值将增加或é™ä½Žé€Ÿåº¦é™åˆ¶ä¸Šé™ã€‚</string> 199 <string name="frame_limit_slider_description">指定é™åˆ¶è¿è¡Œé€Ÿåº¦çš„百分比。100% 为正常速度。更高或更低的值将增加或é™ä½Žé€Ÿåº¦é™åˆ¶ä¸Šé™ã€‚</string>
200 <string name="cpu_backend">CPU åŽç«¯</string>
164 <string name="cpu_accuracy">CPU 精度</string> 201 <string name="cpu_accuracy">CPU 精度</string>
165 <string name="value_with_units">%1$s%2$s</string> 202 <string name="value_with_units">%1$s%2$s</string>
166 203
@@ -191,6 +228,8 @@
191 <string name="renderer_reactive_flushing_description">牺牲性能,æé«˜æŸäº›æ¸¸æˆçš„æ¸²æŸ“精度。</string> 228 <string name="renderer_reactive_flushing_description">牺牲性能,æé«˜æŸäº›æ¸¸æˆçš„æ¸²æŸ“精度。</string>
192 <string name="use_disk_shader_cache">ç£ç›˜ç€è‰²å™¨ç¼“å­˜</string> 229 <string name="use_disk_shader_cache">ç£ç›˜ç€è‰²å™¨ç¼“å­˜</string>
193 <string name="use_disk_shader_cache_description">将生æˆçš„ç€è‰²å™¨ç¼“存于ç£ç›˜ä¸­å¹¶è¿›è¡Œè¯»å–,以å‡å°‘å¡é¡¿ã€‚</string> 230 <string name="use_disk_shader_cache_description">将生æˆçš„ç€è‰²å™¨ç¼“存于ç£ç›˜ä¸­å¹¶è¿›è¡Œè¯»å–,以å‡å°‘å¡é¡¿ã€‚</string>
231 <string name="anisotropic_filtering">å„å‘异性过滤</string>
232 <string name="anisotropic_filtering_description">æé«˜æ–œè§’的纹ç†è´¨é‡</string>
194 233
195 <!-- Debug settings strings --> 234 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 235 <string name="cpu">CPU</string>
@@ -217,6 +256,7 @@
217 <string name="shutting_down">正在关闭…</string> 256 <string name="shutting_down">正在关闭…</string>
218 <string name="reset_setting_confirmation">您è¦å°†æ­¤è®¾å®šé‡è®¾ä¸ºé»˜è®¤å€¼å—?</string> 257 <string name="reset_setting_confirmation">您è¦å°†æ­¤è®¾å®šé‡è®¾ä¸ºé»˜è®¤å€¼å—?</string>
219 <string name="reset_to_default">æ¢å¤é»˜è®¤</string> 258 <string name="reset_to_default">æ¢å¤é»˜è®¤</string>
259 <string name="reset_to_default_description">é‡ç½®æ‰€æœ‰é«˜çº§é€‰é¡¹</string>
220 <string name="reset_all_settings">é‡ç½®æ‰€æœ‰è®¾ç½®é¡¹ï¼Ÿ</string> 260 <string name="reset_all_settings">é‡ç½®æ‰€æœ‰è®¾ç½®é¡¹ï¼Ÿ</string>
221 <string name="reset_all_settings_description">所有高级选项都将被é‡è®¾ï¼Œæ­¤åŠ¨ä½œæ— æ³•è¿˜åŽŸã€‚</string> 261 <string name="reset_all_settings_description">所有高级选项都将被é‡è®¾ï¼Œæ­¤åŠ¨ä½œæ— æ³•è¿˜åŽŸã€‚</string>
222 <string name="settings_reset">é‡è®¾è®¾ç½®é¡¹</string> 262 <string name="settings_reset">é‡è®¾è®¾ç½®é¡¹</string>
@@ -230,6 +270,18 @@
230 <string name="export_failed">导出失败</string> 270 <string name="export_failed">导出失败</string>
231 <string name="import_failed">导入失败</string> 271 <string name="import_failed">导入失败</string>
232 <string name="cancelling">å–æ¶ˆä¸­</string> 272 <string name="cancelling">å–æ¶ˆä¸­</string>
273 <string name="install">安装</string>
274 <string name="delete">删除</string>
275 <string name="edit">编辑</string>
276 <string name="export_success">导出æˆåŠŸ</string>
277 <string name="start">开始</string>
278 <string name="clear">清除</string>
279 <string name="global">全局</string>
280 <string name="custom">自定义</string>
281 <string name="notice">æé†’</string>
282 <string name="import_complete">导入完æˆ</string>
283 <string name="more_options">更多选项</string>
284 <string name="use_global_setting">使用全局设置</string>
233 285
234 <!-- GPU driver installation --> 286 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">选择 GPU 驱动程åº</string> 287 <string name="select_gpu_driver">选择 GPU 驱动程åº</string>
@@ -237,7 +289,8 @@
237 <string name="select_gpu_driver_install">安装</string> 289 <string name="select_gpu_driver_install">安装</string>
238 <string name="select_gpu_driver_default">系统默认</string> 290 <string name="select_gpu_driver_default">系统默认</string>
239 <string name="select_gpu_driver_use_default">使用默认 GPU 驱动程åº</string> 291 <string name="select_gpu_driver_use_default">使用默认 GPU 驱动程åº</string>
240 <string name="select_gpu_driver_error">é€‰æ‹©çš„é©±åŠ¨ç¨‹åºæ— æ•ˆï¼Œå°†ä½¿ç”¨ç³»ç»Ÿé»˜è®¤çš„驱动程åºï¼</string> 292 <string name="select_gpu_driver_error">选择的驱动无效</string>
293 <string name="driver_already_installed">驱动已安装</string>
241 <string name="system_gpu_driver">系统 GPU 驱动程åº</string> 294 <string name="system_gpu_driver">系统 GPU 驱动程åº</string>
242 <string name="installing_driver">正在安装驱动程åºâ€¦</string> 295 <string name="installing_driver">正在安装驱动程åºâ€¦</string>
243 296
@@ -245,10 +298,54 @@
245 <string name="preferences_settings">设置</string> 298 <string name="preferences_settings">设置</string>
246 <string name="preferences_general">通用</string> 299 <string name="preferences_general">通用</string>
247 <string name="preferences_system">系统</string> 300 <string name="preferences_system">系统</string>
301 <string name="preferences_system_description">主机è¿è¡Œæ¨¡å¼ã€åŒºåŸŸåŠè¯­è¨€</string>
248 <string name="preferences_graphics">图形</string> 302 <string name="preferences_graphics">图形</string>
303 <string name="preferences_graphics_description">精度等级ã€åˆ†è¾¨çއåŠç€è‰²å™¨ç¼“å­˜</string>
249 <string name="preferences_audio">声音</string> 304 <string name="preferences_audio">声音</string>
305 <string name="preferences_audio_description">输出引擎åŠéŸ³é‡</string>
250 <string name="preferences_theme">主题和色彩</string> 306 <string name="preferences_theme">主题和色彩</string>
251 <string name="preferences_debug">调试</string> 307 <string name="preferences_debug">调试</string>
308 <string name="preferences_debug_description">CPU/GPU 调试ã€å›¾å½¢ API åŠ fastmem 内存访问</string>
309
310 <!-- Game properties -->
311 <string name="info">ä¿¡æ¯</string>
312 <string name="info_description">æ¸¸æˆ IDã€å¼€å‘者åŠç‰ˆæœ¬ä¿¡æ¯</string>
313 <string name="per_game_settings">游æˆå•独设置</string>
314 <string name="per_game_settings_description">编辑此游æˆçš„å•独设置项</string>
315 <string name="launch_options">载入é…ç½®</string>
316 <string name="path">路径</string>
317 <string name="program_id">æ¸¸æˆ ID</string>
318 <string name="developer">å¼€å‘商</string>
319 <string name="version">版本</string>
320 <string name="copy_details">å¤åˆ¶æ˜Žç»†</string>
321 <string name="add_ons">附加项</string>
322 <string name="add_ons_description">ç®¡ç† modã€æ¸¸æˆæ›´æ–°åŠ DLC</string>
323 <string name="clear_shader_cache">清除ç€è‰²å™¨ç¼“å­˜</string>
324 <string name="clear_shader_cache_description">删除此游æˆçš„æ‰€æœ‰ç€è‰²å™¨ç¼“å­˜</string>
325 <string name="clear_shader_cache_warning_description">由于ç€è‰²å™¨ç¼“å­˜çš„é‡æ–°ç”Ÿæˆï¼Œæ‚¨å°†é­é‡æ›´å¤šå¡é¡¿</string>
326 <string name="cleared_shaders_successfully">ç€è‰²å™¨ç¼“存清除æˆåŠŸ</string>
327 <string name="addons_game">附加项: %1$s</string>
328 <string name="save_data">ä¿å­˜æ•°æ®</string>
329 <string name="save_data_description">ç®¡ç†æ­¤æ¸¸æˆçš„ä¿å­˜æ•°æ®</string>
330 <string name="delete_save_data">删除ä¿å­˜æ•°æ®</string>
331 <string name="delete_save_data_description">删除此游æˆçš„æ‰€æœ‰ä¿å­˜æ•°æ®</string>
332 <string name="delete_save_data_warning_description">这将删除此游æˆçš„æ‰€æœ‰ä¿å­˜æ•°æ®ä¸”ä¸å¯æ’¤é”€ã€‚您确定è¦ç»§ç»­å—?</string>
333 <string name="save_data_deleted_successfully">ä¿å­˜æ•°æ®åˆ é™¤æˆåŠŸ</string>
334 <string name="select_content_type">内容类型</string>
335 <string name="updates_and_dlc">æ¸¸æˆæ›´æ–°å’Œ DLC</string>
336 <string name="mods_and_cheats">Mod 和金手指</string>
337 <string name="addon_notice">附加项é‡è¦æé†’</string>
338 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
339 <string name="addon_notice_description">为了安装 mod å’Œé‡‘æ‰‹æŒ‡ï¼Œæ‚¨å¿…é¡»é€‰æ‹©ä¸€ä¸ªåŒ…å« cheats/ã€romfs/ 或 exefs/ 目录的文件夹。我们无法验è¯è¿™äº›å†…容是å¦ä¸Žæ‚¨çš„æ¸¸æˆå…¼å®¹ï¼Œæ‰€ä»¥è¯·å°å¿ƒä½¿ç”¨ï¼</string>
340 <string name="invalid_directory">无效目录</string>
341 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
342 <string name="invalid_directory_description">è¯·ç¡®ä¿æ‚¨é€‰æ‹©çš„ç›®å½•ä¸‹åŒ…å« cheats/ã€romfs/ 或 exefs/ 文件夹然åŽé‡è¯•。</string>
343 <string name="addon_installed_successfully">附加项安装æˆåŠŸ</string>
344 <string name="verifying_content">验è¯å®‰è£…内容...</string>
345 <string name="content_install_notice">安装æé†’</string>
346 <string name="content_install_notice_description">您选择安装的内容与此游æˆä¸åŒ¹é…。\n继续安装?</string>
347 <string name="confirm_uninstall">å¸è½½ç¡®è®¤</string>
348 <string name="confirm_uninstall_description">您确定è¦å¸è½½æ­¤é™„加项å—?</string>
252 349
253 <!-- ROM loading errors --> 350 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">您的 ROM 已加密</string> 351 <string name="loader_error_encrypted">您的 ROM 已加密</string>
@@ -277,6 +374,7 @@
277 <string name="emulation_pause">æš‚åœæ¨¡æ‹Ÿ</string> 374 <string name="emulation_pause">æš‚åœæ¨¡æ‹Ÿ</string>
278 <string name="emulation_unpause">继续模拟</string> 375 <string name="emulation_unpause">继续模拟</string>
279 <string name="emulation_input_overlay">虚拟按键选项</string> 376 <string name="emulation_input_overlay">虚拟按键选项</string>
377 <string name="touchscreen">触摸å±</string>
280 378
281 <string name="load_settings">正在载入设定…</string> 379 <string name="load_settings">正在载入设定…</string>
282 380
@@ -308,6 +406,7 @@
308 406
309 <!-- Memory Sizes --> 407 <!-- Memory Sizes -->
310 <string name="memory_byte">Byte</string> 408 <string name="memory_byte">Byte</string>
409 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">KB</string> 410 <string name="memory_kilobyte">KB</string>
312 <string name="memory_megabyte">MB</string> 411 <string name="memory_megabyte">MB</string>
313 <string name="memory_gigabyte">GB</string> 412 <string name="memory_gigabyte">GB</string>
@@ -352,9 +451,13 @@
352 <string name="anti_aliasing_smaa">å­åƒç´ å½¢æ€å­¦æŠ—锯齿</string> 451 <string name="anti_aliasing_smaa">å­åƒç´ å½¢æ€å­¦æŠ—锯齿</string>
353 452
354 <!-- Screen Layouts --> 453 <!-- Screen Layouts -->
355 <string name="screen_layout_landscape">横å‘大å±</string>
356 <string name="screen_layout_portrait">纵å‘å±å¹•</string>
357 <string name="screen_layout_auto">自动</string> 454 <string name="screen_layout_auto">自动</string>
455 <string name="screen_layout_sensor_landscape">ä¼ æ„Ÿå™¨æ–¹å‘æ¨ªå±</string>
456 <string name="screen_layout_landscape">横å±</string>
457 <string name="screen_layout_reverse_landscape">å呿¨ªå±</string>
458 <string name="screen_layout_sensor_portrait">传感器方å‘ç«–å±</string>
459 <string name="screen_layout_portrait">ç«–å±</string>
460 <string name="screen_layout_reverse_portrait">åå‘ç«–å±</string>
358 461
359 <!-- Aspect Ratios --> 462 <!-- Aspect Ratios -->
360 <string name="ratio_default">默认 (16:9)</string> 463 <string name="ratio_default">默认 (16:9)</string>
@@ -363,6 +466,10 @@
363 <string name="ratio_force_sixteen_ten">强制 16:10</string> 466 <string name="ratio_force_sixteen_ten">强制 16:10</string>
364 <string name="ratio_stretch">拉伸窗å£</string> 467 <string name="ratio_stretch">拉伸窗å£</string>
365 468
469 <!-- CPU Backend -->
470 <string name="cpu_backend_dynarmic">动æ€ç¼–译 (慢速)</string>
471 <string name="cpu_backend_nce">æœ¬æœºä»£ç æ‰§è¡Œ (NCE)</string>
472
366 <!-- CPU Accuracy --> 473 <!-- CPU Accuracy -->
367 <string name="cpu_accuracy_accurate">高精度</string> 474 <string name="cpu_accuracy_accurate">高精度</string>
368 <string name="cpu_accuracy_unsafe">低精度</string> 475 <string name="cpu_accuracy_unsafe">低精度</string>
@@ -391,8 +498,15 @@
391 <string name="theme_mode_dark">深色</string> 498 <string name="theme_mode_dark">深色</string>
392 499
393 <!-- Audio output engines --> 500 <!-- Audio output engines -->
501 <string name="oboe">oboe</string>
394 <string name="cubeb">cubeb</string> 502 <string name="cubeb">cubeb</string>
395 503
504 <!-- Anisotropic filtering options -->
505 <string name="multiplier_two">2x</string>
506 <string name="multiplier_four">4x</string>
507 <string name="multiplier_eight">8x</string>
508 <string name="multiplier_sixteen">16x</string>
509
396 <!-- Black backgrounds theme --> 510 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">使用黑色背景</string> 511 <string name="use_black_backgrounds">使用黑色背景</string>
398 <string name="use_black_backgrounds_description">使用深色主题时,套用黑色背景。</string> 512 <string name="use_black_backgrounds_description">使用深色主题时,套用黑色背景。</string>
diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml
index b8f468c68..d39255714 100644
--- a/src/android/app/src/main/res/values-zh-rTW/strings.xml
+++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml
@@ -34,12 +34,13 @@
34 <string name="empty_gamelist">找ä¸åˆ°æª”案,或者尚未é¸å–éŠæˆ²ç›®éŒ„。</string> 34 <string name="empty_gamelist">找ä¸åˆ°æª”案,或者尚未é¸å–éŠæˆ²ç›®éŒ„。</string>
35 <string name="search_and_filter_games">æœå°‹ä¸¦ç¯©é¸éŠæˆ²</string> 35 <string name="search_and_filter_games">æœå°‹ä¸¦ç¯©é¸éŠæˆ²</string>
36 <string name="select_games_folder">é¸å–éŠæˆ²è³‡æ–™å¤¾</string> 36 <string name="select_games_folder">é¸å–éŠæˆ²è³‡æ–™å¤¾</string>
37 <string name="manage_game_folders">管ç†éŠæˆ²è³‡æ–™å¤¾</string>
37 <string name="select_games_folder_description">å…許 yuzu å¡«å…¥éŠæˆ²æ¸…å–®</string> 38 <string name="select_games_folder_description">å…許 yuzu å¡«å…¥éŠæˆ²æ¸…å–®</string>
38 <string name="add_games_warning">è·³éŽé¸å–éŠæˆ²è³‡æ–™å¤¾ï¼Ÿ</string> 39 <string name="add_games_warning">è·³éŽé¸å–éŠæˆ²è³‡æ–™å¤¾ï¼Ÿ</string>
39 <string name="add_games_warning_description">如果資料夾未é¸å–ï¼ŒéŠæˆ²å°‡ä¸æœƒé¡¯ç¤ºåœ¨éŠæˆ²æ¸…單。</string> 40 <string name="add_games_warning_description">如果資料夾未é¸å–ï¼ŒéŠæˆ²å°‡ä¸æœƒé¡¯ç¤ºåœ¨éŠæˆ²æ¸…單。</string>
40 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string> 41 <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
41 <string name="home_search_games">æœå°‹éŠæˆ²</string> 42 <string name="home_search_games">æœå°‹éŠæˆ²</string>
42 <string name="search_settings">æœç´¢è®¾ç½®</string> 43 <string name="search_settings">æœå°‹è¨­å®š</string>
43 <string name="games_dir_selected">éŠæˆ²ç›®éŒ„å·²é¸å–</string> 44 <string name="games_dir_selected">éŠæˆ²ç›®éŒ„å·²é¸å–</string>
44 <string name="install_prod_keys">å®‰è£ prod.keys</string> 45 <string name="install_prod_keys">å®‰è£ prod.keys</string>
45 <string name="install_prod_keys_description">需è¦è§£å¯†é›¶å”®éŠæˆ²</string> 46 <string name="install_prod_keys_description">需è¦è§£å¯†é›¶å”®éŠæˆ²</string>
@@ -68,10 +69,11 @@
68 <string name="invalid_keys_error">無效的加密金鑰</string> 69 <string name="invalid_keys_error">無效的加密金鑰</string>
69 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> 70 <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
70 <string name="install_keys_failure_description">é¸å–çš„æª”æ¡ˆä¸æ­£ç¢ºæˆ–å·²ææ¯€ï¼Œè«‹é‡æ–°å‚¾å°æ‚¨çš„金鑰。</string> 71 <string name="install_keys_failure_description">é¸å–çš„æª”æ¡ˆä¸æ­£ç¢ºæˆ–å·²ææ¯€ï¼Œè«‹é‡æ–°å‚¾å°æ‚¨çš„金鑰。</string>
72 <string name="gpu_driver_manager">GPU 驅動程å¼ç®¡ç†å“¡</string>
71 <string name="install_gpu_driver">å®‰è£ GPU 驅動程å¼</string> 73 <string name="install_gpu_driver">å®‰è£ GPU 驅動程å¼</string>
72 <string name="install_gpu_driver_description">å®‰è£æ›¿ä»£é©…動程å¼ä»¥å–得潛在的更佳效能或準確度</string> 74 <string name="install_gpu_driver_description">å®‰è£æ›¿ä»£é©…動程å¼ä»¥å–得潛在的更佳效能或準確度</string>
73 <string name="advanced_settings">進階設定</string> 75 <string name="advanced_settings">進階設定</string>
74 <string name="advanced_settings_game">高级é项: %1$s</string> 76 <string name="advanced_settings_game">進階設定:%1$s</string>
75 <string name="settings_description">進行模擬器設定</string> 77 <string name="settings_description">進行模擬器設定</string>
76 <string name="search_recently_played">最近éŠçŽ©</string> 78 <string name="search_recently_played">最近éŠçŽ©</string>
77 <string name="search_recently_added">最近新增</string> 79 <string name="search_recently_added">最近新增</string>
@@ -85,7 +87,11 @@
85 <string name="notification_no_directory_link_description">請使用檔案管ç†å“¡çš„å´é‚Šé¢æ¿æ‰‹å‹•定ä½åˆ°ä½¿ç”¨è€…資料夾。</string> 87 <string name="notification_no_directory_link_description">請使用檔案管ç†å“¡çš„å´é‚Šé¢æ¿æ‰‹å‹•定ä½åˆ°ä½¿ç”¨è€…資料夾。</string>
86 <string name="manage_save_data">管ç†å„²å­˜è³‡æ–™</string> 88 <string name="manage_save_data">管ç†å„²å­˜è³‡æ–™</string>
87 <string name="manage_save_data_description">已找到儲存資料,請é¸å–下方的é¸é …。</string> 89 <string name="manage_save_data_description">已找到儲存資料,請é¸å–下方的é¸é …。</string>
90 <string name="import_save_warning">匯入儲存資料</string>
91 <string name="import_save_warning_description">這將會以æä¾›çš„æª”æ¡ˆè¦†å¯«æ‰€æœ‰ç¾æœ‰çš„儲存資料,您確定è¦ç¹¼çºŒå—Žï¼Ÿ</string>
88 <string name="import_export_saves_description">匯入或匯出儲存檔案</string> 92 <string name="import_export_saves_description">匯入或匯出儲存檔案</string>
93 <string name="save_files_importing">正在匯入儲存檔案…</string>
94 <string name="save_files_exporting">正在匯出儲存檔案…</string>
89 <string name="save_file_imported_success">å·²æˆåŠŸåŒ¯å…¥</string> 95 <string name="save_file_imported_success">å·²æˆåŠŸåŒ¯å…¥</string>
90 <string name="save_file_invalid_zip_structure">ç„¡æ•ˆçš„å„²å­˜ç›®éŒ„çµæ§‹</string> 96 <string name="save_file_invalid_zip_structure">ç„¡æ•ˆçš„å„²å­˜ç›®éŒ„çµæ§‹</string>
91 <string name="save_file_invalid_zip_structure_description">首個å­è³‡æ–™å¤¾åç¨±å¿…é ˆç‚ºéŠæˆ²æ¨™é¡Œ ID。</string> 97 <string name="save_file_invalid_zip_structure_description">首個å­è³‡æ–™å¤¾åç¨±å¿…é ˆç‚ºéŠæˆ²æ¨™é¡Œ ID。</string>
@@ -96,28 +102,58 @@
96 <string name="firmware_installing">正在安è£éŸŒé«”</string> 102 <string name="firmware_installing">正在安è£éŸŒé«”</string>
97 <string name="firmware_installed_success">韌體已æˆåŠŸå®‰è£</string> 103 <string name="firmware_installed_success">韌體已æˆåŠŸå®‰è£</string>
98 <string name="firmware_installed_failure">韌體安è£å¤±æ•—</string> 104 <string name="firmware_installed_failure">韌體安è£å¤±æ•—</string>
99 <string name="firmware_installed_failure_description">请确ä¿å›ºä»¶ nca 文件ä½äºŽ zip 压缩包的根目录,然åŽé‡è¯•。</string> 105 <string name="firmware_installed_failure_description">請確ä¿éŸŒé«” nca æª”æ¡ˆä½æ–¼ zip 壓縮檔的根目錄,然後å†è©¦ä¸€æ¬¡ã€‚</string>
100 <string name="share_log">分享åµéŒ¯è¨˜éŒ„</string> 106 <string name="share_log">分享åµéŒ¯è¨˜éŒ„</string>
101 <string name="share_log_description">分享 yuzu 的記錄檔以便å°ç›¸é—œå•題進行åµéŒ¯</string> 107 <string name="share_log_description">分享 yuzu 的記錄檔以便å°ç›¸é—œå•題進行åµéŒ¯</string>
102 <string name="share_log_missing">找ä¸åˆ°è¨˜éŒ„檔</string> 108 <string name="share_log_missing">找ä¸åˆ°è¨˜éŒ„檔</string>
103 <string name="install_game_content">安è£éŠæˆ²å…§å®¹</string> 109 <string name="install_game_content">安è£éŠæˆ²å…§å®¹</string>
104 <string name="install_game_content_description">安è£éŠæˆ²æ›´æ–°æˆ– DLC</string> 110 <string name="install_game_content_description">安è£éŠæˆ²æ›´æ–°æˆ– DLC</string>
105 <string name="installing_game_content">安装中...</string> 111 <string name="installing_game_content">正在安è£å§å®¹â€¦</string>
106 <string name="install_game_content_failure">å‘ NAND å®‰è£æä»¶æ—¶å¤±è´¥</string> 112 <string name="install_game_content_failure">å®‰è£æª”æ¡ˆè³ NAND 時發生錯誤</string>
107 <string name="install_game_content_failure_description">请确ä¿é™„加内容的有效性,并且 prod.keys 密钥文件已安装。</string> 113 <string name="install_game_content_failure_description">請確ä¿å…§å®¹æœ‰æ•ˆä¸¦ä¸” prod.keys 檔案已安è£ã€‚</string>
108 <string name="install_game_content_failure_base">为é¿å…产生冲çªï¼Œæ­¤åŠŸèƒ½ä¸èƒ½ç”¨äºŽå®‰è£…æ¸¸æˆæœ¬ä½“。</string> 114 <string name="install_game_content_failure_base">為é¿å…å¯èƒ½çš„è¡çªï¼Œä¸å…許安è£åŸºç¤ŽéŠæˆ²ã€‚</string>
109 <string name="install_game_content_failure_file_extension">åªæœ‰ NSP 或 XCI æ ¼å¼çš„附加内容å¯ä»¥å®‰è£…ã€‚è¯·ç¡®ä¿æ‚¨çš„æ¸¸æˆé™„加内容是有效的。</string> 115 <string name="install_game_content_failure_file_extension">åƒ…æ”¯æ´ NSP å’Œ XCI å…§å®¹ï¼Œè«‹é©—è­‰éŠæˆ²å…§å®¹æ˜¯å¦æœ‰æ•ˆã€‚</string>
110 <string name="install_game_content_failed_count">%1$d 安装出错</string> 116 <string name="install_game_content_failed_count">%1$d 安è£éŒ¯èª¤</string>
111 <string name="install_game_content_success">游æˆé™„加å…容已æˆåŠŸå®‰è£</string> 117 <string name="install_game_content_success">éŠæˆ²å…§å®¹å·²æˆåŠŸå®‰è£</string>
112 <string name="install_game_content_success_install">%1$d å®‰è£æˆåŠŸ</string> 118 <string name="install_game_content_success_install">%1$d å®‰è£æˆåŠŸ</string>
113 <string name="install_game_content_success_overwrite">%1$d 覆盖安装æˆåŠŸ</string> 119 <string name="install_game_content_success_overwrite">%1$d 覆寫æˆåŠŸ</string>
114 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string> 120 <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
115 <string name="custom_driver_not_supported">䏿”¯æŒè‡ªå®šä¹‰é©±åЍ</string> 121 <string name="custom_driver_not_supported">䏿”¯æ´è‡ªè¨‚的驅動程å¼</string>
116 <string name="custom_driver_not_supported_description">æ­¤è®¾å¤‡ä¸æ”¯æŒè‡ªå®šä¹‰é©±åŠ¨ã€‚\n请之åŽå†è®¿é—®æ­¤é¡¹ï¼ŒæŸ¥çœ‹æ˜¯å¦å·²ä¸ºæ­¤è®¾å¤‡æ·»åŠ æ”¯æŒã€‚</string> 122 <string name="custom_driver_not_supported_description">æ­¤è£ç½®ä¸æ”¯æ´è‡ªè¨‚的驅動程å¼ã€‚\n請以後å†ä¾†æŸ¥çœ‹æ˜¯å¦å·²æ–°å¢žæ”¯æ´ï¼</string>
117 <string name="manage_yuzu_data">ç®¡ç† yuzu æ•°æ®</string> 123 <string name="manage_yuzu_data">ç®¡ç† yuzu 資料</string>
118 <string name="manage_yuzu_data_description">导入/导出固件ã€å¯†é’¥ã€ç”¨æˆ·æ•°æ®åŠå…¶ä»–。</string> 124 <string name="manage_yuzu_data_description">匯入/匯出韌體ã€é‡‘é‘°ã€ä½¿ç”¨è€…資料åŠå…¶ä»–é …ç›®ï¼</string>
119 <string name="share_save_file">分享存档文件</string> 125 <string name="share_save_file">分享儲存檔案</string>
120 <string name="export_save_failed">导出存档文件失败</string> 126 <string name="export_save_failed">無法匯出儲存檔案</string>
127 <string name="game_folders">éŠæˆ²è³‡æ–™å¤¾</string>
128 <string name="deep_scan">深度掃æ</string>
129 <string name="add_game_folder">æ–°å¢žéŠæˆ²è³‡æ–™å¤¾</string>
130 <string name="folder_already_added">這個資料夾已經新增éŽäº†ï¼</string>
131 <string name="game_folder_properties">éŠæˆ²è³‡æ–™å¤¾å±¬æ€§</string>
132 <plurals name="saves_import_failed">
133 <item quantity="other">%d 个存档导入失败</item>
134 </plurals>
135 <plurals name="saves_import_success">
136 <item quantity="other">æˆåŠŸå¯¼å…¥ %d 个存档</item>
137 </plurals>
138 <string name="no_save_data_found">未找到存档数æ®</string>
139
140 <!-- Applet launcher strings -->
141 <string name="applets">å°ç¨‹å¼å•Ÿå‹•器</string>
142 <string name="applets_description">使用已安è£çš„韌體啟動系統å°ç¨‹å¼</string>
143 <string name="applets_error_firmware">未安è£éŸŒé«”</string>
144 <string name="applets_error_applet">無法使用å°ç¨‹å¼</string>
145 <string name="applets_error_description"><![CDATA[è«‹ç¢ºä¿æ‚¨çš„ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 檔案和<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-system-firmware\">韌體</a>已安è£ï¼Œç„¶å¾Œå†è©¦ä¸€æ¬¡ã€‚]]></string>
146 <string name="album_applet">相簿</string>
147 <string name="album_applet_description">使用系統相片檢視器查看儲存在使用者螢幕截圖資料夾中的影åƒ</string>
148 <string name="mii_edit_applet">Mii 編輯</string>
149 <string name="mii_edit_applet_description">使用系統編輯器來檢視並編輯 Mii</string>
150 <string name="cabinet_applet">Cabinet</string>
151 <string name="cabinet_applet_description">編輯ã€åˆªé™¤å„²å­˜åœ¨ amiibo 上的資料</string>
152 <string name="cabinet_launcher">Cabinet 啟動器</string>
153 <string name="cabinet_nickname_and_owner">æš±ç¨±å’Œæ“æœ‰è€…設定</string>
154 <string name="cabinet_game_data_eraser">éŠæˆ²è³‡æ–™æ©¡ç𮿓¦</string>
155 <string name="cabinet_restorer">還原程å¼</string>
156 <string name="cabinet_formatter">æ ¼å¼å™¨</string>
121 157
122 <!-- About screen strings --> 158 <!-- About screen strings -->
123 <string name="gaia_is_not_real">Gaia ä¸çœŸå¯¦</string> 159 <string name="gaia_is_not_real">Gaia ä¸çœŸå¯¦</string>
@@ -128,16 +164,16 @@
128 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string> 164 <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
129 <string name="licenses_description">這些專案使 yuzu Android 版æˆç‚ºå¯èƒ½</string> 165 <string name="licenses_description">這些專案使 yuzu Android 版æˆç‚ºå¯èƒ½</string>
130 <string name="build">組建</string> 166 <string name="build">組建</string>
131 <string name="user_data">用户数æ®</string> 167 <string name="user_data">使用者資料</string>
132 <string name="user_data_description">导入/å¯¼å‡ºåº”ç”¨ç¨‹åºæ‰€æœ‰æ•°æ®ã€‚\n\nå¯¼å…¥ç”¨æˆ·æ•°æ®æ—¶ï¼Œå°†åˆ é™¤å½“剿‰€æœ‰çš„用户数æ®ï¼</string> 168 <string name="user_data_description">匯入/匯出所有應用程å¼è³‡æ–™ã€‚\n\nåŒ¯å…¥ä½¿ç”¨è€…è³‡æ–™æ™‚ï¼Œç¾æœ‰çš„使用者資料將被刪除ï¼</string>
133 <string name="exporting_user_data">正在导出用户数æ®...</string> 169 <string name="exporting_user_data">正在匯出使用者資料…</string>
134 <string name="importing_user_data">正在导入用户数æ®...</string> 170 <string name="importing_user_data">正在匯入使用者資料…</string>
135 <string name="import_user_data">导入用户数æ®</string> 171 <string name="import_user_data">匯入使用者資料</string>
136 <string name="invalid_yuzu_backup">无效的 yuzu 备份</string> 172 <string name="invalid_yuzu_backup">無效的 yuzu 備份</string>
137 <string name="user_data_export_success">å¯¼å‡ºç”¨æˆ·æ•°æ®æˆåŠŸ</string> 173 <string name="user_data_export_success">使用者資料匯出æˆåŠŸ</string>
138 <string name="user_data_import_success">å¯¼å…¥ç”¨æˆ·æ•°æ®æˆåŠŸ</string> 174 <string name="user_data_import_success">使用者資料匯入æˆåŠŸ</string>
139 <string name="user_data_export_cancelled">已喿¶ˆå¯¼å‡ºæ•°æ®</string> 175 <string name="user_data_export_cancelled">åŒ¯å‡ºå·²å–æ¶ˆ</string>
140 <string name="user_data_import_failed_description">请确ä¿ç”¨æˆ·æ•°æ®æ–‡ä»¶å¤¹ä½äºŽ zip 压缩包的根目录,并在 config/config.ini 路径中包å«é…置文件,然åŽé‡è¯•。</string> 176 <string name="user_data_import_failed_description">請確ä¿ä½¿ç”¨è€…è³‡æ–™å¤¾ä½æ–¼ zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包å«çµ„態檔案,並å†è©¦ä¸€æ¬¡ã€‚</string>
141 <string name="support_link">https://discord.gg/u77vRWY</string> 177 <string name="support_link">https://discord.gg/u77vRWY</string>
142 <string name="website_link">https://yuzu-emu.org/</string> 178 <string name="website_link">https://yuzu-emu.org/</string>
143 <string name="github_link">https://github.com/yuzu-emu</string> 179 <string name="github_link">https://github.com/yuzu-emu</string>
@@ -161,6 +197,7 @@
161 <string name="frame_limit_enable_description">將模擬速度é™åˆ¶åœ¨æ¨™æº–速度的指定百分比。</string> 197 <string name="frame_limit_enable_description">將模擬速度é™åˆ¶åœ¨æ¨™æº–速度的指定百分比。</string>
162 <string name="frame_limit_slider">é™åˆ¶é€Ÿåº¦ç™¾åˆ†æ¯”</string> 198 <string name="frame_limit_slider">é™åˆ¶é€Ÿåº¦ç™¾åˆ†æ¯”</string>
163 <string name="frame_limit_slider_description">指定é™åˆ¶æ¨¡æ“¬é€Ÿåº¦çš„百分比。100% 為標準速度,更高或更低的值將會增加或減少速度é™åˆ¶ã€‚</string> 199 <string name="frame_limit_slider_description">指定é™åˆ¶æ¨¡æ“¬é€Ÿåº¦çš„百分比。100% 為標準速度,更高或更低的值將會增加或減少速度é™åˆ¶ã€‚</string>
200 <string name="cpu_backend">CPU 後端</string>
164 <string name="cpu_accuracy">CPU 準確度</string> 201 <string name="cpu_accuracy">CPU 準確度</string>
165 <string name="value_with_units">%1$s%2$s</string> 202 <string name="value_with_units">%1$s%2$s</string>
166 203
@@ -179,7 +216,7 @@
179 <string name="renderer_accuracy">準確度層級</string> 216 <string name="renderer_accuracy">準確度層級</string>
180 <string name="renderer_resolution">è§£æžåº¦ (手æ/底座)</string> 217 <string name="renderer_resolution">è§£æžåº¦ (手æ/底座)</string>
181 <string name="renderer_vsync">VSync 模å¼</string> 218 <string name="renderer_vsync">VSync 模å¼</string>
182 <string name="renderer_screen_layout">å±å¹•æ–¹å‘</string> 219 <string name="renderer_screen_layout">æ–¹å‘</string>
183 <string name="renderer_aspect_ratio">長寬比</string> 220 <string name="renderer_aspect_ratio">長寬比</string>
184 <string name="renderer_scaling_filter">è¦–çª—é©æ‡‰éŽæ¿¾å™¨</string> 221 <string name="renderer_scaling_filter">è¦–çª—é©æ‡‰éŽæ¿¾å™¨</string>
185 <string name="renderer_anti_aliasing">消除鋸齒方法</string> 222 <string name="renderer_anti_aliasing">消除鋸齒方法</string>
@@ -191,11 +228,13 @@
191 <string name="renderer_reactive_flushing_description">çŠ§ç‰²æ•ˆèƒ½ï¼Œä»¥æ”¹å–„éƒ¨åˆ†éŠæˆ²çš„轉譯準確度。</string> 228 <string name="renderer_reactive_flushing_description">çŠ§ç‰²æ•ˆèƒ½ï¼Œä»¥æ”¹å–„éƒ¨åˆ†éŠæˆ²çš„轉譯準確度。</string>
192 <string name="use_disk_shader_cache">ç£ç¢Ÿè‘—色器快å–</string> 229 <string name="use_disk_shader_cache">ç£ç¢Ÿè‘—色器快å–</string>
193 <string name="use_disk_shader_cache_description">é€éŽå°‡ç”¢ç”Ÿçš„著色器儲存並載入至ç£ç¢Ÿï¼Œæ¸›å°‘中斷。</string> 230 <string name="use_disk_shader_cache_description">é€éŽå°‡ç”¢ç”Ÿçš„著色器儲存並載入至ç£ç¢Ÿï¼Œæ¸›å°‘中斷。</string>
231 <string name="anisotropic_filtering">éžç­‰å‘æ€§éŽæ¿¾</string>
232 <string name="anisotropic_filtering_description">改善斜角檢視時的紋ç†å“質</string>
194 233
195 <!-- Debug settings strings --> 234 <!-- Debug settings strings -->
196 <string name="cpu">CPU</string> 235 <string name="cpu">CPU</string>
197 <string name="cpu_debug_mode">CPU è°ƒè¯</string> 236 <string name="cpu_debug_mode">CPU åµéŒ¯</string>
198 <string name="cpu_debug_mode_description">å° CPU è®¾ç½®ä¸ºè¾ƒæ…¢çš„è°ƒè¯æ¨¡å¼ã€‚</string> 237 <string name="cpu_debug_mode_description">å° CPU è¨­å®šçºæ…¢é€ŸåµéŒ¯æ¨¡å¼ã€‚</string>
199 <string name="gpu">GPU</string> 238 <string name="gpu">GPU</string>
200 <string name="renderer_api">API</string> 239 <string name="renderer_api">API</string>
201 <string name="renderer_debug">圖形åµéŒ¯</string> 240 <string name="renderer_debug">圖形åµéŒ¯</string>
@@ -203,7 +242,7 @@
203 <string name="fastmem">Fastmem</string> 242 <string name="fastmem">Fastmem</string>
204 243
205 <!-- Audio settings strings --> 244 <!-- Audio settings strings -->
206 <string name="audio_output_engine">输出引擎</string> 245 <string name="audio_output_engine">輸出引擎</string>
207 <string name="audio_volume">音é‡</string> 246 <string name="audio_volume">音é‡</string>
208 <string name="audio_volume_description">指定音訊輸出音é‡ã€‚</string> 247 <string name="audio_volume_description">指定音訊輸出音é‡ã€‚</string>
209 248
@@ -212,11 +251,12 @@
212 <string name="ini_saved">已儲存設定</string> 251 <string name="ini_saved">已儲存設定</string>
213 <string name="gameid_saved">已儲存 %1$s 設定</string> 252 <string name="gameid_saved">已儲存 %1$s 設定</string>
214 <string name="error_saving">儲存 %1$s 時發生錯誤 ini: %2$s</string> 253 <string name="error_saving">儲存 %1$s 時發生錯誤 ini: %2$s</string>
215 <string name="unimplemented_menu">未生效èœå</string> 254 <string name="unimplemented_menu">未實作的é¸å–®</string>
216 <string name="loading">正在載入…</string> 255 <string name="loading">正在載入…</string>
217 <string name="shutting_down">正在关闭…</string> 256 <string name="shutting_down">正在關閉…</string>
218 <string name="reset_setting_confirmation">è¦å°‡æ­¤è¨­å®šé‡è¨­å›žé è¨­å€¼å—Žï¼Ÿ</string> 257 <string name="reset_setting_confirmation">è¦å°‡æ­¤è¨­å®šé‡è¨­å›žé è¨­å€¼å—Žï¼Ÿ</string>
219 <string name="reset_to_default">é‡è¨­ç‚ºé è¨­å€¼</string> 258 <string name="reset_to_default">é‡è¨­ç‚ºé è¨­å€¼</string>
259 <string name="reset_to_default_description">é‡è¨­æ‰€æœ‰é€²éšŽè¨­å®š</string>
220 <string name="reset_all_settings">é‡è¨­æ‰€æœ‰è¨­å®šï¼Ÿ</string> 260 <string name="reset_all_settings">é‡è¨­æ‰€æœ‰è¨­å®šï¼Ÿ</string>
221 <string name="reset_all_settings_description">所有進階設定將被é‡è¨­ç‚ºé è¨­çµ„態,此動作無法復原。</string> 261 <string name="reset_all_settings_description">所有進階設定將被é‡è¨­ç‚ºé è¨­çµ„態,此動作無法復原。</string>
222 <string name="settings_reset">設定已é‡è¨­</string> 262 <string name="settings_reset">設定已é‡è¨­</string>
@@ -227,9 +267,21 @@
227 <string name="string_null">ç„¡</string> 267 <string name="string_null">ç„¡</string>
228 <string name="string_import">匯入</string> 268 <string name="string_import">匯入</string>
229 <string name="export">匯出</string> 269 <string name="export">匯出</string>
230 <string name="export_failed">导出失败</string> 270 <string name="export_failed">匯出失敗</string>
231 <string name="import_failed">导入失败</string> 271 <string name="import_failed">匯入失敗</string>
232 <string name="cancelling">å–æ¶ˆä¸­</string> 272 <string name="cancelling">æ­£åœ¨å–æ¶ˆ</string>
273 <string name="install">安è£</string>
274 <string name="delete">刪除</string>
275 <string name="edit">編輯</string>
276 <string name="export_success">å·²æˆåŠŸåŒ¯å‡º</string>
277 <string name="start">é–‹å§‹</string>
278 <string name="clear">清除</string>
279 <string name="global">全域</string>
280 <string name="custom">自定义</string>
281 <string name="notice">通知</string>
282 <string name="import_complete">导入完æˆ</string>
283 <string name="more_options">更多选项</string>
284 <string name="use_global_setting">使用全局设置</string>
233 285
234 <!-- GPU driver installation --> 286 <!-- GPU driver installation -->
235 <string name="select_gpu_driver">é¸å– GPU 驅動程å¼</string> 287 <string name="select_gpu_driver">é¸å– GPU 驅動程å¼</string>
@@ -237,7 +289,8 @@
237 <string name="select_gpu_driver_install">安è£</string> 289 <string name="select_gpu_driver_install">安è£</string>
238 <string name="select_gpu_driver_default">é è¨­</string> 290 <string name="select_gpu_driver_default">é è¨­</string>
239 <string name="select_gpu_driver_use_default">使用é è¨­ GPU 驅動程å¼</string> 291 <string name="select_gpu_driver_use_default">使用é è¨­ GPU 驅動程å¼</string>
240 <string name="select_gpu_driver_error">é¸å–的驅動程å¼ç„¡æ•ˆï¼Œå°‡ä½¿ç”¨ç³»çµ±é è¨­é©…動程å¼ï¼</string> 292 <string name="select_gpu_driver_error">é¸å–的驅動程å¼ç„¡æ•ˆ</string>
293 <string name="driver_already_installed">驅動程å¼å·²å®‰è£</string>
241 <string name="system_gpu_driver">系統 GPU 驅動程å¼</string> 294 <string name="system_gpu_driver">系統 GPU 驅動程å¼</string>
242 <string name="installing_driver">正在安è£é©…動程å¼â€¦</string> 295 <string name="installing_driver">正在安è£é©…動程å¼â€¦</string>
243 296
@@ -245,14 +298,58 @@
245 <string name="preferences_settings">設定</string> 298 <string name="preferences_settings">設定</string>
246 <string name="preferences_general">一般</string> 299 <string name="preferences_general">一般</string>
247 <string name="preferences_system">系統</string> 300 <string name="preferences_system">系統</string>
301 <string name="preferences_system_description">底座模å¼ã€å€åŸŸåŠèªžè¨€</string>
248 <string name="preferences_graphics">圖形</string> 302 <string name="preferences_graphics">圖形</string>
303 <string name="preferences_graphics_description">準確度層級ã€è§£æžåº¦åŠè‘—色器快å–</string>
249 <string name="preferences_audio">音訊</string> 304 <string name="preferences_audio">音訊</string>
305 <string name="preferences_audio_description">輸出引擎åŠéŸ³é‡</string>
250 <string name="preferences_theme">主題和色彩</string> 306 <string name="preferences_theme">主題和色彩</string>
251 <string name="preferences_debug">åµéŒ¯</string> 307 <string name="preferences_debug">åµéŒ¯</string>
308 <string name="preferences_debug_description">CPU/GPU åµéŒ¯ã€åœ–å½¢ API åŠ fastmem</string>
309
310 <!-- Game properties -->
311 <string name="info">資訊</string>
312 <string name="info_description">ç¨‹å¼ IDã€é–‹ç™¼äººå“¡åŠç‰ˆæœ¬è³‡è¨Š</string>
313 <string name="per_game_settings">å€‹åˆ¥éŠæˆ²è¨­å®š</string>
314 <string name="per_game_settings_description">ç·¨è¼¯æ­¤éŠæˆ²çš„特定設定</string>
315 <string name="launch_options">啟動組態</string>
316 <string name="path">路徑</string>
317 <string name="program_id">ç¨‹å¼ ID</string>
318 <string name="developer">出版商</string>
319 <string name="version">版本</string>
320 <string name="copy_details">複製詳細資料</string>
321 <string name="add_ons">延伸模組</string>
322 <string name="add_ons_description">åˆ‡æ›æ¨¡çµ„ã€æ›´æ–°åŠ DLC</string>
323 <string name="clear_shader_cache">清除著色器快å–</string>
324 <string name="clear_shader_cache_description">éŠçŽ©æ­¤éŠæˆ²æ™‚移除所有著色器組建</string>
325 <string name="clear_shader_cache_warning_description">由於著色器快å–çš„é‡æ–°ç”¢ç”Ÿï¼Œæ‚¨å¯èƒ½æœƒæ„Ÿåˆ°ä¸å¤ªé †æš¢</string>
326 <string name="cleared_shaders_successfully">著色器快å–å·²æˆåŠŸæ¸…é™¤</string>
327 <string name="addons_game">附加元件:%1$s</string>
328 <string name="save_data">儲存資料</string>
329 <string name="save_data_description">ç®¡ç†æ­¤éŠæˆ²ç‰¹å®šçš„儲存資料</string>
330 <string name="delete_save_data">刪除儲存資料</string>
331 <string name="delete_save_data_description">ç§»é™¤æ­¤éŠæˆ²ç‰¹å®šçš„æ‰€æœ‰å„²å­˜è³‡æ–™</string>
332 <string name="delete_save_data_warning_description">é€™å°‡æœƒç§»é™¤æ­¤éŠæˆ²çš„æ‰€æœ‰å„²å­˜è³‡æ–™ï¼Œä¸”無法復原,您確定è¦ç¹¼çºŒå—Žï¼Ÿ</string>
333 <string name="save_data_deleted_successfully">儲存資料已æˆåŠŸåˆªé™¤</string>
334 <string name="select_content_type">內容類型</string>
335 <string name="updates_and_dlc">æ›´æ–°åŠ DLC</string>
336 <string name="mods_and_cheats">模組åŠå¯†æŠ€</string>
337 <string name="addon_notice">é‡è¦çš„˙附加元件通知</string>
338 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
339 <string name="addon_notice_description">è‹¥è¦å®‰è£æ¨¡çµ„åŠå¯†æŠ€ï¼Œæ‚¨å¿…é ˆé¸å–ä¸€å€‹åŒ…å« cheats/ã€romfs/ 或 exefs/ 的目錄。我們無法驗證這些內容是å¦èˆ‡æ‚¨çš„éŠæˆ²ç›¸å®¹ï¼Œæ‰€ä»¥è«‹å°å¿ƒä½œæ¥­ï¼</string>
340 <string name="invalid_directory">無效的目錄</string>
341 <!-- "cheats/" "romfs/" and "exefs/ should not be translated -->
342 <string name="invalid_directory_description">è«‹ç¢ºä¿æ‚¨é¸å–çš„ç›®éŒ„åŒ…å« cheats/ã€romfs/ 或 exefs/ 資料夾,然後å†è©¦ä¸€æ¬¡ã€‚</string>
343 <string name="addon_installed_successfully">附加元件已æˆåŠŸå®‰è£</string>
344 <string name="verifying_content">正在驗證內容…</string>
345 <string name="content_install_notice">內容安è£é€šçŸ¥</string>
346 <string name="content_install_notice_description">您é¸å–çš„å…§å®¹èˆ‡æ­¤éŠæˆ²ä¸ç›¸ç¬¦ã€‚\nä»è¦ç¹¼çºŒå®‰è£å—Žï¼Ÿ</string>
347 <string name="confirm_uninstall">确认å¸è½½</string>
348 <string name="confirm_uninstall_description">您确定è¦å¸è½½æ­¤é™„加项å—?</string>
252 349
253 <!-- ROM loading errors --> 350 <!-- ROM loading errors -->
254 <string name="loader_error_encrypted">您的 ROM 已加密</string> 351 <string name="loader_error_encrypted">您的 ROM 已加密</string>
255 <string name="loader_error_encrypted_roms_description"><![CDATA[请按照指å—釿–°è½¬å‚¨æ‚¨çš„<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">游æˆå¡å¸¦</a>或<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">已安装的游æˆ</a>。]]></string> 352 <string name="loader_error_encrypted_roms_description"><![CDATA[è«‹ä¾å¾ªæŒ‡å—釿–°å‚¾å°æ‚¨çš„<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards\">éŠæˆ²å¡åŒ£</a>或<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop\">已安è£çš„éŠæˆ²</a>。]]></string>
256 <string name="loader_error_encrypted_keys_description"><![CDATA[è«‹ç¢ºä¿æ‚¨çš„ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 檔案已安è£ï¼Œè®“éŠæˆ²å¯ä»¥è§£å¯†ã€‚]]></string> 353 <string name="loader_error_encrypted_keys_description"><![CDATA[è«‹ç¢ºä¿æ‚¨çš„ <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 檔案已安è£ï¼Œè®“éŠæˆ²å¯ä»¥è§£å¯†ã€‚]]></string>
257 <string name="loader_error_video_core">åˆå§‹åŒ–視訊核心時發生錯誤</string> 354 <string name="loader_error_video_core">åˆå§‹åŒ–視訊核心時發生錯誤</string>
258 <string name="loader_error_video_core_description">這經常由ä¸ç›¸å®¹çš„ GPU 驅動程å¼é€ æˆï¼Œå®‰è£è‡ªè¨‚ GPU 驅動程å¼å¯èƒ½æœƒè§£æ±ºæ­¤å•題。</string> 355 <string name="loader_error_video_core_description">這經常由ä¸ç›¸å®¹çš„ GPU 驅動程å¼é€ æˆï¼Œå®‰è£è‡ªè¨‚ GPU 驅動程å¼å¯èƒ½æœƒè§£æ±ºæ­¤å•題。</string>
@@ -277,6 +374,7 @@
277 <string name="emulation_pause">æš«åœæ¨¡æ“¬</string> 374 <string name="emulation_pause">æš«åœæ¨¡æ“¬</string>
278 <string name="emulation_unpause">å–æ¶ˆæš«åœæ¨¡æ“¬</string> 375 <string name="emulation_unpause">å–æ¶ˆæš«åœæ¨¡æ“¬</string>
279 <string name="emulation_input_overlay">覆疊é¸é …</string> 376 <string name="emulation_input_overlay">覆疊é¸é …</string>
377 <string name="touchscreen">觸控螢幕</string>
280 378
281 <string name="load_settings">正在載入設定…</string> 379 <string name="load_settings">正在載入設定…</string>
282 380
@@ -293,9 +391,9 @@
293 <string name="fatal_error">åš´é‡éŒ¯èª¤</string> 391 <string name="fatal_error">åš´é‡éŒ¯èª¤</string>
294 <string name="fatal_error_message">發生嚴é‡éŒ¯èª¤ï¼Œæª¢æŸ¥è¨˜éŒ„以å–得詳細資訊。\n繼續模擬å¯èƒ½æœƒé€ æˆç•¶æ©Ÿå’ŒéŒ¯èª¤ã€‚</string> 392 <string name="fatal_error_message">發生嚴é‡éŒ¯èª¤ï¼Œæª¢æŸ¥è¨˜éŒ„以å–得詳細資訊。\n繼續模擬å¯èƒ½æœƒé€ æˆç•¶æ©Ÿå’ŒéŒ¯èª¤ã€‚</string>
295 <string name="performance_warning">關閉此設定會顯著é™ä½Žæ¨¡æ“¬æ•ˆèƒ½ï¼å¦‚éœ€æœ€ä½³é«”é©—ï¼Œå»ºè­°æ‚¨å°‡æ­¤è¨­å®šä¿æŒç‚ºå•Ÿç”¨ç‹€æ…‹ã€‚</string> 393 <string name="performance_warning">關閉此設定會顯著é™ä½Žæ¨¡æ“¬æ•ˆèƒ½ï¼å¦‚éœ€æœ€ä½³é«”é©—ï¼Œå»ºè­°æ‚¨å°‡æ­¤è¨­å®šä¿æŒç‚ºå•Ÿç”¨ç‹€æ…‹ã€‚</string>
296 <string name="device_memory_inadequate">设备 RAM: %1$s\n推è RAM: %2$s</string> 394 <string name="device_memory_inadequate">è£ç½® RAM: %1$s\n建議 RAM: %2$s</string>
297 <string name="memory_formatted">%1$s%2$s</string> 395 <string name="memory_formatted">%1$s%2$s</string>
298 <string name="no_game_present">当剿²¡æœ‰å¯å¯åŠ¨çš„æ¸¸æˆï¼</string> 396 <string name="no_game_present">ç›®å‰æ²æœ‰å¯å•Ÿå‹•çš„éŠæˆ²ï¼</string>
299 397
300 <!-- Region Names --> 398 <!-- Region Names -->
301 <string name="region_japan">日本</string> 399 <string name="region_japan">日本</string>
@@ -308,9 +406,10 @@
308 406
309 <!-- Memory Sizes --> 407 <!-- Memory Sizes -->
310 <string name="memory_byte">Byte</string> 408 <string name="memory_byte">Byte</string>
409 <string name="memory_byte_shorthand">B</string>
311 <string name="memory_kilobyte">KB</string> 410 <string name="memory_kilobyte">KB</string>
312 <string name="memory_megabyte">MB</string> 411 <string name="memory_megabyte">MB</string>
313 <string name="memory_gigabyte">英國</string> 412 <string name="memory_gigabyte">GB</string>
314 <string name="memory_terabyte">TB</string> 413 <string name="memory_terabyte">TB</string>
315 <string name="memory_petabyte">PB</string> 414 <string name="memory_petabyte">PB</string>
316 <string name="memory_exabyte">EB</string> 415 <string name="memory_exabyte">EB</string>
@@ -352,9 +451,13 @@
352 <string name="anti_aliasing_smaa">SMAA</string> 451 <string name="anti_aliasing_smaa">SMAA</string>
353 452
354 <!-- Screen Layouts --> 453 <!-- Screen Layouts -->
355 <string name="screen_layout_landscape">横å‘大å±</string>
356 <string name="screen_layout_portrait">纵å‘å±å¹•</string>
357 <string name="screen_layout_auto">自動</string> 454 <string name="screen_layout_auto">自動</string>
455 <string name="screen_layout_sensor_landscape">感應器橫å‘螢幕</string>
456 <string name="screen_layout_landscape">æ©«å‘</string>
457 <string name="screen_layout_reverse_landscape">å轉橫å‘螢幕</string>
458 <string name="screen_layout_sensor_portrait">感應器直å‘螢幕</string>
459 <string name="screen_layout_portrait">ç›´å‘</string>
460 <string name="screen_layout_reverse_portrait">å轉直å‘螢幕</string>
358 461
359 <!-- Aspect Ratios --> 462 <!-- Aspect Ratios -->
360 <string name="ratio_default">é è¨­ (16:9)</string> 463 <string name="ratio_default">é è¨­ (16:9)</string>
@@ -363,6 +466,10 @@
363 <string name="ratio_force_sixteen_ten">強制 16:10</string> 466 <string name="ratio_force_sixteen_ten">強制 16:10</string>
364 <string name="ratio_stretch">延展視窗</string> 467 <string name="ratio_stretch">延展視窗</string>
365 468
469 <!-- CPU Backend -->
470 <string name="cpu_backend_dynarmic">å‹•æ…‹ (æ…¢)</string>
471 <string name="cpu_backend_nce">機器碼執行 (NCE)</string>
472
366 <!-- CPU Accuracy --> 473 <!-- CPU Accuracy -->
367 <string name="cpu_accuracy_accurate">高精度</string> 474 <string name="cpu_accuracy_accurate">高精度</string>
368 <string name="cpu_accuracy_unsafe">低精度</string> 475 <string name="cpu_accuracy_unsafe">低精度</string>
@@ -391,17 +498,24 @@
391 <string name="theme_mode_dark">深色</string> 498 <string name="theme_mode_dark">深色</string>
392 499
393 <!-- Audio output engines --> 500 <!-- Audio output engines -->
501 <string name="oboe">oboe</string>
394 <string name="cubeb">cubeb</string> 502 <string name="cubeb">cubeb</string>
395 503
504 <!-- Anisotropic filtering options -->
505 <string name="multiplier_two">2x</string>
506 <string name="multiplier_four">4x</string>
507 <string name="multiplier_eight">8x</string>
508 <string name="multiplier_sixteen">16x</string>
509
396 <!-- Black backgrounds theme --> 510 <!-- Black backgrounds theme -->
397 <string name="use_black_backgrounds">黑色背景</string> 511 <string name="use_black_backgrounds">黑色背景</string>
398 <string name="use_black_backgrounds_description">使用深色主題時,套用黑色背景。</string> 512 <string name="use_black_backgrounds_description">使用深色主題時,套用黑色背景。</string>
399 513
400 <!-- Picture-In-Picture --> 514 <!-- Picture-In-Picture -->
401 <string name="picture_in_picture">画中画</string> 515 <string name="picture_in_picture">å­æ¯ç•«é¢</string>
402 <string name="picture_in_picture_description">模拟器ä½äºŽåŽå°æ—¶æœ€å°åŒ–窗å£</string> 516 <string name="picture_in_picture_description">使–¼èƒŒæ™¯æ™‚最å°åŒ–視窗</string>
403 <string name="pause">æšåœ</string> 517 <string name="pause">æš«åœ</string>
404 <string name="play">开始</string> 518 <string name="play">開始</string>
405 <string name="mute">éœéŸ³</string> 519 <string name="mute">éœéŸ³</string>
406 <string name="unmute">å–æ¶ˆéœéŸ³</string> 520 <string name="unmute">å–æ¶ˆéœéŸ³</string>
407 521
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 547752bda..779eb36a8 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -142,6 +142,8 @@
142 <item quantity="other">Successfully imported %d saves</item> 142 <item quantity="other">Successfully imported %d saves</item>
143 </plurals> 143 </plurals>
144 <string name="no_save_data_found">No save data found</string> 144 <string name="no_save_data_found">No save data found</string>
145 <string name="verify_installed_content">Verify installed content</string>
146 <string name="verify_installed_content_description">Checks all installed content for corruption</string>
145 147
146 <!-- Applet launcher strings --> 148 <!-- Applet launcher strings -->
147 <string name="applets">Applet launcher</string> 149 <string name="applets">Applet launcher</string>
@@ -286,6 +288,9 @@
286 <string name="custom">Custom</string> 288 <string name="custom">Custom</string>
287 <string name="notice">Notice</string> 289 <string name="notice">Notice</string>
288 <string name="import_complete">Import complete</string> 290 <string name="import_complete">Import complete</string>
291 <string name="more_options">More options</string>
292 <string name="use_global_setting">Use global setting</string>
293 <string name="operation_completed_successfully">The operation completed successfully</string>
289 294
290 <!-- GPU driver installation --> 295 <!-- GPU driver installation -->
291 <string name="select_gpu_driver">Select GPU driver</string> 296 <string name="select_gpu_driver">Select GPU driver</string>
@@ -348,6 +353,16 @@
348 <string name="verifying_content">Verifying content…</string> 353 <string name="verifying_content">Verifying content…</string>
349 <string name="content_install_notice">Content install notice</string> 354 <string name="content_install_notice">Content install notice</string>
350 <string name="content_install_notice_description">The content that you selected does not match this game.\nInstall anyway?</string> 355 <string name="content_install_notice_description">The content that you selected does not match this game.\nInstall anyway?</string>
356 <string name="confirm_uninstall">Confirm uninstall</string>
357 <string name="confirm_uninstall_description">Are you sure you want to uninstall this addon?</string>
358 <string name="verify_integrity">Verify integrity</string>
359 <string name="verifying">Verifying…</string>
360 <string name="verify_success">Integrity verification succeeded!</string>
361 <string name="verify_failure">Integrity verification failed!</string>
362 <string name="verify_failure_description">File contents may be corrupt</string>
363 <string name="verify_no_result">Integrity verification couldn\'t be performed</string>
364 <string name="verify_no_result_description">File contents were not checked for validity</string>
365 <string name="verification_failed_for">Verification failed for the following files:\n%1$s</string>
351 366
352 <!-- ROM loading errors --> 367 <!-- ROM loading errors -->
353 <string name="loader_error_encrypted">Your ROM is encrypted</string> 368 <string name="loader_error_encrypted">Your ROM is encrypted</string>
@@ -377,6 +392,8 @@
377 <string name="emulation_unpause">Unpause emulation</string> 392 <string name="emulation_unpause">Unpause emulation</string>
378 <string name="emulation_input_overlay">Overlay options</string> 393 <string name="emulation_input_overlay">Overlay options</string>
379 <string name="touchscreen">Touchscreen</string> 394 <string name="touchscreen">Touchscreen</string>
395 <string name="lock_drawer">Lock drawer</string>
396 <string name="unlock_drawer">Unlock drawer</string>
380 397
381 <string name="load_settings">Loading settings…</string> 398 <string name="load_settings">Loading settings…</string>
382 399
diff --git a/src/common/fs/file.h b/src/common/fs/file.h
index 167c4d826..2e2396075 100644
--- a/src/common/fs/file.h
+++ b/src/common/fs/file.h
@@ -37,7 +37,7 @@ void OpenFileStream(FileStream& file_stream, const std::filesystem::path& path,
37template <typename FileStream, typename Path> 37template <typename FileStream, typename Path>
38void OpenFileStream(FileStream& file_stream, const Path& path, std::ios_base::openmode open_mode) { 38void OpenFileStream(FileStream& file_stream, const Path& path, std::ios_base::openmode open_mode) {
39 if constexpr (IsChar<typename Path::value_type>) { 39 if constexpr (IsChar<typename Path::value_type>) {
40 file_stream.open(ToU8String(path), open_mode); 40 file_stream.open(std::filesystem::path{ToU8String(path)}, open_mode);
41 } else { 41 } else {
42 file_stream.open(std::filesystem::path{path}, open_mode); 42 file_stream.open(std::filesystem::path{path}, open_mode);
43 } 43 }
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 0f713ead1..4ff2c1bb7 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -716,22 +716,23 @@ add_library(core STATIC
716 hle/service/server_manager.h 716 hle/service/server_manager.h
717 hle/service/service.cpp 717 hle/service/service.cpp
718 hle/service/service.h 718 hle/service/service.h
719 hle/service/set/appln_settings.cpp 719 hle/service/set/setting_formats/appln_settings.cpp
720 hle/service/set/appln_settings.h 720 hle/service/set/setting_formats/appln_settings.h
721 hle/service/set/device_settings.cpp 721 hle/service/set/setting_formats/device_settings.cpp
722 hle/service/set/device_settings.h 722 hle/service/set/setting_formats/device_settings.h
723 hle/service/set/setting_formats/system_settings.cpp
724 hle/service/set/setting_formats/system_settings.h
725 hle/service/set/setting_formats/private_settings.cpp
726 hle/service/set/setting_formats/private_settings.h
723 hle/service/set/factory_settings_server.cpp 727 hle/service/set/factory_settings_server.cpp
724 hle/service/set/factory_settings_server.h 728 hle/service/set/factory_settings_server.h
725 hle/service/set/firmware_debug_settings_server.cpp 729 hle/service/set/firmware_debug_settings_server.cpp
726 hle/service/set/firmware_debug_settings_server.h 730 hle/service/set/firmware_debug_settings_server.h
727 hle/service/set/private_settings.cpp
728 hle/service/set/private_settings.h
729 hle/service/set/settings.cpp 731 hle/service/set/settings.cpp
730 hle/service/set/settings.h 732 hle/service/set/settings.h
731 hle/service/set/settings_server.cpp 733 hle/service/set/settings_server.cpp
732 hle/service/set/settings_server.h 734 hle/service/set/settings_server.h
733 hle/service/set/system_settings.cpp 735 hle/service/set/settings_types.h
734 hle/service/set/system_settings.h
735 hle/service/set/system_settings_server.cpp 736 hle/service/set/system_settings_server.cpp
736 hle/service/set/system_settings_server.h 737 hle/service/set/system_settings_server.h
737 hle/service/sm/sm.cpp 738 hle/service/sm/sm.cpp
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp
index 4a3dbc6a3..612122224 100644
--- a/src/core/file_sys/patch_manager.cpp
+++ b/src/core/file_sys/patch_manager.cpp
@@ -466,12 +466,12 @@ VirtualFile PatchManager::PatchRomFS(const NCA* base_nca, VirtualFile base_romfs
466 return romfs; 466 return romfs;
467} 467}
468 468
469PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile update_raw) const { 469std::vector<Patch> PatchManager::GetPatches(VirtualFile update_raw) const {
470 if (title_id == 0) { 470 if (title_id == 0) {
471 return {}; 471 return {};
472 } 472 }
473 473
474 std::map<std::string, std::string, std::less<>> out; 474 std::vector<Patch> out;
475 const auto& disabled = Settings::values.disabled_addons[title_id]; 475 const auto& disabled = Settings::values.disabled_addons[title_id];
476 476
477 // Game Updates 477 // Game Updates
@@ -482,20 +482,28 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u
482 482
483 const auto update_disabled = 483 const auto update_disabled =
484 std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); 484 std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend();
485 const auto update_label = update_disabled ? "[D] Update" : "Update"; 485 Patch update_patch = {.enabled = !update_disabled,
486 .name = "Update",
487 .version = "",
488 .type = PatchType::Update,
489 .program_id = title_id,
490 .title_id = title_id};
486 491
487 if (nacp != nullptr) { 492 if (nacp != nullptr) {
488 out.insert_or_assign(update_label, nacp->GetVersionString()); 493 update_patch.version = nacp->GetVersionString();
494 out.push_back(update_patch);
489 } else { 495 } else {
490 if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) { 496 if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) {
491 const auto meta_ver = content_provider.GetEntryVersion(update_tid); 497 const auto meta_ver = content_provider.GetEntryVersion(update_tid);
492 if (meta_ver.value_or(0) == 0) { 498 if (meta_ver.value_or(0) == 0) {
493 out.insert_or_assign(update_label, ""); 499 out.push_back(update_patch);
494 } else { 500 } else {
495 out.insert_or_assign(update_label, FormatTitleVersion(*meta_ver)); 501 update_patch.version = FormatTitleVersion(*meta_ver);
502 out.push_back(update_patch);
496 } 503 }
497 } else if (update_raw != nullptr) { 504 } else if (update_raw != nullptr) {
498 out.insert_or_assign(update_label, "PACKED"); 505 update_patch.version = "PACKED";
506 out.push_back(update_patch);
499 } 507 }
500 } 508 }
501 509
@@ -539,7 +547,12 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u
539 547
540 const auto mod_disabled = 548 const auto mod_disabled =
541 std::find(disabled.begin(), disabled.end(), mod->GetName()) != disabled.end(); 549 std::find(disabled.begin(), disabled.end(), mod->GetName()) != disabled.end();
542 out.insert_or_assign(mod_disabled ? "[D] " + mod->GetName() : mod->GetName(), types); 550 out.push_back({.enabled = !mod_disabled,
551 .name = mod->GetName(),
552 .version = types,
553 .type = PatchType::Mod,
554 .program_id = title_id,
555 .title_id = title_id});
543 } 556 }
544 } 557 }
545 558
@@ -557,7 +570,12 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u
557 if (!types.empty()) { 570 if (!types.empty()) {
558 const auto mod_disabled = 571 const auto mod_disabled =
559 std::find(disabled.begin(), disabled.end(), "SDMC") != disabled.end(); 572 std::find(disabled.begin(), disabled.end(), "SDMC") != disabled.end();
560 out.insert_or_assign(mod_disabled ? "[D] SDMC" : "SDMC", types); 573 out.push_back({.enabled = !mod_disabled,
574 .name = "SDMC",
575 .version = types,
576 .type = PatchType::Mod,
577 .program_id = title_id,
578 .title_id = title_id});
561 } 579 }
562 } 580 }
563 581
@@ -584,7 +602,12 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u
584 602
585 const auto dlc_disabled = 603 const auto dlc_disabled =
586 std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end(); 604 std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end();
587 out.insert_or_assign(dlc_disabled ? "[D] DLC" : "DLC", std::move(list)); 605 out.push_back({.enabled = !dlc_disabled,
606 .name = "DLC",
607 .version = std::move(list),
608 .type = PatchType::DLC,
609 .program_id = title_id,
610 .title_id = dlc_match.back().title_id});
588 } 611 }
589 612
590 return out; 613 return out;
diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h
index 03e9c7301..2601b8217 100644
--- a/src/core/file_sys/patch_manager.h
+++ b/src/core/file_sys/patch_manager.h
@@ -26,12 +26,22 @@ class ContentProvider;
26class NCA; 26class NCA;
27class NACP; 27class NACP;
28 28
29enum class PatchType { Update, DLC, Mod };
30
31struct Patch {
32 bool enabled;
33 std::string name;
34 std::string version;
35 PatchType type;
36 u64 program_id;
37 u64 title_id;
38};
39
29// A centralized class to manage patches to games. 40// A centralized class to manage patches to games.
30class PatchManager { 41class PatchManager {
31public: 42public:
32 using BuildID = std::array<u8, 0x20>; 43 using BuildID = std::array<u8, 0x20>;
33 using Metadata = std::pair<std::unique_ptr<NACP>, VirtualFile>; 44 using Metadata = std::pair<std::unique_ptr<NACP>, VirtualFile>;
34 using PatchVersionNames = std::map<std::string, std::string, std::less<>>;
35 45
36 explicit PatchManager(u64 title_id_, 46 explicit PatchManager(u64 title_id_,
37 const Service::FileSystem::FileSystemController& fs_controller_, 47 const Service::FileSystem::FileSystemController& fs_controller_,
@@ -66,9 +76,8 @@ public:
66 VirtualFile packed_update_raw = nullptr, 76 VirtualFile packed_update_raw = nullptr,
67 bool apply_layeredfs = true) const; 77 bool apply_layeredfs = true) const;
68 78
69 // Returns a vector of pairs between patch names and patch versions. 79 // Returns a vector of patches
70 // i.e. Update 3.2.2 will return {"Update", "3.2.2"} 80 [[nodiscard]] std::vector<Patch> GetPatches(VirtualFile update_raw = nullptr) const;
71 [[nodiscard]] PatchVersionNames GetPatchVersionNames(VirtualFile update_raw = nullptr) const;
72 81
73 // If the game update exists, returns the u32 version field in its Meta-type NCA. If that fails, 82 // If the game update exists, returns the u32 version field in its Meta-type NCA. If that fails,
74 // it will fallback to the Meta-type NCA of the base game. If that fails, the result will be 83 // it will fallback to the Meta-type NCA of the base game. If that fails, the result will be
diff --git a/src/core/hle/service/acc/profile_manager.cpp b/src/core/hle/service/acc/profile_manager.cpp
index 683f44e27..29a10ad13 100644
--- a/src/core/hle/service/acc/profile_manager.cpp
+++ b/src/core/hle/service/acc/profile_manager.cpp
@@ -11,6 +11,7 @@
11#include "common/fs/path_util.h" 11#include "common/fs/path_util.h"
12#include "common/polyfill_ranges.h" 12#include "common/polyfill_ranges.h"
13#include "common/settings.h" 13#include "common/settings.h"
14#include "common/string_util.h"
14#include "core/hle/service/acc/profile_manager.h" 15#include "core/hle/service/acc/profile_manager.h"
15 16
16namespace Service::Account { 17namespace Service::Account {
@@ -164,6 +165,22 @@ std::optional<std::size_t> ProfileManager::GetUserIndex(const ProfileInfo& user)
164 return GetUserIndex(user.user_uuid); 165 return GetUserIndex(user.user_uuid);
165} 166}
166 167
168/// Returns the first user profile seen based on username (which does not enforce uniqueness)
169std::optional<std::size_t> ProfileManager::GetUserIndex(const std::string& username) const {
170 const auto iter =
171 std::find_if(profiles.begin(), profiles.end(), [&username](const ProfileInfo& p) {
172 const std::string profile_username = Common::StringFromFixedZeroTerminatedBuffer(
173 reinterpret_cast<const char*>(p.username.data()), p.username.size());
174
175 return username.compare(profile_username) == 0;
176 });
177 if (iter == profiles.end()) {
178 return std::nullopt;
179 }
180
181 return static_cast<std::size_t>(std::distance(profiles.begin(), iter));
182}
183
167/// Returns the data structure used by the switch when GetProfileBase is called on acc:* 184/// Returns the data structure used by the switch when GetProfileBase is called on acc:*
168bool ProfileManager::GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const { 185bool ProfileManager::GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const {
169 if (!index || index >= MAX_USERS) { 186 if (!index || index >= MAX_USERS) {
diff --git a/src/core/hle/service/acc/profile_manager.h b/src/core/hle/service/acc/profile_manager.h
index e21863e64..f94157300 100644
--- a/src/core/hle/service/acc/profile_manager.h
+++ b/src/core/hle/service/acc/profile_manager.h
@@ -70,6 +70,7 @@ public:
70 std::optional<Common::UUID> GetUser(std::size_t index) const; 70 std::optional<Common::UUID> GetUser(std::size_t index) const;
71 std::optional<std::size_t> GetUserIndex(const Common::UUID& uuid) const; 71 std::optional<std::size_t> GetUserIndex(const Common::UUID& uuid) const;
72 std::optional<std::size_t> GetUserIndex(const ProfileInfo& user) const; 72 std::optional<std::size_t> GetUserIndex(const ProfileInfo& user) const;
73 std::optional<std::size_t> GetUserIndex(const std::string& username) const;
73 bool GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const; 74 bool GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const;
74 bool GetProfileBase(Common::UUID uuid, ProfileBase& profile) const; 75 bool GetProfileBase(Common::UUID uuid, ProfileBase& profile) const;
75 bool GetProfileBase(const ProfileInfo& user, ProfileBase& profile) const; 76 bool GetProfileBase(const ProfileInfo& user, ProfileBase& profile) const;
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 4ce0a9834..595a3372e 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -20,12 +20,13 @@ void LoopProcess(Core::System& system) {
20 auto server_manager = std::make_unique<ServerManager>(system); 20 auto server_manager = std::make_unique<ServerManager>(system);
21 std::shared_ptr<ResourceManager> resource_manager = std::make_shared<ResourceManager>(system); 21 std::shared_ptr<ResourceManager> resource_manager = std::make_shared<ResourceManager>(system);
22 std::shared_ptr<HidFirmwareSettings> firmware_settings = 22 std::shared_ptr<HidFirmwareSettings> firmware_settings =
23 std::make_shared<HidFirmwareSettings>(); 23 std::make_shared<HidFirmwareSettings>(system);
24 24
25 // TODO: Remove this hack when am is emulated properly. 25 // TODO: Remove this hack when am is emulated properly.
26 resource_manager->Initialize(); 26 resource_manager->Initialize();
27 resource_manager->RegisterAppletResourceUserId(system.ApplicationProcess()->GetProcessId(), 27 resource_manager->RegisterAppletResourceUserId(system.ApplicationProcess()->GetProcessId(),
28 true); 28 true);
29 resource_manager->SetAruidValidForVibration(system.ApplicationProcess()->GetProcessId(), true);
29 30
30 server_manager->RegisterNamedService( 31 server_manager->RegisterNamedService(
31 "hid", std::make_shared<IHidServer>(system, resource_manager, firmware_settings)); 32 "hid", std::make_shared<IHidServer>(system, resource_manager, firmware_settings));
diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp
index 1951da33b..30afed812 100644
--- a/src/core/hle/service/hid/hid_server.cpp
+++ b/src/core/hle/service/hid/hid_server.cpp
@@ -22,12 +22,16 @@
22#include "hid_core/resources/mouse/mouse.h" 22#include "hid_core/resources/mouse/mouse.h"
23#include "hid_core/resources/npad/npad.h" 23#include "hid_core/resources/npad/npad.h"
24#include "hid_core/resources/npad/npad_types.h" 24#include "hid_core/resources/npad/npad_types.h"
25#include "hid_core/resources/npad/npad_vibration.h"
25#include "hid_core/resources/palma/palma.h" 26#include "hid_core/resources/palma/palma.h"
26#include "hid_core/resources/six_axis/console_six_axis.h" 27#include "hid_core/resources/six_axis/console_six_axis.h"
27#include "hid_core/resources/six_axis/seven_six_axis.h" 28#include "hid_core/resources/six_axis/seven_six_axis.h"
28#include "hid_core/resources/six_axis/six_axis.h" 29#include "hid_core/resources/six_axis/six_axis.h"
29#include "hid_core/resources/touch_screen/gesture.h" 30#include "hid_core/resources/touch_screen/gesture.h"
30#include "hid_core/resources/touch_screen/touch_screen.h" 31#include "hid_core/resources/touch_screen/touch_screen.h"
32#include "hid_core/resources/vibration/gc_vibration_device.h"
33#include "hid_core/resources/vibration/n64_vibration_device.h"
34#include "hid_core/resources/vibration/vibration_device.h"
31 35
32namespace Service::HID { 36namespace Service::HID {
33 37
@@ -38,7 +42,7 @@ public:
38 : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) { 42 : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
39 // clang-format off 43 // clang-format off
40 static const FunctionInfo functions[] = { 44 static const FunctionInfo functions[] = {
41 {0, &IActiveVibrationDeviceList::InitializeVibrationDevice, "InitializeVibrationDevice"}, 45 {0, &IActiveVibrationDeviceList::ActivateVibrationDevice, "ActivateVibrationDevice"},
42 }; 46 };
43 // clang-format on 47 // clang-format on
44 48
@@ -46,22 +50,49 @@ public:
46 } 50 }
47 51
48private: 52private:
49 void InitializeVibrationDevice(HLERequestContext& ctx) { 53 void ActivateVibrationDevice(HLERequestContext& ctx) {
50 IPC::RequestParser rp{ctx}; 54 IPC::RequestParser rp{ctx};
51 const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()}; 55 const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()};
52 56
53 if (resource_manager != nullptr && resource_manager->GetNpad()) {
54 resource_manager->GetNpad()->InitializeVibrationDevice(vibration_device_handle);
55 }
56
57 LOG_DEBUG(Service_HID, "called, npad_type={}, npad_id={}, device_index={}", 57 LOG_DEBUG(Service_HID, "called, npad_type={}, npad_id={}, device_index={}",
58 vibration_device_handle.npad_type, vibration_device_handle.npad_id, 58 vibration_device_handle.npad_type, vibration_device_handle.npad_id,
59 vibration_device_handle.device_index); 59 vibration_device_handle.device_index);
60 60
61 const auto result = ActivateVibrationDeviceImpl(vibration_device_handle);
62
61 IPC::ResponseBuilder rb{ctx, 2}; 63 IPC::ResponseBuilder rb{ctx, 2};
62 rb.Push(ResultSuccess); 64 rb.Push(result);
63 } 65 }
64 66
67 Result ActivateVibrationDeviceImpl(const Core::HID::VibrationDeviceHandle& handle) {
68 std::scoped_lock lock{mutex};
69
70 const Result is_valid = IsVibrationHandleValid(handle);
71 if (is_valid.IsError()) {
72 return is_valid;
73 }
74
75 for (std::size_t i = 0; i < list_size; i++) {
76 if (handle.device_index == vibration_device_list[i].device_index &&
77 handle.npad_id == vibration_device_list[i].npad_id &&
78 handle.npad_type == vibration_device_list[i].npad_type) {
79 return ResultSuccess;
80 }
81 }
82 if (list_size == vibration_device_list.size()) {
83 return ResultVibrationDeviceIndexOutOfRange;
84 }
85 const Result result = resource_manager->GetVibrationDevice(handle)->Activate();
86 if (result.IsError()) {
87 return result;
88 }
89 vibration_device_list[list_size++] = handle;
90 return ResultSuccess;
91 }
92
93 mutable std::mutex mutex;
94 std::size_t list_size{};
95 std::array<Core::HID::VibrationDeviceHandle, 0x100> vibration_device_list{};
65 std::shared_ptr<ResourceManager> resource_manager; 96 std::shared_ptr<ResourceManager> resource_manager;
66}; 97};
67 98
@@ -153,7 +184,7 @@ IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> r
153 {209, &IHidServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"}, 184 {209, &IHidServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
154 {210, &IHidServer::EndPermitVibrationSession, "EndPermitVibrationSession"}, 185 {210, &IHidServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
155 {211, &IHidServer::IsVibrationDeviceMounted, "IsVibrationDeviceMounted"}, 186 {211, &IHidServer::IsVibrationDeviceMounted, "IsVibrationDeviceMounted"},
156 {212, nullptr, "SendVibrationValueInBool"}, 187 {212, &IHidServer::SendVibrationValueInBool, "SendVibrationValueInBool"},
157 {300, &IHidServer::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"}, 188 {300, &IHidServer::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"},
158 {301, &IHidServer::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"}, 189 {301, &IHidServer::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"},
159 {302, &IHidServer::StopConsoleSixAxisSensor, "StopConsoleSixAxisSensor"}, 190 {302, &IHidServer::StopConsoleSixAxisSensor, "StopConsoleSixAxisSensor"},
@@ -1492,59 +1523,13 @@ void IHidServer::ClearNpadCaptureButtonAssignment(HLERequestContext& ctx) {
1492void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) { 1523void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) {
1493 IPC::RequestParser rp{ctx}; 1524 IPC::RequestParser rp{ctx};
1494 const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()}; 1525 const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()};
1495 const auto controller = GetResourceManager()->GetNpad();
1496
1497 Core::HID::VibrationDeviceInfo vibration_device_info;
1498 bool check_device_index = false;
1499
1500 switch (vibration_device_handle.npad_type) {
1501 case Core::HID::NpadStyleIndex::Fullkey:
1502 case Core::HID::NpadStyleIndex::Handheld:
1503 case Core::HID::NpadStyleIndex::JoyconDual:
1504 case Core::HID::NpadStyleIndex::JoyconLeft:
1505 case Core::HID::NpadStyleIndex::JoyconRight:
1506 vibration_device_info.type = Core::HID::VibrationDeviceType::LinearResonantActuator;
1507 check_device_index = true;
1508 break;
1509 case Core::HID::NpadStyleIndex::GameCube:
1510 vibration_device_info.type = Core::HID::VibrationDeviceType::GcErm;
1511 break;
1512 case Core::HID::NpadStyleIndex::N64:
1513 vibration_device_info.type = Core::HID::VibrationDeviceType::N64;
1514 break;
1515 default:
1516 vibration_device_info.type = Core::HID::VibrationDeviceType::Unknown;
1517 break;
1518 }
1519
1520 vibration_device_info.position = Core::HID::VibrationDevicePosition::None;
1521 if (check_device_index) {
1522 switch (vibration_device_handle.device_index) {
1523 case Core::HID::DeviceIndex::Left:
1524 vibration_device_info.position = Core::HID::VibrationDevicePosition::Left;
1525 break;
1526 case Core::HID::DeviceIndex::Right:
1527 vibration_device_info.position = Core::HID::VibrationDevicePosition::Right;
1528 break;
1529 case Core::HID::DeviceIndex::None:
1530 default:
1531 ASSERT_MSG(false, "DeviceIndex should never be None!");
1532 break;
1533 }
1534 }
1535 1526
1536 LOG_DEBUG(Service_HID, "called, vibration_device_type={}, vibration_device_position={}", 1527 Core::HID::VibrationDeviceInfo vibration_device_info{};
1537 vibration_device_info.type, vibration_device_info.position); 1528 const auto result = GetResourceManager()->GetVibrationDeviceInfo(vibration_device_info,
1538 1529 vibration_device_handle);
1539 const auto result = IsVibrationHandleValid(vibration_device_handle);
1540 if (result.IsError()) {
1541 IPC::ResponseBuilder rb{ctx, 2};
1542 rb.Push(result);
1543 return;
1544 }
1545 1530
1546 IPC::ResponseBuilder rb{ctx, 4}; 1531 IPC::ResponseBuilder rb{ctx, 4};
1547 rb.Push(ResultSuccess); 1532 rb.Push(result);
1548 rb.PushRaw(vibration_device_info); 1533 rb.PushRaw(vibration_device_info);
1549} 1534}
1550 1535
@@ -1560,16 +1545,16 @@ void IHidServer::SendVibrationValue(HLERequestContext& ctx) {
1560 1545
1561 const auto parameters{rp.PopRaw<Parameters>()}; 1546 const auto parameters{rp.PopRaw<Parameters>()};
1562 1547
1563 GetResourceManager()->GetNpad()->VibrateController(parameters.applet_resource_user_id,
1564 parameters.vibration_device_handle,
1565 parameters.vibration_value);
1566
1567 LOG_DEBUG(Service_HID, 1548 LOG_DEBUG(Service_HID,
1568 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}", 1549 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
1569 parameters.vibration_device_handle.npad_type, 1550 parameters.vibration_device_handle.npad_type,
1570 parameters.vibration_device_handle.npad_id, 1551 parameters.vibration_device_handle.npad_id,
1571 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id); 1552 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
1572 1553
1554 GetResourceManager()->SendVibrationValue(parameters.applet_resource_user_id,
1555 parameters.vibration_device_handle,
1556 parameters.vibration_value);
1557
1573 IPC::ResponseBuilder rb{ctx, 2}; 1558 IPC::ResponseBuilder rb{ctx, 2};
1574 rb.Push(ResultSuccess); 1559 rb.Push(ResultSuccess);
1575} 1560}
@@ -1591,10 +1576,28 @@ void IHidServer::GetActualVibrationValue(HLERequestContext& ctx) {
1591 parameters.vibration_device_handle.npad_id, 1576 parameters.vibration_device_handle.npad_id,
1592 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id); 1577 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
1593 1578
1579 bool has_active_aruid{};
1580 NpadVibrationDevice* device{nullptr};
1581 Core::HID::VibrationValue vibration_value{};
1582 Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
1583 has_active_aruid);
1584
1585 if (result.IsSuccess() && has_active_aruid) {
1586 result = IsVibrationHandleValid(parameters.vibration_device_handle);
1587 }
1588 if (result.IsSuccess() && has_active_aruid) {
1589 device = GetResourceManager()->GetNSVibrationDevice(parameters.vibration_device_handle);
1590 }
1591 if (device != nullptr) {
1592 result = device->GetActualVibrationValue(vibration_value);
1593 }
1594 if (result.IsError()) {
1595 vibration_value = Core::HID::DEFAULT_VIBRATION_VALUE;
1596 }
1597
1594 IPC::ResponseBuilder rb{ctx, 6}; 1598 IPC::ResponseBuilder rb{ctx, 6};
1595 rb.Push(ResultSuccess); 1599 rb.Push(ResultSuccess);
1596 rb.PushRaw(GetResourceManager()->GetNpad()->GetLastVibration( 1600 rb.PushRaw(vibration_value);
1597 parameters.applet_resource_user_id, parameters.vibration_device_handle));
1598} 1601}
1599 1602
1600void IHidServer::CreateActiveVibrationDeviceList(HLERequestContext& ctx) { 1603void IHidServer::CreateActiveVibrationDeviceList(HLERequestContext& ctx) {
@@ -1609,25 +1612,27 @@ void IHidServer::PermitVibration(HLERequestContext& ctx) {
1609 IPC::RequestParser rp{ctx}; 1612 IPC::RequestParser rp{ctx};
1610 const auto can_vibrate{rp.Pop<bool>()}; 1613 const auto can_vibrate{rp.Pop<bool>()};
1611 1614
1612 // nnSDK saves this value as a float. Since it can only be 1.0f or 0.0f we simplify this value
1613 // by converting it to a bool
1614 Settings::values.vibration_enabled.SetValue(can_vibrate);
1615
1616 LOG_DEBUG(Service_HID, "called, can_vibrate={}", can_vibrate); 1615 LOG_DEBUG(Service_HID, "called, can_vibrate={}", can_vibrate);
1617 1616
1617 const auto result =
1618 GetResourceManager()->GetNpad()->GetVibrationHandler()->SetVibrationMasterVolume(
1619 can_vibrate ? 1.0f : 0.0f);
1620
1618 IPC::ResponseBuilder rb{ctx, 2}; 1621 IPC::ResponseBuilder rb{ctx, 2};
1619 rb.Push(ResultSuccess); 1622 rb.Push(result);
1620} 1623}
1621 1624
1622void IHidServer::IsVibrationPermitted(HLERequestContext& ctx) { 1625void IHidServer::IsVibrationPermitted(HLERequestContext& ctx) {
1623 LOG_DEBUG(Service_HID, "called"); 1626 LOG_DEBUG(Service_HID, "called");
1624 1627
1625 // nnSDK checks if a float is greater than zero. We return the bool we stored earlier 1628 f32 master_volume{};
1626 const auto is_enabled = Settings::values.vibration_enabled.GetValue(); 1629 const auto result =
1630 GetResourceManager()->GetNpad()->GetVibrationHandler()->GetVibrationMasterVolume(
1631 master_volume);
1627 1632
1628 IPC::ResponseBuilder rb{ctx, 3}; 1633 IPC::ResponseBuilder rb{ctx, 3};
1629 rb.Push(ResultSuccess); 1634 rb.Push(result);
1630 rb.Push(is_enabled); 1635 rb.Push(master_volume > 0.0f);
1631} 1636}
1632 1637
1633void IHidServer::SendVibrationValues(HLERequestContext& ctx) { 1638void IHidServer::SendVibrationValues(HLERequestContext& ctx) {
@@ -1645,13 +1650,22 @@ void IHidServer::SendVibrationValues(HLERequestContext& ctx) {
1645 auto vibration_values = std::span( 1650 auto vibration_values = std::span(
1646 reinterpret_cast<const Core::HID::VibrationValue*>(vibration_data.data()), vibration_count); 1651 reinterpret_cast<const Core::HID::VibrationValue*>(vibration_data.data()), vibration_count);
1647 1652
1648 GetResourceManager()->GetNpad()->VibrateControllers(applet_resource_user_id,
1649 vibration_device_handles, vibration_values);
1650
1651 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 1653 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
1652 1654
1655 Result result = ResultSuccess;
1656 if (handle_count != vibration_count) {
1657 result = ResultVibrationArraySizeMismatch;
1658 }
1659
1660 for (std::size_t i = 0; i < handle_count; i++) {
1661 if (result.IsSuccess()) {
1662 result = GetResourceManager()->SendVibrationValue(
1663 applet_resource_user_id, vibration_device_handles[i], vibration_values[i]);
1664 }
1665 }
1666
1653 IPC::ResponseBuilder rb{ctx, 2}; 1667 IPC::ResponseBuilder rb{ctx, 2};
1654 rb.Push(ResultSuccess); 1668 rb.Push(result);
1655} 1669}
1656 1670
1657void IHidServer::SendVibrationGcErmCommand(HLERequestContext& ctx) { 1671void IHidServer::SendVibrationGcErmCommand(HLERequestContext& ctx) {
@@ -1666,43 +1680,6 @@ void IHidServer::SendVibrationGcErmCommand(HLERequestContext& ctx) {
1666 1680
1667 const auto parameters{rp.PopRaw<Parameters>()}; 1681 const auto parameters{rp.PopRaw<Parameters>()};
1668 1682
1669 /**
1670 * Note: This uses yuzu-specific behavior such that the StopHard command produces
1671 * vibrations where freq_low == 0.0f and freq_high == 0.0f, as defined below,
1672 * in order to differentiate between Stop and StopHard commands.
1673 * This is done to reuse the controller vibration functions made for regular controllers.
1674 */
1675 const auto vibration_value = [parameters] {
1676 switch (parameters.gc_erm_command) {
1677 case Core::HID::VibrationGcErmCommand::Stop:
1678 return Core::HID::VibrationValue{
1679 .low_amplitude = 0.0f,
1680 .low_frequency = 160.0f,
1681 .high_amplitude = 0.0f,
1682 .high_frequency = 320.0f,
1683 };
1684 case Core::HID::VibrationGcErmCommand::Start:
1685 return Core::HID::VibrationValue{
1686 .low_amplitude = 1.0f,
1687 .low_frequency = 160.0f,
1688 .high_amplitude = 1.0f,
1689 .high_frequency = 320.0f,
1690 };
1691 case Core::HID::VibrationGcErmCommand::StopHard:
1692 return Core::HID::VibrationValue{
1693 .low_amplitude = 0.0f,
1694 .low_frequency = 0.0f,
1695 .high_amplitude = 0.0f,
1696 .high_frequency = 0.0f,
1697 };
1698 default:
1699 return Core::HID::DEFAULT_VIBRATION_VALUE;
1700 }
1701 }();
1702
1703 GetResourceManager()->GetNpad()->VibrateController(
1704 parameters.applet_resource_user_id, parameters.vibration_device_handle, vibration_value);
1705
1706 LOG_DEBUG(Service_HID, 1683 LOG_DEBUG(Service_HID,
1707 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}, " 1684 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}, "
1708 "gc_erm_command={}", 1685 "gc_erm_command={}",
@@ -1711,8 +1688,23 @@ void IHidServer::SendVibrationGcErmCommand(HLERequestContext& ctx) {
1711 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id, 1688 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id,
1712 parameters.gc_erm_command); 1689 parameters.gc_erm_command);
1713 1690
1691 bool has_active_aruid{};
1692 NpadGcVibrationDevice* gc_device{nullptr};
1693 Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
1694 has_active_aruid);
1695
1696 if (result.IsSuccess() && has_active_aruid) {
1697 result = IsVibrationHandleValid(parameters.vibration_device_handle);
1698 }
1699 if (result.IsSuccess() && has_active_aruid) {
1700 gc_device = GetResourceManager()->GetGcVibrationDevice(parameters.vibration_device_handle);
1701 }
1702 if (gc_device != nullptr) {
1703 result = gc_device->SendVibrationGcErmCommand(parameters.gc_erm_command);
1704 }
1705
1714 IPC::ResponseBuilder rb{ctx, 2}; 1706 IPC::ResponseBuilder rb{ctx, 2};
1715 rb.Push(ResultSuccess); 1707 rb.Push(result);
1716} 1708}
1717 1709
1718void IHidServer::GetActualVibrationGcErmCommand(HLERequestContext& ctx) { 1710void IHidServer::GetActualVibrationGcErmCommand(HLERequestContext& ctx) {
@@ -1725,33 +1717,31 @@ void IHidServer::GetActualVibrationGcErmCommand(HLERequestContext& ctx) {
1725 1717
1726 const auto parameters{rp.PopRaw<Parameters>()}; 1718 const auto parameters{rp.PopRaw<Parameters>()};
1727 1719
1728 const auto last_vibration = GetResourceManager()->GetNpad()->GetLastVibration(
1729 parameters.applet_resource_user_id, parameters.vibration_device_handle);
1730
1731 const auto gc_erm_command = [last_vibration] {
1732 if (last_vibration.low_amplitude != 0.0f || last_vibration.high_amplitude != 0.0f) {
1733 return Core::HID::VibrationGcErmCommand::Start;
1734 }
1735
1736 /**
1737 * Note: This uses yuzu-specific behavior such that the StopHard command produces
1738 * vibrations where freq_low == 0.0f and freq_high == 0.0f, as defined in the HID function
1739 * SendVibrationGcErmCommand, in order to differentiate between Stop and StopHard commands.
1740 * This is done to reuse the controller vibration functions made for regular controllers.
1741 */
1742 if (last_vibration.low_frequency == 0.0f && last_vibration.high_frequency == 0.0f) {
1743 return Core::HID::VibrationGcErmCommand::StopHard;
1744 }
1745
1746 return Core::HID::VibrationGcErmCommand::Stop;
1747 }();
1748
1749 LOG_DEBUG(Service_HID, 1720 LOG_DEBUG(Service_HID,
1750 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}", 1721 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
1751 parameters.vibration_device_handle.npad_type, 1722 parameters.vibration_device_handle.npad_type,
1752 parameters.vibration_device_handle.npad_id, 1723 parameters.vibration_device_handle.npad_id,
1753 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id); 1724 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
1754 1725
1726 bool has_active_aruid{};
1727 NpadGcVibrationDevice* gc_device{nullptr};
1728 Core::HID::VibrationGcErmCommand gc_erm_command{};
1729 Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
1730 has_active_aruid);
1731
1732 if (result.IsSuccess() && has_active_aruid) {
1733 result = IsVibrationHandleValid(parameters.vibration_device_handle);
1734 }
1735 if (result.IsSuccess() && has_active_aruid) {
1736 gc_device = GetResourceManager()->GetGcVibrationDevice(parameters.vibration_device_handle);
1737 }
1738 if (gc_device != nullptr) {
1739 result = gc_device->GetActualVibrationGcErmCommand(gc_erm_command);
1740 }
1741 if (result.IsError()) {
1742 gc_erm_command = Core::HID::VibrationGcErmCommand::Stop;
1743 }
1744
1755 IPC::ResponseBuilder rb{ctx, 4}; 1745 IPC::ResponseBuilder rb{ctx, 4};
1756 rb.Push(ResultSuccess); 1746 rb.Push(ResultSuccess);
1757 rb.PushEnum(gc_erm_command); 1747 rb.PushEnum(gc_erm_command);
@@ -1761,21 +1751,24 @@ void IHidServer::BeginPermitVibrationSession(HLERequestContext& ctx) {
1761 IPC::RequestParser rp{ctx}; 1751 IPC::RequestParser rp{ctx};
1762 const auto applet_resource_user_id{rp.Pop<u64>()}; 1752 const auto applet_resource_user_id{rp.Pop<u64>()};
1763 1753
1764 GetResourceManager()->GetNpad()->SetPermitVibrationSession(true);
1765
1766 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 1754 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
1767 1755
1756 const auto result =
1757 GetResourceManager()->GetNpad()->GetVibrationHandler()->BeginPermitVibrationSession(
1758 applet_resource_user_id);
1759
1768 IPC::ResponseBuilder rb{ctx, 2}; 1760 IPC::ResponseBuilder rb{ctx, 2};
1769 rb.Push(ResultSuccess); 1761 rb.Push(result);
1770} 1762}
1771 1763
1772void IHidServer::EndPermitVibrationSession(HLERequestContext& ctx) { 1764void IHidServer::EndPermitVibrationSession(HLERequestContext& ctx) {
1773 GetResourceManager()->GetNpad()->SetPermitVibrationSession(false);
1774
1775 LOG_DEBUG(Service_HID, "called"); 1765 LOG_DEBUG(Service_HID, "called");
1776 1766
1767 const auto result =
1768 GetResourceManager()->GetNpad()->GetVibrationHandler()->EndPermitVibrationSession();
1769
1777 IPC::ResponseBuilder rb{ctx, 2}; 1770 IPC::ResponseBuilder rb{ctx, 2};
1778 rb.Push(ResultSuccess); 1771 rb.Push(result);
1779} 1772}
1780 1773
1781void IHidServer::IsVibrationDeviceMounted(HLERequestContext& ctx) { 1774void IHidServer::IsVibrationDeviceMounted(HLERequestContext& ctx) {
@@ -1795,10 +1788,61 @@ void IHidServer::IsVibrationDeviceMounted(HLERequestContext& ctx) {
1795 parameters.vibration_device_handle.npad_id, 1788 parameters.vibration_device_handle.npad_id,
1796 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id); 1789 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
1797 1790
1791 bool is_mounted{};
1792 NpadVibrationBase* device{nullptr};
1793 Result result = IsVibrationHandleValid(parameters.vibration_device_handle);
1794
1795 if (result.IsSuccess()) {
1796 device = GetResourceManager()->GetVibrationDevice(parameters.vibration_device_handle);
1797 }
1798
1799 if (device != nullptr) {
1800 is_mounted = device->IsVibrationMounted();
1801 }
1802
1798 IPC::ResponseBuilder rb{ctx, 3}; 1803 IPC::ResponseBuilder rb{ctx, 3};
1799 rb.Push(ResultSuccess); 1804 rb.Push(result);
1800 rb.Push(GetResourceManager()->GetNpad()->IsVibrationDeviceMounted( 1805 rb.Push(is_mounted);
1801 parameters.applet_resource_user_id, parameters.vibration_device_handle)); 1806}
1807
1808void IHidServer::SendVibrationValueInBool(HLERequestContext& ctx) {
1809 IPC::RequestParser rp{ctx};
1810 struct Parameters {
1811 Core::HID::VibrationDeviceHandle vibration_device_handle;
1812 INSERT_PADDING_WORDS_NOINIT(1);
1813 u64 applet_resource_user_id;
1814 bool is_vibrating;
1815 };
1816 static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
1817
1818 const auto parameters{rp.PopRaw<Parameters>()};
1819
1820 LOG_DEBUG(Service_HID,
1821 "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}, "
1822 "is_vibrating={}",
1823 parameters.vibration_device_handle.npad_type,
1824 parameters.vibration_device_handle.npad_id,
1825 parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id,
1826 parameters.is_vibrating);
1827
1828 bool has_active_aruid{};
1829 NpadN64VibrationDevice* n64_device{nullptr};
1830 Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
1831 has_active_aruid);
1832
1833 if (result.IsSuccess() && has_active_aruid) {
1834 result = IsVibrationHandleValid(parameters.vibration_device_handle);
1835 }
1836 if (result.IsSuccess() && has_active_aruid) {
1837 n64_device =
1838 GetResourceManager()->GetN64VibrationDevice(parameters.vibration_device_handle);
1839 }
1840 if (n64_device != nullptr) {
1841 result = n64_device->SendValueInBool(parameters.is_vibrating);
1842 }
1843
1844 IPC::ResponseBuilder rb{ctx, 2};
1845 rb.Push(result);
1802} 1846}
1803 1847
1804void IHidServer::ActivateConsoleSixAxisSensor(HLERequestContext& ctx) { 1848void IHidServer::ActivateConsoleSixAxisSensor(HLERequestContext& ctx) {
diff --git a/src/core/hle/service/hid/hid_server.h b/src/core/hle/service/hid/hid_server.h
index cc7c4ebdd..3a2e0a230 100644
--- a/src/core/hle/service/hid/hid_server.h
+++ b/src/core/hle/service/hid/hid_server.h
@@ -97,6 +97,7 @@ private:
97 void BeginPermitVibrationSession(HLERequestContext& ctx); 97 void BeginPermitVibrationSession(HLERequestContext& ctx);
98 void EndPermitVibrationSession(HLERequestContext& ctx); 98 void EndPermitVibrationSession(HLERequestContext& ctx);
99 void IsVibrationDeviceMounted(HLERequestContext& ctx); 99 void IsVibrationDeviceMounted(HLERequestContext& ctx);
100 void SendVibrationValueInBool(HLERequestContext& ctx);
100 void ActivateConsoleSixAxisSensor(HLERequestContext& ctx); 101 void ActivateConsoleSixAxisSensor(HLERequestContext& ctx);
101 void StartConsoleSixAxisSensor(HLERequestContext& ctx); 102 void StartConsoleSixAxisSensor(HLERequestContext& ctx);
102 void StopConsoleSixAxisSensor(HLERequestContext& ctx); 103 void StopConsoleSixAxisSensor(HLERequestContext& ctx);
diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp
index 3a0cb3cb1..bf27ddfbf 100644
--- a/src/core/hle/service/hid/hid_system_server.cpp
+++ b/src/core/hle/service/hid/hid_system_server.cpp
@@ -7,6 +7,7 @@
7#include "hid_core/resource_manager.h" 7#include "hid_core/resource_manager.h"
8#include "hid_core/resources/npad/npad.h" 8#include "hid_core/resources/npad/npad.h"
9#include "hid_core/resources/npad/npad_types.h" 9#include "hid_core/resources/npad/npad_types.h"
10#include "hid_core/resources/npad/npad_vibration.h"
10#include "hid_core/resources/palma/palma.h" 11#include "hid_core/resources/palma/palma.h"
11#include "hid_core/resources/touch_screen/touch_screen.h" 12#include "hid_core/resources/touch_screen/touch_screen.h"
12 13
@@ -67,14 +68,14 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
67 {501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"}, 68 {501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"},
68 {502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"}, 69 {502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"},
69 {503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"}, 70 {503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"},
70 {504, nullptr, "SetAruidValidForVibration"}, 71 {504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"},
71 {505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"}, 72 {505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"},
72 {506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"}, 73 {506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"},
73 {507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"}, 74 {507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"},
74 {510, nullptr, "SetVibrationMasterVolume"}, 75 {510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"},
75 {511, nullptr, "GetVibrationMasterVolume"}, 76 {511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"},
76 {512, nullptr, "BeginPermitVibrationSession"}, 77 {512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
77 {513, nullptr, "EndPermitVibrationSession"}, 78 {513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
78 {514, nullptr, "Unknown514"}, 79 {514, nullptr, "Unknown514"},
79 {520, nullptr, "EnableHandheldHids"}, 80 {520, nullptr, "EnableHandheldHids"},
80 {521, nullptr, "DisableHandheldHids"}, 81 {521, nullptr, "DisableHandheldHids"},
@@ -156,7 +157,7 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
156 {1152, nullptr, "SetTouchScreenDefaultConfiguration"}, 157 {1152, nullptr, "SetTouchScreenDefaultConfiguration"},
157 {1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"}, 158 {1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
158 {1154, nullptr, "IsFirmwareAvailableForNotification"}, 159 {1154, nullptr, "IsFirmwareAvailableForNotification"},
159 {1155, nullptr, "SetForceHandheldStyleVibration"}, 160 {1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"},
160 {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"}, 161 {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
161 {1157, nullptr, "CancelConnectionTrigger"}, 162 {1157, nullptr, "CancelConnectionTrigger"},
162 {1200, nullptr, "IsButtonConfigSupported"}, 163 {1200, nullptr, "IsButtonConfigSupported"},
@@ -532,7 +533,28 @@ void IHidSystemServer::EnableAppletToGetInput(HLERequestContext& ctx) {
532 parameters.is_enabled, parameters.applet_resource_user_id); 533 parameters.is_enabled, parameters.applet_resource_user_id);
533 534
534 GetResourceManager()->EnableInput(parameters.applet_resource_user_id, parameters.is_enabled); 535 GetResourceManager()->EnableInput(parameters.applet_resource_user_id, parameters.is_enabled);
535 // GetResourceManager()->GetNpad()->EnableInput(parameters.applet_resource_user_id); 536 GetResourceManager()->GetNpad()->EnableAppletToGetInput(parameters.applet_resource_user_id);
537
538 IPC::ResponseBuilder rb{ctx, 2};
539 rb.Push(ResultSuccess);
540}
541
542void IHidSystemServer::SetAruidValidForVibration(HLERequestContext& ctx) {
543 IPC::RequestParser rp{ctx};
544 struct Parameters {
545 bool is_enabled;
546 INSERT_PADDING_WORDS_NOINIT(1);
547 u64 applet_resource_user_id;
548 };
549 static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
550
551 const auto parameters{rp.PopRaw<Parameters>()};
552
553 LOG_INFO(Service_HID, "called, is_enabled={}, applet_resource_user_id={}",
554 parameters.is_enabled, parameters.applet_resource_user_id);
555
556 GetResourceManager()->SetAruidValidForVibration(parameters.applet_resource_user_id,
557 parameters.is_enabled);
536 558
537 IPC::ResponseBuilder rb{ctx, 2}; 559 IPC::ResponseBuilder rb{ctx, 2};
538 rb.Push(ResultSuccess); 560 rb.Push(ResultSuccess);
@@ -574,7 +596,7 @@ void IHidSystemServer::EnableAppletToGetPadInput(HLERequestContext& ctx) {
574 parameters.is_enabled, parameters.applet_resource_user_id); 596 parameters.is_enabled, parameters.applet_resource_user_id);
575 597
576 GetResourceManager()->EnablePadInput(parameters.applet_resource_user_id, parameters.is_enabled); 598 GetResourceManager()->EnablePadInput(parameters.applet_resource_user_id, parameters.is_enabled);
577 // GetResourceManager()->GetNpad()->EnableInput(parameters.applet_resource_user_id); 599 GetResourceManager()->GetNpad()->EnableAppletToGetInput(parameters.applet_resource_user_id);
578 600
579 IPC::ResponseBuilder rb{ctx, 2}; 601 IPC::ResponseBuilder rb{ctx, 2};
580 rb.Push(ResultSuccess); 602 rb.Push(ResultSuccess);
@@ -601,6 +623,57 @@ void IHidSystemServer::EnableAppletToGetTouchScreen(HLERequestContext& ctx) {
601 rb.Push(ResultSuccess); 623 rb.Push(ResultSuccess);
602} 624}
603 625
626void IHidSystemServer::SetVibrationMasterVolume(HLERequestContext& ctx) {
627 IPC::RequestParser rp{ctx};
628 const auto master_volume{rp.Pop<f32>()};
629
630 LOG_INFO(Service_HID, "called, volume={}", master_volume);
631
632 const auto result =
633 GetResourceManager()->GetNpad()->GetVibrationHandler()->SetVibrationMasterVolume(
634 master_volume);
635
636 IPC::ResponseBuilder rb{ctx, 2};
637 rb.Push(result);
638}
639
640void IHidSystemServer::GetVibrationMasterVolume(HLERequestContext& ctx) {
641 f32 master_volume{};
642 const auto result =
643 GetResourceManager()->GetNpad()->GetVibrationHandler()->GetVibrationMasterVolume(
644 master_volume);
645
646 LOG_INFO(Service_HID, "called, volume={}", master_volume);
647
648 IPC::ResponseBuilder rb{ctx, 3};
649 rb.Push(result);
650 rb.Push(master_volume);
651}
652
653void IHidSystemServer::BeginPermitVibrationSession(HLERequestContext& ctx) {
654 IPC::RequestParser rp{ctx};
655 const auto applet_resource_user_id{rp.Pop<u64>()};
656
657 LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
658
659 const auto result =
660 GetResourceManager()->GetNpad()->GetVibrationHandler()->BeginPermitVibrationSession(
661 applet_resource_user_id);
662
663 IPC::ResponseBuilder rb{ctx, 2};
664 rb.Push(result);
665}
666
667void IHidSystemServer::EndPermitVibrationSession(HLERequestContext& ctx) {
668 LOG_INFO(Service_HID, "called");
669
670 const auto result =
671 GetResourceManager()->GetNpad()->GetVibrationHandler()->EndPermitVibrationSession();
672
673 IPC::ResponseBuilder rb{ctx, 2};
674 rb.Push(result);
675}
676
604void IHidSystemServer::IsJoyConAttachedOnAllRail(HLERequestContext& ctx) { 677void IHidSystemServer::IsJoyConAttachedOnAllRail(HLERequestContext& ctx) {
605 const bool is_attached = true; 678 const bool is_attached = true;
606 679
@@ -749,6 +822,19 @@ void IHidSystemServer::GetTouchScreenDefaultConfiguration(HLERequestContext& ctx
749 rb.PushRaw(touchscreen_config); 822 rb.PushRaw(touchscreen_config);
750} 823}
751 824
825void IHidSystemServer::SetForceHandheldStyleVibration(HLERequestContext& ctx) {
826 IPC::RequestParser rp{ctx};
827 const auto is_forced{rp.Pop<bool>()};
828
829 LOG_INFO(Service_HID, "called, is_forced={}", is_forced);
830
831 GetResourceManager()->SetForceHandheldStyleVibration(is_forced);
832 GetResourceManager()->GetNpad()->UpdateHandheldAbstractState();
833
834 IPC::ResponseBuilder rb{ctx, 2};
835 rb.Push(ResultSuccess);
836}
837
752void IHidSystemServer::IsUsingCustomButtonConfig(HLERequestContext& ctx) { 838void IHidSystemServer::IsUsingCustomButtonConfig(HLERequestContext& ctx) {
753 const bool is_enabled = false; 839 const bool is_enabled = false;
754 840
diff --git a/src/core/hle/service/hid/hid_system_server.h b/src/core/hle/service/hid/hid_system_server.h
index 0c2634e3f..90a719f02 100644
--- a/src/core/hle/service/hid/hid_system_server.h
+++ b/src/core/hle/service/hid/hid_system_server.h
@@ -42,9 +42,14 @@ private:
42 void RegisterAppletResourceUserId(HLERequestContext& ctx); 42 void RegisterAppletResourceUserId(HLERequestContext& ctx);
43 void UnregisterAppletResourceUserId(HLERequestContext& ctx); 43 void UnregisterAppletResourceUserId(HLERequestContext& ctx);
44 void EnableAppletToGetInput(HLERequestContext& ctx); 44 void EnableAppletToGetInput(HLERequestContext& ctx);
45 void SetAruidValidForVibration(HLERequestContext& ctx);
45 void EnableAppletToGetSixAxisSensor(HLERequestContext& ctx); 46 void EnableAppletToGetSixAxisSensor(HLERequestContext& ctx);
46 void EnableAppletToGetPadInput(HLERequestContext& ctx); 47 void EnableAppletToGetPadInput(HLERequestContext& ctx);
47 void EnableAppletToGetTouchScreen(HLERequestContext& ctx); 48 void EnableAppletToGetTouchScreen(HLERequestContext& ctx);
49 void SetVibrationMasterVolume(HLERequestContext& ctx);
50 void GetVibrationMasterVolume(HLERequestContext& ctx);
51 void BeginPermitVibrationSession(HLERequestContext& ctx);
52 void EndPermitVibrationSession(HLERequestContext& ctx);
48 void IsJoyConAttachedOnAllRail(HLERequestContext& ctx); 53 void IsJoyConAttachedOnAllRail(HLERequestContext& ctx);
49 void AcquireConnectionTriggerTimeoutEvent(HLERequestContext& ctx); 54 void AcquireConnectionTriggerTimeoutEvent(HLERequestContext& ctx);
50 void AcquireDeviceRegisteredEventForControllerSupport(HLERequestContext& ctx); 55 void AcquireDeviceRegisteredEventForControllerSupport(HLERequestContext& ctx);
@@ -61,6 +66,7 @@ private:
61 void FinalizeUsbFirmwareUpdate(HLERequestContext& ctx); 66 void FinalizeUsbFirmwareUpdate(HLERequestContext& ctx);
62 void InitializeUsbFirmwareUpdateWithoutMemory(HLERequestContext& ctx); 67 void InitializeUsbFirmwareUpdateWithoutMemory(HLERequestContext& ctx);
63 void GetTouchScreenDefaultConfiguration(HLERequestContext& ctx); 68 void GetTouchScreenDefaultConfiguration(HLERequestContext& ctx);
69 void SetForceHandheldStyleVibration(HLERequestContext& ctx);
64 void IsUsingCustomButtonConfig(HLERequestContext& ctx); 70 void IsUsingCustomButtonConfig(HLERequestContext& ctx);
65 71
66 std::shared_ptr<ResourceManager> GetResourceManager(); 72 std::shared_ptr<ResourceManager> GetResourceManager();
diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp
index 31cc87acc..cc7776efc 100644
--- a/src/core/hle/service/nfc/common/device.cpp
+++ b/src/core/hle/service/nfc/common/device.cpp
@@ -441,7 +441,10 @@ Result NfcDevice::Mount(NFP::ModelType model_type, NFP::MountTarget mount_target
441 device_state = DeviceState::TagMounted; 441 device_state = DeviceState::TagMounted;
442 mount_target = mount_target_; 442 mount_target = mount_target_;
443 443
444 if (!is_corrupted && mount_target != NFP::MountTarget::Rom) { 444 const bool create_backup =
445 mount_target == NFP::MountTarget::All || mount_target == NFP::MountTarget::Ram ||
446 (mount_target == NFP::MountTarget::Rom && HasBackup(encrypted_tag_data.uuid).IsError());
447 if (!is_corrupted && create_backup) {
445 std::vector<u8> data(sizeof(NFP::EncryptedNTAG215File)); 448 std::vector<u8> data(sizeof(NFP::EncryptedNTAG215File));
446 memcpy(data.data(), &encrypted_tag_data, sizeof(encrypted_tag_data)); 449 memcpy(data.data(), &encrypted_tag_data, sizeof(encrypted_tag_data));
447 WriteBackupData(encrypted_tag_data.uuid, data); 450 WriteBackupData(encrypted_tag_data.uuid, data);
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp
index 423b9aef1..71d6fdb0c 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.cpp
+++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp
@@ -112,9 +112,7 @@ void Nvnflinger::ShutdownLayers() {
112 { 112 {
113 const auto lock_guard = Lock(); 113 const auto lock_guard = Lock();
114 for (auto& display : displays) { 114 for (auto& display : displays) {
115 for (size_t layer = 0; layer < display.GetNumLayers(); ++layer) { 115 display.Abandon();
116 display.GetLayer(layer).GetConsumer().Abandon();
117 }
118 } 116 }
119 117
120 is_abandoned = true; 118 is_abandoned = true;
@@ -176,24 +174,28 @@ void Nvnflinger::CreateLayerAtId(VI::Display& display, u64 layer_id) {
176 display.CreateLayer(layer_id, buffer_id, nvdrv->container); 174 display.CreateLayer(layer_id, buffer_id, nvdrv->container);
177} 175}
178 176
179void Nvnflinger::OpenLayer(u64 layer_id) { 177bool Nvnflinger::OpenLayer(u64 layer_id) {
180 const auto lock_guard = Lock(); 178 const auto lock_guard = Lock();
181 179
182 for (auto& display : displays) { 180 for (auto& display : displays) {
183 if (auto* layer = display.FindLayer(layer_id); layer) { 181 if (auto* layer = display.FindLayer(layer_id); layer) {
184 layer->Open(); 182 return layer->Open();
185 } 183 }
186 } 184 }
185
186 return false;
187} 187}
188 188
189void Nvnflinger::CloseLayer(u64 layer_id) { 189bool Nvnflinger::CloseLayer(u64 layer_id) {
190 const auto lock_guard = Lock(); 190 const auto lock_guard = Lock();
191 191
192 for (auto& display : displays) { 192 for (auto& display : displays) {
193 if (auto* layer = display.FindLayer(layer_id); layer) { 193 if (auto* layer = display.FindLayer(layer_id); layer) {
194 layer->Close(); 194 return layer->Close();
195 } 195 }
196 } 196 }
197
198 return false;
197} 199}
198 200
199void Nvnflinger::DestroyLayer(u64 layer_id) { 201void Nvnflinger::DestroyLayer(u64 layer_id) {
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.h b/src/core/hle/service/nvnflinger/nvnflinger.h
index 871285764..a60e0ae6b 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.h
+++ b/src/core/hle/service/nvnflinger/nvnflinger.h
@@ -74,10 +74,10 @@ public:
74 [[nodiscard]] std::optional<u64> CreateLayer(u64 display_id); 74 [[nodiscard]] std::optional<u64> CreateLayer(u64 display_id);
75 75
76 /// Opens a layer on all displays for the given layer ID. 76 /// Opens a layer on all displays for the given layer ID.
77 void OpenLayer(u64 layer_id); 77 bool OpenLayer(u64 layer_id);
78 78
79 /// Closes a layer on all displays for the given layer ID. 79 /// Closes a layer on all displays for the given layer ID.
80 void CloseLayer(u64 layer_id); 80 bool CloseLayer(u64 layer_id);
81 81
82 /// Destroys the given layer ID. 82 /// Destroys the given layer ID.
83 void DestroyLayer(u64 layer_id); 83 void DestroyLayer(u64 layer_id);
diff --git a/src/core/hle/service/set/private_settings.h b/src/core/hle/service/set/private_settings.h
deleted file mode 100644
index b63eaf45c..000000000
--- a/src/core/hle/service/set/private_settings.h
+++ /dev/null
@@ -1,72 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <array>
7
8#include "common/bit_field.h"
9#include "common/common_funcs.h"
10#include "common/common_types.h"
11#include "common/uuid.h"
12#include "core/hle/service/time/clock_types.h"
13
14namespace Service::Set {
15
16/// This is nn::settings::system::InitialLaunchFlag
17struct InitialLaunchFlag {
18 union {
19 u32 raw{};
20
21 BitField<0, 1, u32> InitialLaunchCompletionFlag;
22 BitField<8, 1, u32> InitialLaunchUserAdditionFlag;
23 BitField<16, 1, u32> InitialLaunchTimestampFlag;
24 };
25};
26static_assert(sizeof(InitialLaunchFlag) == 4, "InitialLaunchFlag is an invalid size");
27
28/// This is nn::settings::system::InitialLaunchSettings
29struct InitialLaunchSettings {
30 InitialLaunchFlag flags;
31 INSERT_PADDING_BYTES(0x4);
32 Service::Time::Clock::SteadyClockTimePoint timestamp;
33};
34static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size");
35
36#pragma pack(push, 4)
37struct InitialLaunchSettingsPacked {
38 InitialLaunchFlag flags;
39 Service::Time::Clock::SteadyClockTimePoint timestamp;
40};
41#pragma pack(pop)
42static_assert(sizeof(InitialLaunchSettingsPacked) == 0x1C,
43 "InitialLaunchSettingsPacked is incorrect size");
44
45struct PrivateSettings {
46 std::array<u8, 0x10> reserved_00;
47
48 // nn::settings::system::InitialLaunchSettings
49 InitialLaunchSettings initial_launch_settings;
50
51 std::array<u8, 0x20> reserved_30;
52
53 Common::UUID external_clock_source_id;
54 s64 shutdown_rtc_value;
55 s64 external_steady_clock_internal_offset;
56
57 std::array<u8, 0x60> reserved_70;
58
59 // nn::settings::system::PlatformRegion
60 std::array<u8, 0x4> platform_region;
61
62 std::array<u8, 0x4> reserved_D4;
63};
64static_assert(offsetof(PrivateSettings, initial_launch_settings) == 0x10);
65static_assert(offsetof(PrivateSettings, external_clock_source_id) == 0x50);
66static_assert(offsetof(PrivateSettings, reserved_70) == 0x70);
67static_assert(offsetof(PrivateSettings, platform_region) == 0xD0);
68static_assert(sizeof(PrivateSettings) == 0xD8, "PrivateSettings has the wrong size!");
69
70PrivateSettings DefaultPrivateSettings();
71
72} // namespace Service::Set
diff --git a/src/core/hle/service/set/appln_settings.cpp b/src/core/hle/service/set/setting_formats/appln_settings.cpp
index a5d802757..f7c7d5b91 100644
--- a/src/core/hle/service/set/appln_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/appln_settings.cpp
@@ -1,12 +1,16 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/set/appln_settings.h" 4#include "core/hle/service/set/setting_formats/appln_settings.h"
5 5
6namespace Service::Set { 6namespace Service::Set {
7 7
8ApplnSettings DefaultApplnSettings() { 8ApplnSettings DefaultApplnSettings() {
9 return {}; 9 ApplnSettings settings{};
10
11 settings.mii_author_id = Common::UUID::MakeDefault();
12
13 return settings;
10} 14}
11 15
12} // namespace Service::Set 16} // namespace Service::Set
diff --git a/src/core/hle/service/set/appln_settings.h b/src/core/hle/service/set/setting_formats/appln_settings.h
index 126375860..ba9af998a 100644
--- a/src/core/hle/service/set/appln_settings.h
+++ b/src/core/hle/service/set/setting_formats/appln_settings.h
@@ -7,24 +7,23 @@
7#include <cstddef> 7#include <cstddef>
8 8
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "common/uuid.h"
11#include "core/hle/service/set/settings_types.h"
10 12
11namespace Service::Set { 13namespace Service::Set {
12struct ApplnSettings { 14struct ApplnSettings {
13 std::array<u8, 0x10> reserved_000; 15 INSERT_PADDING_BYTES(0x10); // Reserved
14 16
15 // nn::util::Uuid MiiAuthorId, copied from system settings 0x94B0 17 // nn::util::Uuid MiiAuthorId, copied from system settings 0x94B0
16 std::array<u8, 0x10> mii_author_id; 18 Common::UUID mii_author_id;
17 19 INSERT_PADDING_BYTES(0x30); // Reserved
18 std::array<u8, 0x30> reserved_020;
19 20
20 // nn::settings::system::ServiceDiscoveryControlSettings 21 // nn::settings::system::ServiceDiscoveryControlSettings
21 std::array<u8, 0x4> service_discovery_control_settings; 22 u32 service_discovery_control_settings;
22 23 INSERT_PADDING_BYTES(0x20); // Reserved
23 std::array<u8, 0x20> reserved_054;
24 24
25 bool in_repair_process_enable_flag; 25 bool in_repair_process_enable_flag;
26 26 INSERT_PADDING_BYTES(0x3);
27 std::array<u8, 0x3> pad_075;
28}; 27};
29static_assert(offsetof(ApplnSettings, mii_author_id) == 0x10); 28static_assert(offsetof(ApplnSettings, mii_author_id) == 0x10);
30static_assert(offsetof(ApplnSettings, service_discovery_control_settings) == 0x50); 29static_assert(offsetof(ApplnSettings, service_discovery_control_settings) == 0x50);
diff --git a/src/core/hle/service/set/device_settings.cpp b/src/core/hle/service/set/setting_formats/device_settings.cpp
index e423ce38a..5f295404d 100644
--- a/src/core/hle/service/set/device_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/device_settings.cpp
@@ -1,7 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/set/device_settings.h" 4#include "core/hle/service/set/setting_formats/device_settings.h"
5 5
6namespace Service::Set { 6namespace Service::Set {
7 7
diff --git a/src/core/hle/service/set/device_settings.h b/src/core/hle/service/set/setting_formats/device_settings.h
index f291d0ebe..2827756f6 100644
--- a/src/core/hle/service/set/device_settings.h
+++ b/src/core/hle/service/set/setting_formats/device_settings.h
@@ -7,10 +7,12 @@
7#include <cstddef> 7#include <cstddef>
8 8
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "common/vector_math.h"
11#include "core/hle/service/set/settings_types.h"
10 12
11namespace Service::Set { 13namespace Service::Set {
12struct DeviceSettings { 14struct DeviceSettings {
13 std::array<u8, 0x10> reserved_000; 15 INSERT_PADDING_BYTES(0x10); // Reserved
14 16
15 // nn::settings::BatteryLot 17 // nn::settings::BatteryLot
16 std::array<u8, 0x18> ptm_battery_lot; 18 std::array<u8, 0x18> ptm_battery_lot;
@@ -19,26 +21,24 @@ struct DeviceSettings {
19 u8 ptm_battery_version; 21 u8 ptm_battery_version;
20 // nn::settings::system::PtmCycleCountReliability 22 // nn::settings::system::PtmCycleCountReliability
21 u32 ptm_cycle_count_reliability; 23 u32 ptm_cycle_count_reliability;
22 24 INSERT_PADDING_BYTES(0x48); // Reserved
23 std::array<u8, 0x48> reserved_048;
24 25
25 // nn::settings::system::AnalogStickUserCalibration L 26 // nn::settings::system::AnalogStickUserCalibration L
26 std::array<u8, 0x10> analog_user_stick_calibration_l; 27 std::array<u8, 0x10> analog_user_stick_calibration_l;
27 // nn::settings::system::AnalogStickUserCalibration R 28 // nn::settings::system::AnalogStickUserCalibration R
28 std::array<u8, 0x10> analog_user_stick_calibration_r; 29 std::array<u8, 0x10> analog_user_stick_calibration_r;
29 30 INSERT_PADDING_BYTES(0x20); // Reserved
30 std::array<u8, 0x20> reserved_0B0;
31 31
32 // nn::settings::system::ConsoleSixAxisSensorAccelerationBias 32 // nn::settings::system::ConsoleSixAxisSensorAccelerationBias
33 std::array<u8, 0xC> console_six_axis_sensor_acceleration_bias; 33 Common::Vec3<f32> console_six_axis_sensor_acceleration_bias;
34 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityBias 34 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityBias
35 std::array<u8, 0xC> console_six_axis_sensor_angular_velocity_bias; 35 Common::Vec3<f32> console_six_axis_sensor_angular_velocity_bias;
36 // nn::settings::system::ConsoleSixAxisSensorAccelerationGain 36 // nn::settings::system::ConsoleSixAxisSensorAccelerationGain
37 std::array<u8, 0x24> console_six_axis_sensor_acceleration_gain; 37 std::array<u8, 0x24> console_six_axis_sensor_acceleration_gain;
38 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityGain 38 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityGain
39 std::array<u8, 0x24> console_six_axis_sensor_angular_velocity_gain; 39 std::array<u8, 0x24> console_six_axis_sensor_angular_velocity_gain;
40 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityTimeBias 40 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityTimeBias
41 std::array<u8, 0xC> console_six_axis_sensor_angular_velocity_time_bias; 41 Common::Vec3<f32> console_six_axis_sensor_angular_velocity_time_bias;
42 // nn::settings::system::ConsoleSixAxisSensorAngularAcceleration 42 // nn::settings::system::ConsoleSixAxisSensorAngularAcceleration
43 std::array<u8, 0x24> console_six_axis_sensor_angular_acceleration; 43 std::array<u8, 0x24> console_six_axis_sensor_angular_acceleration;
44}; 44};
diff --git a/src/core/hle/service/set/private_settings.cpp b/src/core/hle/service/set/setting_formats/private_settings.cpp
index 70bf65727..81c362482 100644
--- a/src/core/hle/service/set/private_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/private_settings.cpp
@@ -1,7 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/set/private_settings.h" 4#include "core/hle/service/set/setting_formats/private_settings.h"
5 5
6namespace Service::Set { 6namespace Service::Set {
7 7
diff --git a/src/core/hle/service/set/setting_formats/private_settings.h b/src/core/hle/service/set/setting_formats/private_settings.h
new file mode 100644
index 000000000..6c40f62e1
--- /dev/null
+++ b/src/core/hle/service/set/setting_formats/private_settings.h
@@ -0,0 +1,39 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <array>
7
8#include "common/common_types.h"
9#include "common/uuid.h"
10#include "core/hle/service/set/settings_types.h"
11#include "core/hle/service/time/clock_types.h"
12
13namespace Service::Set {
14
15struct PrivateSettings {
16 INSERT_PADDING_BYTES(0x10); // Reserved
17
18 InitialLaunchSettings initial_launch_settings;
19 INSERT_PADDING_BYTES(0x20); // Reserved
20
21 Common::UUID external_clock_source_id;
22 s64 shutdown_rtc_value;
23 s64 external_steady_clock_internal_offset;
24 INSERT_PADDING_BYTES(0x60); // Reserved
25
26 // nn::settings::system::PlatformRegion
27 s32 platform_region;
28 INSERT_PADDING_BYTES(0x4); // Reserved
29};
30static_assert(offsetof(PrivateSettings, initial_launch_settings) == 0x10);
31static_assert(offsetof(PrivateSettings, external_clock_source_id) == 0x50);
32static_assert(offsetof(PrivateSettings, shutdown_rtc_value) == 0x60);
33static_assert(offsetof(PrivateSettings, external_steady_clock_internal_offset) == 0x68);
34static_assert(offsetof(PrivateSettings, platform_region) == 0xD0);
35static_assert(sizeof(PrivateSettings) == 0xD8, "PrivateSettings has the wrong size!");
36
37PrivateSettings DefaultPrivateSettings();
38
39} // namespace Service::Set
diff --git a/src/core/hle/service/set/system_settings.cpp b/src/core/hle/service/set/setting_formats/system_settings.cpp
index 5977429b2..66e57651e 100644
--- a/src/core/hle/service/set/system_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/system_settings.cpp
@@ -1,7 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/set/system_settings.h" 4#include "core/hle/service/set/setting_formats/system_settings.h"
5 5
6namespace Service::Set { 6namespace Service::Set {
7 7
@@ -11,6 +11,8 @@ SystemSettings DefaultSystemSettings() {
11 settings.version = 0x140000; 11 settings.version = 0x140000;
12 settings.flags = 7; 12 settings.flags = 7;
13 13
14 settings.mii_author_id = Common::UUID::MakeDefault();
15
14 settings.color_set_id = ColorSet::BasicWhite; 16 settings.color_set_id = ColorSet::BasicWhite;
15 17
16 settings.notification_settings = { 18 settings.notification_settings = {
@@ -45,6 +47,10 @@ SystemSettings DefaultSystemSettings() {
45 settings.device_time_zone_location_name = {"UTC"}; 47 settings.device_time_zone_location_name = {"UTC"};
46 settings.user_system_clock_automatic_correction_enabled = false; 48 settings.user_system_clock_automatic_correction_enabled = false;
47 49
50 settings.primary_album_storage = PrimaryAlbumStorage::SdCard;
51 settings.battery_percentage_flag = true;
52 settings.chinese_traditional_input_method = ChineseTraditionalInputMethod::Unknown0;
53
48 return settings; 54 return settings;
49} 55}
50 56
diff --git a/src/core/hle/service/set/system_settings.h b/src/core/hle/service/set/setting_formats/system_settings.h
index 6ec9e71e7..14654f8b1 100644
--- a/src/core/hle/service/set/system_settings.h
+++ b/src/core/hle/service/set/setting_formats/system_settings.h
@@ -8,272 +8,14 @@
8#include "common/bit_field.h" 8#include "common/bit_field.h"
9#include "common/common_funcs.h" 9#include "common/common_funcs.h"
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "core/hle/service/set/private_settings.h" 11#include "common/uuid.h"
12#include "common/vector_math.h"
13#include "core/hle/service/set/setting_formats/private_settings.h"
14#include "core/hle/service/set/settings_types.h"
12#include "core/hle/service/time/clock_types.h" 15#include "core/hle/service/time/clock_types.h"
13 16
14namespace Service::Set { 17namespace Service::Set {
15 18
16/// This is "nn::settings::LanguageCode", which is a NUL-terminated string stored in a u64.
17enum class LanguageCode : u64 {
18 JA = 0x000000000000616A,
19 EN_US = 0x00000053552D6E65,
20 FR = 0x0000000000007266,
21 DE = 0x0000000000006564,
22 IT = 0x0000000000007469,
23 ES = 0x0000000000007365,
24 ZH_CN = 0x0000004E432D687A,
25 KO = 0x0000000000006F6B,
26 NL = 0x0000000000006C6E,
27 PT = 0x0000000000007470,
28 RU = 0x0000000000007572,
29 ZH_TW = 0x00000057542D687A,
30 EN_GB = 0x00000042472D6E65,
31 FR_CA = 0x00000041432D7266,
32 ES_419 = 0x00003931342D7365,
33 ZH_HANS = 0x00736E61482D687A,
34 ZH_HANT = 0x00746E61482D687A,
35 PT_BR = 0x00000052422D7470,
36};
37
38/// This is nn::settings::system::ErrorReportSharePermission
39enum class ErrorReportSharePermission : u32 {
40 NotConfirmed,
41 Granted,
42 Denied,
43};
44
45/// This is nn::settings::system::ChineseTraditionalInputMethod
46enum class ChineseTraditionalInputMethod : u32 {
47 Unknown0 = 0,
48 Unknown1 = 1,
49 Unknown2 = 2,
50};
51
52/// This is nn::settings::system::HomeMenuScheme
53struct HomeMenuScheme {
54 u32 main;
55 u32 back;
56 u32 sub;
57 u32 bezel;
58 u32 extra;
59};
60static_assert(sizeof(HomeMenuScheme) == 0x14, "HomeMenuScheme is incorrect size");
61
62/// Indicates the current theme set by the system settings
63enum class ColorSet : u32 {
64 BasicWhite = 0,
65 BasicBlack = 1,
66};
67
68/// Indicates the current console is a retail or kiosk unit
69enum class QuestFlag : u8 {
70 Retail = 0,
71 Kiosk = 1,
72};
73
74/// This is nn::settings::system::RegionCode
75enum class RegionCode : u32 {
76 Japan,
77 Usa,
78 Europe,
79 Australia,
80 HongKongTaiwanKorea,
81 China,
82};
83
84/// This is nn::settings::system::AccountSettings
85struct AccountSettings {
86 u32 flags;
87};
88static_assert(sizeof(AccountSettings) == 4, "AccountSettings is an invalid size");
89
90/// This is nn::settings::system::NotificationVolume
91enum class NotificationVolume : u32 {
92 Mute,
93 Low,
94 High,
95};
96
97/// This is nn::settings::system::NotificationFlag
98struct NotificationFlag {
99 union {
100 u32 raw{};
101
102 BitField<0, 1, u32> RingtoneFlag;
103 BitField<1, 1, u32> DownloadCompletionFlag;
104 BitField<8, 1, u32> EnablesNews;
105 BitField<9, 1, u32> IncomingLampFlag;
106 };
107};
108static_assert(sizeof(NotificationFlag) == 4, "NotificationFlag is an invalid size");
109
110/// This is nn::settings::system::NotificationTime
111struct NotificationTime {
112 u32 hour;
113 u32 minute;
114};
115static_assert(sizeof(NotificationTime) == 0x8, "NotificationTime is an invalid size");
116
117/// This is nn::settings::system::NotificationSettings
118struct NotificationSettings {
119 NotificationFlag flags;
120 NotificationVolume volume;
121 NotificationTime start_time;
122 NotificationTime stop_time;
123};
124static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size");
125
126/// This is nn::settings::system::AccountNotificationFlag
127struct AccountNotificationFlag {
128 union {
129 u32 raw{};
130
131 BitField<0, 1, u32> FriendOnlineFlag;
132 BitField<1, 1, u32> FriendRequestFlag;
133 BitField<8, 1, u32> CoralInvitationFlag;
134 };
135};
136static_assert(sizeof(AccountNotificationFlag) == 4, "AccountNotificationFlag is an invalid size");
137
138/// This is nn::settings::system::FriendPresenceOverlayPermission
139enum class FriendPresenceOverlayPermission : u8 {
140 NotConfirmed,
141 NoDisplay,
142 FavoriteFriends,
143 Friends,
144};
145
146/// This is nn::settings::system::AccountNotificationSettings
147struct AccountNotificationSettings {
148 Common::UUID uid;
149 AccountNotificationFlag flags;
150 FriendPresenceOverlayPermission friend_presence_permission;
151 FriendPresenceOverlayPermission friend_invitation_permission;
152 INSERT_PADDING_BYTES(0x2);
153};
154static_assert(sizeof(AccountNotificationSettings) == 0x18,
155 "AccountNotificationSettings is an invalid size");
156
157/// This is nn::settings::system::TvFlag
158struct TvFlag {
159 union {
160 u32 raw{};
161
162 BitField<0, 1, u32> Allows4k;
163 BitField<1, 1, u32> Allows3d;
164 BitField<2, 1, u32> AllowsCec;
165 BitField<3, 1, u32> PreventsScreenBurnIn;
166 };
167};
168static_assert(sizeof(TvFlag) == 4, "TvFlag is an invalid size");
169
170/// This is nn::settings::system::TvResolution
171enum class TvResolution : u32 {
172 Auto,
173 Resolution1080p,
174 Resolution720p,
175 Resolution480p,
176};
177
178/// This is nn::settings::system::HdmiContentType
179enum class HdmiContentType : u32 {
180 None,
181 Graphics,
182 Cinema,
183 Photo,
184 Game,
185};
186
187/// This is nn::settings::system::RgbRange
188enum class RgbRange : u32 {
189 Auto,
190 Full,
191 Limited,
192};
193
194/// This is nn::settings::system::CmuMode
195enum class CmuMode : u32 {
196 None,
197 ColorInvert,
198 HighContrast,
199 GrayScale,
200};
201
202/// This is nn::settings::system::TvSettings
203struct TvSettings {
204 TvFlag flags;
205 TvResolution tv_resolution;
206 HdmiContentType hdmi_content_type;
207 RgbRange rgb_range;
208 CmuMode cmu_mode;
209 u32 tv_underscan;
210 f32 tv_gama;
211 f32 contrast_ratio;
212};
213static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size");
214
215/// This is nn::settings::system::PrimaryAlbumStorage
216enum class PrimaryAlbumStorage : u32 {
217 Nand,
218 SdCard,
219};
220
221/// This is nn::settings::system::HandheldSleepPlan
222enum class HandheldSleepPlan : u32 {
223 Sleep1Min,
224 Sleep3Min,
225 Sleep5Min,
226 Sleep10Min,
227 Sleep30Min,
228 Never,
229};
230
231/// This is nn::settings::system::ConsoleSleepPlan
232enum class ConsoleSleepPlan : u32 {
233 Sleep1Hour,
234 Sleep2Hour,
235 Sleep3Hour,
236 Sleep6Hour,
237 Sleep12Hour,
238 Never,
239};
240
241/// This is nn::settings::system::SleepFlag
242struct SleepFlag {
243 union {
244 u32 raw{};
245
246 BitField<0, 1, u32> SleepsWhilePlayingMedia;
247 BitField<1, 1, u32> WakesAtPowerStateChange;
248 };
249};
250static_assert(sizeof(SleepFlag) == 4, "TvFlag is an invalid size");
251
252/// This is nn::settings::system::SleepSettings
253struct SleepSettings {
254 SleepFlag flags;
255 HandheldSleepPlan handheld_sleep_plan;
256 ConsoleSleepPlan console_sleep_plan;
257};
258static_assert(sizeof(SleepSettings) == 0xc, "SleepSettings is incorrect size");
259
260/// This is nn::settings::system::EulaVersionClockType
261enum class EulaVersionClockType : u32 {
262 NetworkSystemClock,
263 SteadyClock,
264};
265
266/// This is nn::settings::system::EulaVersion
267struct EulaVersion {
268 u32 version;
269 RegionCode region_code;
270 EulaVersionClockType clock_type;
271 INSERT_PADDING_BYTES(0x4);
272 s64 posix_time;
273 Time::Clock::SteadyClockTimePoint timestamp;
274};
275static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size");
276
277struct SystemSettings { 19struct SystemSettings {
278 // 0/unwritten (1.0.0), 0x20000 (2.0.0), 0x30000 (3.0.0-3.0.1), 0x40001 (4.0.0-4.1.0), 0x50000 20 // 0/unwritten (1.0.0), 0x20000 (2.0.0), 0x30000 (3.0.0-3.0.1), 0x40001 (4.0.0-4.1.0), 0x50000
279 // (5.0.0-5.1.0), 0x60000 (6.0.0-6.2.0), 0x70000 (7.0.0), 0x80000 (8.0.0-8.1.1), 0x90000 21 // (5.0.0-5.1.0), 0x60000 (6.0.0-6.2.0), 0x70000 (7.0.0), 0x80000 (8.0.0-8.1.1), 0x90000
@@ -283,20 +25,16 @@ struct SystemSettings {
283 // 0/unwritten (1.0.0), 1 (6.0.0-8.1.0), 2 (8.1.1), 7 (9.0.0+). 25 // 0/unwritten (1.0.0), 1 (6.0.0-8.1.0), 2 (8.1.1), 7 (9.0.0+).
284 // if (flags & 2), defaults are written for AnalogStickUserCalibration 26 // if (flags & 2), defaults are written for AnalogStickUserCalibration
285 u32 flags; 27 u32 flags;
28 INSERT_PADDING_BYTES(0x8); // Reserved
286 29
287 std::array<u8, 0x8> reserved_00008;
288
289 // nn::settings::LanguageCode
290 LanguageCode language_code; 30 LanguageCode language_code;
291 31 INSERT_PADDING_BYTES(0x38); // Reserved
292 std::array<u8, 0x38> reserved_00018;
293 32
294 // nn::settings::system::NetworkSettings 33 // nn::settings::system::NetworkSettings
295 u32 network_setting_count; 34 u32 network_setting_count;
296 bool wireless_lan_enable_flag; 35 bool wireless_lan_enable_flag;
297 std::array<u8, 0x3> pad_00055; 36 INSERT_PADDING_BYTES(0x3);
298 37 INSERT_PADDING_BYTES(0x8); // Reserved
299 std::array<u8, 0x8> reserved_00058;
300 38
301 // nn::settings::system::NetworkSettings 39 // nn::settings::system::NetworkSettings
302 std::array<std::array<u8, 0x400>, 32> network_settings_1B0; 40 std::array<std::array<u8, 0x400>, 32> network_settings_1B0;
@@ -304,161 +42,142 @@ struct SystemSettings {
304 // nn::settings::system::BluetoothDevicesSettings 42 // nn::settings::system::BluetoothDevicesSettings
305 std::array<u8, 0x4> bluetooth_device_settings_count; 43 std::array<u8, 0x4> bluetooth_device_settings_count;
306 bool bluetooth_enable_flag; 44 bool bluetooth_enable_flag;
307 std::array<u8, 0x3> pad_08065; 45 INSERT_PADDING_BYTES(0x3);
308 bool bluetooth_afh_enable_flag; 46 bool bluetooth_afh_enable_flag;
309 std::array<u8, 0x3> pad_08069; 47 INSERT_PADDING_BYTES(0x3);
310 bool bluetooth_boost_enable_flag; 48 bool bluetooth_boost_enable_flag;
311 std::array<u8, 0x3> pad_0806D; 49 INSERT_PADDING_BYTES(0x3);
312 std::array<std::array<u8, 0x200>, 10> bluetooth_device_settings_first_10; 50 std::array<std::array<u8, 0x200>, 10> bluetooth_device_settings_first_10;
313 51
314 s32 ldn_channel; 52 s32 ldn_channel;
315 53 INSERT_PADDING_BYTES(0x3C); // Reserved
316 std::array<u8, 0x3C> reserved_09474;
317 54
318 // nn::util::Uuid MiiAuthorId 55 // nn::util::Uuid MiiAuthorId
319 std::array<u8, 0x10> mii_author_id; 56 Common::UUID mii_author_id;
320 57
321 std::array<u8, 0x30> reserved_094C0; 58 INSERT_PADDING_BYTES(0x30); // Reserved
322 59
323 // nn::settings::system::NxControllerSettings 60 // nn::settings::system::NxControllerSettings
324 u32 nx_controller_settings_count; 61 u32 nx_controller_settings_count;
325 62
326 std::array<u8, 0xC> reserved_094F4; 63 INSERT_PADDING_BYTES(0xC); // Reserved
327 64
328 // nn::settings::system::NxControllerSettings, 65 // nn::settings::system::NxControllerSettings,
329 // nn::settings::system::NxControllerLegacySettings on 13.0.0+ 66 // nn::settings::system::NxControllerLegacySettings on 13.0.0+
330 std::array<std::array<u8, 0x40>, 10> nx_controller_legacy_settings; 67 std::array<std::array<u8, 0x40>, 10> nx_controller_legacy_settings;
331 68 INSERT_PADDING_BYTES(0x170); // Reserved
332 std::array<u8, 0x170> reserved_09780;
333 69
334 bool external_rtc_reset_flag; 70 bool external_rtc_reset_flag;
335 std::array<u8, 0x3> pad_098F1; 71 INSERT_PADDING_BYTES(0x3);
336 72 INSERT_PADDING_BYTES(0x3C); // Reserved
337 std::array<u8, 0x3C> reserved_098F4;
338 73
339 s32 push_notification_activity_mode_on_sleep; 74 s32 push_notification_activity_mode_on_sleep;
75 INSERT_PADDING_BYTES(0x3C); // Reserved
340 76
341 std::array<u8, 0x3C> reserved_09934;
342
343 // nn::settings::system::ErrorReportSharePermission
344 ErrorReportSharePermission error_report_share_permission; 77 ErrorReportSharePermission error_report_share_permission;
78 INSERT_PADDING_BYTES(0x3C); // Reserved
345 79
346 std::array<u8, 0x3C> reserved_09974; 80 KeyboardLayout keyboard_layout;
347 81 INSERT_PADDING_BYTES(0x3C); // Reserved
348 // nn::settings::KeyboardLayout
349 std::array<u8, 0x4> keyboard_layout;
350
351 std::array<u8, 0x3C> reserved_099B4;
352 82
353 bool web_inspector_flag; 83 bool web_inspector_flag;
354 std::array<u8, 0x3> pad_099F1; 84 INSERT_PADDING_BYTES(0x3);
355 85
356 // nn::settings::system::AllowedSslHost 86 // nn::settings::system::AllowedSslHost
357 u32 allowed_ssl_host_count; 87 u32 allowed_ssl_host_count;
358 88
359 bool memory_usage_rate_flag; 89 bool memory_usage_rate_flag;
360 std::array<u8, 0x3> pad_099F9; 90 INSERT_PADDING_BYTES(0x3);
361 91 INSERT_PADDING_BYTES(0x34); // Reserved
362 std::array<u8, 0x34> reserved_099FC;
363 92
364 // nn::settings::system::HostFsMountPoint 93 // nn::settings::system::HostFsMountPoint
365 std::array<u8, 0x100> host_fs_mount_point; 94 std::array<u8, 0x100> host_fs_mount_point;
366 95
367 // nn::settings::system::AllowedSslHost 96 // nn::settings::system::AllowedSslHost
368 std::array<std::array<u8, 0x100>, 8> allowed_ssl_hosts; 97 std::array<std::array<u8, 0x100>, 8> allowed_ssl_hosts;
369 98 INSERT_PADDING_BYTES(0x6C0); // Reserved
370 std::array<u8, 0x6C0> reserved_0A330;
371 99
372 // nn::settings::system::BlePairingSettings 100 // nn::settings::system::BlePairingSettings
373 u32 ble_pairing_settings_count; 101 u32 ble_pairing_settings_count;
374 std::array<u8, 0xC> reserved_0A9F4; 102 INSERT_PADDING_BYTES(0xC); // Reserved
375 std::array<std::array<u8, 0x80>, 10> ble_pairing_settings; 103 std::array<std::array<u8, 0x80>, 10> ble_pairing_settings;
376 104
377 // nn::settings::system::AccountOnlineStorageSettings 105 // nn::settings::system::AccountOnlineStorageSettings
378 u32 account_online_storage_settings_count; 106 u32 account_online_storage_settings_count;
379 std::array<u8, 0xC> reserved_0AF04; 107 INSERT_PADDING_BYTES(0xC); // Reserved
380 std::array<std::array<u8, 0x40>, 8> account_online_storage_settings; 108 std::array<std::array<u8, 0x40>, 8> account_online_storage_settings;
381 109
382 bool pctl_ready_flag; 110 bool pctl_ready_flag;
383 std::array<u8, 0x3> pad_0B111; 111 INSERT_PADDING_BYTES(0x3);
384 112 INSERT_PADDING_BYTES(0x3C); // Reserved
385 std::array<u8, 0x3C> reserved_0B114;
386 113
387 // nn::settings::system::ThemeId 114 // nn::settings::system::ThemeId
388 std::array<u8, 0x80> theme_id_type0; 115 std::array<u8, 0x80> theme_id_type0;
389 std::array<u8, 0x80> theme_id_type1; 116 std::array<u8, 0x80> theme_id_type1;
117 INSERT_PADDING_BYTES(0x100); // Reserved
390 118
391 std::array<u8, 0x100> reserved_0B250;
392
393 // nn::settings::ChineseTraditionalInputMethod
394 ChineseTraditionalInputMethod chinese_traditional_input_method; 119 ChineseTraditionalInputMethod chinese_traditional_input_method;
395 120 INSERT_PADDING_BYTES(0x3C); // Reserved
396 std::array<u8, 0x3C> reserved_0B354;
397 121
398 bool zoom_flag; 122 bool zoom_flag;
399 std::array<u8, 0x3> pad_0B391; 123 INSERT_PADDING_BYTES(0x3);
400 124 INSERT_PADDING_BYTES(0x3C); // Reserved
401 std::array<u8, 0x3C> reserved_0B394;
402 125
403 // nn::settings::system::ButtonConfigRegisteredSettings 126 // nn::settings::system::ButtonConfigRegisteredSettings
404 u32 button_config_registered_settings_count; 127 u32 button_config_registered_settings_count;
405 std::array<u8, 0xC> reserved_0B3D4; 128 INSERT_PADDING_BYTES(0xC); // Reserved
406 129
407 // nn::settings::system::ButtonConfigSettings 130 // nn::settings::system::ButtonConfigSettings
408 u32 button_config_settings_count; 131 u32 button_config_settings_count;
409 std::array<u8, 0x4> reserved_0B3E4; 132 INSERT_PADDING_BYTES(0x4); // Reserved
410 std::array<std::array<u8, 0x5A8>, 5> button_config_settings; 133 std::array<std::array<u8, 0x5A8>, 5> button_config_settings;
411 std::array<u8, 0x13B0> reserved_0D030; 134 INSERT_PADDING_BYTES(0x13B0); // Reserved
412 u32 button_config_settings_embedded_count; 135 u32 button_config_settings_embedded_count;
413 std::array<u8, 0x4> reserved_0E3E4; 136 INSERT_PADDING_BYTES(0x4); // Reserved
414 std::array<std::array<u8, 0x5A8>, 5> button_config_settings_embedded; 137 std::array<std::array<u8, 0x5A8>, 5> button_config_settings_embedded;
415 std::array<u8, 0x13B0> reserved_10030; 138 INSERT_PADDING_BYTES(0x13B0); // Reserved
416 u32 button_config_settings_left_count; 139 u32 button_config_settings_left_count;
417 std::array<u8, 0x4> reserved_113E4; 140 INSERT_PADDING_BYTES(0x4); // Reserved
418 std::array<std::array<u8, 0x5A8>, 5> button_config_settings_left; 141 std::array<std::array<u8, 0x5A8>, 5> button_config_settings_left;
419 std::array<u8, 0x13B0> reserved_13030; 142 INSERT_PADDING_BYTES(0x13B0); // Reserved
420 u32 button_config_settings_right_count; 143 u32 button_config_settings_right_count;
421 std::array<u8, 0x4> reserved_143E4; 144 INSERT_PADDING_BYTES(0x4); // Reserved
422 std::array<std::array<u8, 0x5A8>, 5> button_config_settings_right; 145 std::array<std::array<u8, 0x5A8>, 5> button_config_settings_right;
423 std::array<u8, 0x73B0> reserved_16030; 146 INSERT_PADDING_BYTES(0x73B0); // Reserved
424 // nn::settings::system::ButtonConfigRegisteredSettings 147 // nn::settings::system::ButtonConfigRegisteredSettings
425 std::array<u8, 0x5C8> button_config_registered_settings_embedded; 148 std::array<u8, 0x5C8> button_config_registered_settings_embedded;
426 std::array<std::array<u8, 0x5C8>, 10> button_config_registered_settings; 149 std::array<std::array<u8, 0x5C8>, 10> button_config_registered_settings;
427 150 INSERT_PADDING_BYTES(0x7FF8); // Reserved
428 std::array<u8, 0x7FF8> reserved_21378;
429 151
430 // nn::settings::system::ConsoleSixAxisSensorAccelerationBias 152 // nn::settings::system::ConsoleSixAxisSensorAccelerationBias
431 std::array<u8, 0xC> console_six_axis_sensor_acceleration_bias; 153 Common::Vec3<f32> console_six_axis_sensor_acceleration_bias;
432 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityBias 154 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityBias
433 std::array<u8, 0xC> console_six_axis_sensor_angular_velocity_bias; 155 Common::Vec3<f32> console_six_axis_sensor_angular_velocity_bias;
434 // nn::settings::system::ConsoleSixAxisSensorAccelerationGain 156 // nn::settings::system::ConsoleSixAxisSensorAccelerationGain
435 std::array<u8, 0x24> console_six_axis_sensor_acceleration_gain; 157 std::array<u8, 0x24> console_six_axis_sensor_acceleration_gain;
436 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityGain 158 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityGain
437 std::array<u8, 0x24> console_six_axis_sensor_angular_velocity_gain; 159 std::array<u8, 0x24> console_six_axis_sensor_angular_velocity_gain;
438 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityTimeBias 160 // nn::settings::system::ConsoleSixAxisSensorAngularVelocityTimeBias
439 std::array<u8, 0xC> console_six_axis_sensor_angular_velocity_time_bias; 161 Common::Vec3<f32> console_six_axis_sensor_angular_velocity_time_bias;
440 // nn::settings::system::ConsoleSixAxisSensorAngularAcceleration 162 // nn::settings::system::ConsoleSixAxisSensorAngularAcceleration
441 std::array<u8, 0x24> console_six_axis_sensor_angular_velocity_acceleration; 163 std::array<u8, 0x24> console_six_axis_sensor_angular_velocity_acceleration;
442 164 INSERT_PADDING_BYTES(0x70); // Reserved
443 std::array<u8, 0x70> reserved_29400;
444 165
445 bool lock_screen_flag; 166 bool lock_screen_flag;
446 std::array<u8, 0x3> pad_29471; 167 INSERT_PADDING_BYTES(0x3);
447 168 INSERT_PADDING_BYTES(0x4); // Reserved
448 std::array<u8, 0x4> reserved_249274;
449 169
450 ColorSet color_set_id; 170 ColorSet color_set_id;
451 171
452 QuestFlag quest_flag; 172 QuestFlag quest_flag;
453 173
454 // nn::settings::system::RegionCode 174 SystemRegionCode region_code;
455 RegionCode region_code;
456 175
457 // Different to nn::settings::system::InitialLaunchSettings? 176 // Different to nn::settings::system::InitialLaunchSettings?
458 InitialLaunchSettingsPacked initial_launch_settings_packed; 177 InitialLaunchSettingsPacked initial_launch_settings_packed;
459 178
460 bool battery_percentage_flag; 179 bool battery_percentage_flag;
461 std::array<u8, 0x3> pad_294A1; 180 INSERT_PADDING_BYTES(0x3);
462 181
463 // BitFlagSet<32, nn::settings::system::AppletLaunchFlag> 182 // BitFlagSet<32, nn::settings::system::AppletLaunchFlag>
464 u32 applet_launch_flag; 183 u32 applet_launch_flag;
@@ -469,33 +188,26 @@ struct SystemSettings {
469 std::array<u8, 0x10> theme_key; 188 std::array<u8, 0x10> theme_key;
470 189
471 bool field_testing_flag; 190 bool field_testing_flag;
472 std::array<u8, 0x3> pad_294C1; 191 INSERT_PADDING_BYTES(0x3);
473 192
474 s32 panel_crc_mode; 193 s32 panel_crc_mode;
475 194 INSERT_PADDING_BYTES(0x28); // Reserved
476 std::array<u8, 0x28> reserved_294C8;
477 195
478 // nn::settings::system::BacklightSettings 196 // nn::settings::system::BacklightSettings
479 std::array<u8, 0x2C> backlight_settings_mixed_up; 197 std::array<u8, 0x2C> backlight_settings_mixed_up;
198 INSERT_PADDING_BYTES(0x64); // Reserved
480 199
481 std::array<u8, 0x64> reserved_2951C;
482
483 // nn::time::SystemClockContext
484 Service::Time::Clock::SystemClockContext user_system_clock_context; 200 Service::Time::Clock::SystemClockContext user_system_clock_context;
485 Service::Time::Clock::SystemClockContext network_system_clock_context; 201 Service::Time::Clock::SystemClockContext network_system_clock_context;
486 bool user_system_clock_automatic_correction_enabled; 202 bool user_system_clock_automatic_correction_enabled;
487 std::array<u8, 0x3> pad_295C1; 203 INSERT_PADDING_BYTES(0x3);
488 std::array<u8, 0x4> reserved_295C4; 204 INSERT_PADDING_BYTES(0x4); // Reserved
489 // nn::time::SteadyClockTimePoint
490 Service::Time::Clock::SteadyClockTimePoint 205 Service::Time::Clock::SteadyClockTimePoint
491 user_system_clock_automatic_correction_updated_time_point; 206 user_system_clock_automatic_correction_updated_time_point;
207 INSERT_PADDING_BYTES(0x10); // Reserved
492 208
493 std::array<u8, 0x10> reserved_295E0;
494
495 // nn::settings::system::AccountSettings
496 AccountSettings account_settings; 209 AccountSettings account_settings;
497 210 INSERT_PADDING_BYTES(0xFC); // Reserved
498 std::array<u8, 0xFC> reserved_295F4;
499 211
500 // nn::settings::system::AudioVolume 212 // nn::settings::system::AudioVolume
501 std::array<u8, 0x8> audio_volume_type0; 213 std::array<u8, 0x8> audio_volume_type0;
@@ -505,47 +217,42 @@ struct SystemSettings {
505 s32 audio_output_mode_type1; 217 s32 audio_output_mode_type1;
506 s32 audio_output_mode_type2; 218 s32 audio_output_mode_type2;
507 bool force_mute_on_headphone_removed; 219 bool force_mute_on_headphone_removed;
508 std::array<u8, 0x3> pad_2970D; 220 INSERT_PADDING_BYTES(0x3);
509 s32 headphone_volume_warning_count; 221 s32 headphone_volume_warning_count;
510 bool heaphone_volume_update_flag; 222 bool heaphone_volume_update_flag;
511 std::array<u8, 0x3> pad_29715; 223 INSERT_PADDING_BYTES(0x3);
512 // nn::settings::system::AudioVolume 224 // nn::settings::system::AudioVolume
513 std::array<u8, 0x8> audio_volume_type2; 225 std::array<u8, 0x8> audio_volume_type2;
514 // nn::settings::system::AudioOutputMode 226 // nn::settings::system::AudioOutputMode
515 s32 audio_output_mode_type3; 227 s32 audio_output_mode_type3;
516 s32 audio_output_mode_type4; 228 s32 audio_output_mode_type4;
517 bool hearing_protection_safeguard_flag; 229 bool hearing_protection_safeguard_flag;
518 std::array<u8, 0x3> pad_29729; 230 INSERT_PADDING_BYTES(0x3);
519 std::array<u8, 0x4> reserved_2972C; 231 INSERT_PADDING_BYTES(0x4); // Reserved
520 s64 hearing_protection_safeguard_remaining_time; 232 s64 hearing_protection_safeguard_remaining_time;
521 std::array<u8, 0x38> reserved_29738; 233 INSERT_PADDING_BYTES(0x38); // Reserved
522 234
523 bool console_information_upload_flag; 235 bool console_information_upload_flag;
524 std::array<u8, 0x3> pad_29771; 236 INSERT_PADDING_BYTES(0x3);
525 237 INSERT_PADDING_BYTES(0x3C); // Reserved
526 std::array<u8, 0x3C> reserved_29774;
527 238
528 bool automatic_application_download_flag; 239 bool automatic_application_download_flag;
529 std::array<u8, 0x3> pad_297B1; 240 INSERT_PADDING_BYTES(0x3);
530 241 INSERT_PADDING_BYTES(0x4); // Reserved
531 std::array<u8, 0x4> reserved_297B4;
532 242
533 // nn::settings::system::NotificationSettings
534 NotificationSettings notification_settings; 243 NotificationSettings notification_settings;
535 244 INSERT_PADDING_BYTES(0x60); // Reserved
536 std::array<u8, 0x60> reserved_297D0;
537 245
538 // nn::settings::system::AccountNotificationSettings 246 // nn::settings::system::AccountNotificationSettings
539 u32 account_notification_settings_count; 247 u32 account_notification_settings_count;
540 std::array<u8, 0xC> reserved_29834; 248 INSERT_PADDING_BYTES(0xC); // Reserved
541 std::array<AccountNotificationSettings, 8> account_notification_settings; 249 std::array<AccountNotificationSettings, 8> account_notification_settings;
542 250 INSERT_PADDING_BYTES(0x140); // Reserved
543 std::array<u8, 0x140> reserved_29900;
544 251
545 f32 vibration_master_volume; 252 f32 vibration_master_volume;
546 253
547 bool usb_full_key_enable_flag; 254 bool usb_full_key_enable_flag;
548 std::array<u8, 0x3> pad_29A45; 255 INSERT_PADDING_BYTES(0x3);
549 256
550 // nn::settings::system::AnalogStickUserCalibration 257 // nn::settings::system::AnalogStickUserCalibration
551 std::array<u8, 0x10> analog_stick_user_calibration_left; 258 std::array<u8, 0x10> analog_stick_user_calibration_left;
@@ -553,85 +260,68 @@ struct SystemSettings {
553 260
554 // nn::settings::system::TouchScreenMode 261 // nn::settings::system::TouchScreenMode
555 s32 touch_screen_mode; 262 s32 touch_screen_mode;
263 INSERT_PADDING_BYTES(0x14); // Reserved
556 264
557 std::array<u8, 0x14> reserved_29A6C;
558
559 // nn::settings::system::TvSettings
560 TvSettings tv_settings; 265 TvSettings tv_settings;
561 266
562 // nn::settings::system::Edid 267 // nn::settings::system::Edid
563 std::array<u8, 0x100> edid; 268 std::array<u8, 0x100> edid;
564 269 INSERT_PADDING_BYTES(0x2E0); // Reserved
565 std::array<u8, 0x2E0> reserved_29BA0;
566 270
567 // nn::settings::system::DataDeletionSettings 271 // nn::settings::system::DataDeletionSettings
568 std::array<u8, 0x8> data_deletion_settings; 272 std::array<u8, 0x8> data_deletion_settings;
569 273 INSERT_PADDING_BYTES(0x38); // Reserved
570 std::array<u8, 0x38> reserved_29E88;
571 274
572 // nn::ncm::ProgramId 275 // nn::ncm::ProgramId
573 std::array<u8, 0x8> initial_system_applet_program_id; 276 std::array<u8, 0x8> initial_system_applet_program_id;
574 std::array<u8, 0x8> overlay_disp_program_id; 277 std::array<u8, 0x8> overlay_disp_program_id;
575 278 INSERT_PADDING_BYTES(0x4); // Reserved
576 std::array<u8, 0x4> reserved_29ED0;
577 279
578 bool requires_run_repair_time_reviser; 280 bool requires_run_repair_time_reviser;
281 INSERT_PADDING_BYTES(0x6B); // Reserved
579 282
580 std::array<u8, 0x6B> reserved_29ED5;
581
582 // nn::time::LocationName
583 Service::Time::TimeZone::LocationName device_time_zone_location_name; 283 Service::Time::TimeZone::LocationName device_time_zone_location_name;
584 std::array<u8, 0x4> reserved_29F64; 284 INSERT_PADDING_BYTES(0x4); // Reserved
585 // nn::time::SteadyClockTimePoint
586 Service::Time::Clock::SteadyClockTimePoint device_time_zone_location_updated_time; 285 Service::Time::Clock::SteadyClockTimePoint device_time_zone_location_updated_time;
587 286 INSERT_PADDING_BYTES(0xC0); // Reserved
588 std::array<u8, 0xC0> reserved_29F80;
589 287
590 // nn::settings::system::PrimaryAlbumStorage 288 // nn::settings::system::PrimaryAlbumStorage
591 PrimaryAlbumStorage primary_album_storage; 289 PrimaryAlbumStorage primary_album_storage;
592 290 INSERT_PADDING_BYTES(0x3C); // Reserved
593 std::array<u8, 0x3C> reserved_2A044;
594 291
595 bool usb_30_enable_flag; 292 bool usb_30_enable_flag;
596 std::array<u8, 0x3> pad_2A081; 293 INSERT_PADDING_BYTES(0x3);
597 bool usb_30_host_enable_flag; 294 bool usb_30_host_enable_flag;
598 std::array<u8, 0x3> pad_2A085; 295 INSERT_PADDING_BYTES(0x3);
599 bool usb_30_device_enable_flag; 296 bool usb_30_device_enable_flag;
600 std::array<u8, 0x3> pad_2A089; 297 INSERT_PADDING_BYTES(0x3);
601 298 INSERT_PADDING_BYTES(0x34); // Reserved
602 std::array<u8, 0x34> reserved_2A08C;
603 299
604 bool nfc_enable_flag; 300 bool nfc_enable_flag;
605 std::array<u8, 0x3> pad_2A0C1; 301 INSERT_PADDING_BYTES(0x3);
606 302 INSERT_PADDING_BYTES(0x3C); // Reserved
607 std::array<u8, 0x3C> reserved_2A0C4;
608 303
609 // nn::settings::system::SleepSettings 304 // nn::settings::system::SleepSettings
610 SleepSettings sleep_settings; 305 SleepSettings sleep_settings;
611 306 INSERT_PADDING_BYTES(0x34); // Reserved
612 std::array<u8, 0x34> reserved_2A10C;
613 307
614 // nn::settings::system::EulaVersion 308 // nn::settings::system::EulaVersion
615 u32 eula_version_count; 309 u32 eula_version_count;
616 std::array<u8, 0xC> reserved_2A144; 310 INSERT_PADDING_BYTES(0xC); // Reserved
617 std::array<EulaVersion, 32> eula_versions; 311 std::array<EulaVersion, 32> eula_versions;
618 312 INSERT_PADDING_BYTES(0x200); // Reserved
619 std::array<u8, 0x200> reserved_2A750;
620 313
621 // nn::settings::system::DeviceNickName 314 // nn::settings::system::DeviceNickName
622 std::array<u8, 0x80> device_nick_name; 315 std::array<u8, 0x80> device_nick_name;
623 316 INSERT_PADDING_BYTES(0x80); // Reserved
624 std::array<u8, 0x80> reserved_2A9D0;
625 317
626 bool auto_update_enable_flag; 318 bool auto_update_enable_flag;
627 std::array<u8, 0x3> pad_2AA51; 319 INSERT_PADDING_BYTES(0x3);
628 320 INSERT_PADDING_BYTES(0x4C); // Reserved
629 std::array<u8, 0x4C> reserved_2AA54;
630 321
631 // nn::settings::system::BluetoothDevicesSettings 322 // nn::settings::system::BluetoothDevicesSettings
632 std::array<std::array<u8, 0x200>, 14> bluetooth_device_settings_last_14; 323 std::array<std::array<u8, 0x200>, 14> bluetooth_device_settings_last_14;
633 324 INSERT_PADDING_BYTES(0x2000); // Reserved
634 std::array<u8, 0x2000> reserved_2C6A0;
635 325
636 // nn::settings::system::NxControllerSettings 326 // nn::settings::system::NxControllerSettings
637 std::array<std::array<u8, 0x800>, 10> nx_controller_settings_data_from_offset_30; 327 std::array<std::array<u8, 0x800>, 10> nx_controller_settings_data_from_offset_30;
diff --git a/src/core/hle/service/set/settings_server.h b/src/core/hle/service/set/settings_server.h
index a4e78db6c..8304e8424 100644
--- a/src/core/hle/service/set/settings_server.h
+++ b/src/core/hle/service/set/settings_server.h
@@ -4,72 +4,13 @@
4#pragma once 4#pragma once
5 5
6#include "core/hle/service/service.h" 6#include "core/hle/service/service.h"
7#include "core/hle/service/set/system_settings.h" 7#include "core/hle/service/set/settings_types.h"
8 8
9namespace Core { 9namespace Core {
10class System; 10class System;
11} 11}
12 12
13namespace Service::Set { 13namespace Service::Set {
14enum class KeyboardLayout : u64 {
15 Japanese = 0,
16 EnglishUs = 1,
17 EnglishUsInternational = 2,
18 EnglishUk = 3,
19 French = 4,
20 FrenchCa = 5,
21 Spanish = 6,
22 SpanishLatin = 7,
23 German = 8,
24 Italian = 9,
25 Portuguese = 10,
26 Russian = 11,
27 Korean = 12,
28 ChineseSimplified = 13,
29 ChineseTraditional = 14,
30};
31
32constexpr std::array<LanguageCode, 18> available_language_codes = {{
33 LanguageCode::JA,
34 LanguageCode::EN_US,
35 LanguageCode::FR,
36 LanguageCode::DE,
37 LanguageCode::IT,
38 LanguageCode::ES,
39 LanguageCode::ZH_CN,
40 LanguageCode::KO,
41 LanguageCode::NL,
42 LanguageCode::PT,
43 LanguageCode::RU,
44 LanguageCode::ZH_TW,
45 LanguageCode::EN_GB,
46 LanguageCode::FR_CA,
47 LanguageCode::ES_419,
48 LanguageCode::ZH_HANS,
49 LanguageCode::ZH_HANT,
50 LanguageCode::PT_BR,
51}};
52
53static constexpr std::array<std::pair<LanguageCode, KeyboardLayout>, 18> language_to_layout{{
54 {LanguageCode::JA, KeyboardLayout::Japanese},
55 {LanguageCode::EN_US, KeyboardLayout::EnglishUs},
56 {LanguageCode::FR, KeyboardLayout::French},
57 {LanguageCode::DE, KeyboardLayout::German},
58 {LanguageCode::IT, KeyboardLayout::Italian},
59 {LanguageCode::ES, KeyboardLayout::Spanish},
60 {LanguageCode::ZH_CN, KeyboardLayout::ChineseSimplified},
61 {LanguageCode::KO, KeyboardLayout::Korean},
62 {LanguageCode::NL, KeyboardLayout::EnglishUsInternational},
63 {LanguageCode::PT, KeyboardLayout::Portuguese},
64 {LanguageCode::RU, KeyboardLayout::Russian},
65 {LanguageCode::ZH_TW, KeyboardLayout::ChineseTraditional},
66 {LanguageCode::EN_GB, KeyboardLayout::EnglishUk},
67 {LanguageCode::FR_CA, KeyboardLayout::FrenchCa},
68 {LanguageCode::ES_419, KeyboardLayout::SpanishLatin},
69 {LanguageCode::ZH_HANS, KeyboardLayout::ChineseSimplified},
70 {LanguageCode::ZH_HANT, KeyboardLayout::ChineseTraditional},
71 {LanguageCode::PT_BR, KeyboardLayout::Portuguese},
72}};
73 14
74LanguageCode GetLanguageCodeFromIndex(std::size_t idx); 15LanguageCode GetLanguageCodeFromIndex(std::size_t idx);
75 16
diff --git a/src/core/hle/service/set/settings_types.h b/src/core/hle/service/set/settings_types.h
new file mode 100644
index 000000000..4dee202d7
--- /dev/null
+++ b/src/core/hle/service/set/settings_types.h
@@ -0,0 +1,451 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <array>
7
8#include "common/bit_field.h"
9#include "common/common_funcs.h"
10#include "common/common_types.h"
11#include "common/uuid.h"
12#include "core/hle/service/time/clock_types.h"
13
14namespace Service::Set {
15
16/// This is nn::settings::system::AudioOutputMode
17enum class AudioOutputMode : u32 {
18 ch_1,
19 ch_2,
20 ch_5_1,
21 ch_7_1,
22};
23
24/// This is nn::settings::system::AudioOutputModeTarget
25enum class AudioOutputModeTarget : u32 {
26 Hdmi,
27 Speaker,
28 Headphone,
29};
30
31/// This is nn::settings::system::AudioVolumeTarget
32enum class AudioVolumeTarget : u32 {
33 Speaker,
34 Headphone,
35};
36
37/// This is nn::settings::system::ClockSourceId
38enum class ClockSourceId : u32 {
39 NetworkSystemClock,
40 SteadyClock,
41};
42
43/// This is nn::settings::system::CmuMode
44enum class CmuMode : u32 {
45 None,
46 ColorInvert,
47 HighContrast,
48 GrayScale,
49};
50
51/// This is nn::settings::system::ChineseTraditionalInputMethod
52enum class ChineseTraditionalInputMethod : u32 {
53 Unknown0 = 0,
54 Unknown1 = 1,
55 Unknown2 = 2,
56};
57
58/// Indicates the current theme set by the system settings
59enum class ColorSet : u32 {
60 BasicWhite = 0,
61 BasicBlack = 1,
62};
63
64/// This is nn::settings::system::ConsoleSleepPlan
65enum class ConsoleSleepPlan : u32 {
66 Sleep1Hour,
67 Sleep2Hour,
68 Sleep3Hour,
69 Sleep6Hour,
70 Sleep12Hour,
71 Never,
72};
73
74/// This is nn::settings::system::ErrorReportSharePermission
75enum class ErrorReportSharePermission : u32 {
76 NotConfirmed,
77 Granted,
78 Denied,
79};
80
81/// This is nn::settings::system::EulaVersionClockType
82enum class EulaVersionClockType : u32 {
83 NetworkSystemClock,
84 SteadyClock,
85};
86
87/// This is nn::settings::factory::RegionCode
88enum class FactoryRegionCode : u32 {
89 Japan,
90 Usa,
91 Europe,
92 Australia,
93 China,
94 Korea,
95 Taiwan,
96};
97
98/// This is nn::settings::system::FriendPresenceOverlayPermission
99enum class FriendPresenceOverlayPermission : u8 {
100 NotConfirmed,
101 NoDisplay,
102 FavoriteFriends,
103 Friends,
104};
105
106enum class GetFirmwareVersionType {
107 Version1,
108 Version2,
109};
110
111/// This is nn::settings::system::HandheldSleepPlan
112enum class HandheldSleepPlan : u32 {
113 Sleep1Min,
114 Sleep3Min,
115 Sleep5Min,
116 Sleep10Min,
117 Sleep30Min,
118 Never,
119};
120
121/// This is nn::settings::system::HdmiContentType
122enum class HdmiContentType : u32 {
123 None,
124 Graphics,
125 Cinema,
126 Photo,
127 Game,
128};
129
130enum class KeyboardLayout : u32 {
131 Japanese = 0,
132 EnglishUs = 1,
133 EnglishUsInternational = 2,
134 EnglishUk = 3,
135 French = 4,
136 FrenchCa = 5,
137 Spanish = 6,
138 SpanishLatin = 7,
139 German = 8,
140 Italian = 9,
141 Portuguese = 10,
142 Russian = 11,
143 Korean = 12,
144 ChineseSimplified = 13,
145 ChineseTraditional = 14,
146};
147
148/// This is "nn::settings::LanguageCode", which is a NUL-terminated string stored in a u64.
149enum class LanguageCode : u64 {
150 JA = 0x000000000000616A,
151 EN_US = 0x00000053552D6E65,
152 FR = 0x0000000000007266,
153 DE = 0x0000000000006564,
154 IT = 0x0000000000007469,
155 ES = 0x0000000000007365,
156 ZH_CN = 0x0000004E432D687A,
157 KO = 0x0000000000006F6B,
158 NL = 0x0000000000006C6E,
159 PT = 0x0000000000007470,
160 RU = 0x0000000000007572,
161 ZH_TW = 0x00000057542D687A,
162 EN_GB = 0x00000042472D6E65,
163 FR_CA = 0x00000041432D7266,
164 ES_419 = 0x00003931342D7365,
165 ZH_HANS = 0x00736E61482D687A,
166 ZH_HANT = 0x00746E61482D687A,
167 PT_BR = 0x00000052422D7470,
168};
169
170/// This is nn::settings::system::NotificationVolume
171enum class NotificationVolume : u32 {
172 Mute,
173 Low,
174 High,
175};
176
177/// This is nn::settings::system::PrimaryAlbumStorage
178enum class PrimaryAlbumStorage : u32 {
179 Nand,
180 SdCard,
181};
182
183/// Indicates the current console is a retail or kiosk unit
184enum class QuestFlag : u8 {
185 Retail = 0,
186 Kiosk = 1,
187};
188
189/// This is nn::settings::system::RgbRange
190enum class RgbRange : u32 {
191 Auto,
192 Full,
193 Limited,
194};
195
196/// This is nn::settings::system::RegionCode
197enum class SystemRegionCode : u32 {
198 Japan,
199 Usa,
200 Europe,
201 Australia,
202 HongKongTaiwanKorea,
203 China,
204};
205
206/// This is nn::settings::system::TouchScreenMode
207enum class TouchScreenMode : u32 {
208 Stylus,
209 Standard,
210};
211
212/// This is nn::settings::system::TvResolution
213enum class TvResolution : u32 {
214 Auto,
215 Resolution1080p,
216 Resolution720p,
217 Resolution480p,
218};
219
220constexpr std::array<LanguageCode, 18> available_language_codes = {{
221 LanguageCode::JA,
222 LanguageCode::EN_US,
223 LanguageCode::FR,
224 LanguageCode::DE,
225 LanguageCode::IT,
226 LanguageCode::ES,
227 LanguageCode::ZH_CN,
228 LanguageCode::KO,
229 LanguageCode::NL,
230 LanguageCode::PT,
231 LanguageCode::RU,
232 LanguageCode::ZH_TW,
233 LanguageCode::EN_GB,
234 LanguageCode::FR_CA,
235 LanguageCode::ES_419,
236 LanguageCode::ZH_HANS,
237 LanguageCode::ZH_HANT,
238 LanguageCode::PT_BR,
239}};
240
241static constexpr std::array<std::pair<LanguageCode, KeyboardLayout>, 18> language_to_layout{{
242 {LanguageCode::JA, KeyboardLayout::Japanese},
243 {LanguageCode::EN_US, KeyboardLayout::EnglishUs},
244 {LanguageCode::FR, KeyboardLayout::French},
245 {LanguageCode::DE, KeyboardLayout::German},
246 {LanguageCode::IT, KeyboardLayout::Italian},
247 {LanguageCode::ES, KeyboardLayout::Spanish},
248 {LanguageCode::ZH_CN, KeyboardLayout::ChineseSimplified},
249 {LanguageCode::KO, KeyboardLayout::Korean},
250 {LanguageCode::NL, KeyboardLayout::EnglishUsInternational},
251 {LanguageCode::PT, KeyboardLayout::Portuguese},
252 {LanguageCode::RU, KeyboardLayout::Russian},
253 {LanguageCode::ZH_TW, KeyboardLayout::ChineseTraditional},
254 {LanguageCode::EN_GB, KeyboardLayout::EnglishUk},
255 {LanguageCode::FR_CA, KeyboardLayout::FrenchCa},
256 {LanguageCode::ES_419, KeyboardLayout::SpanishLatin},
257 {LanguageCode::ZH_HANS, KeyboardLayout::ChineseSimplified},
258 {LanguageCode::ZH_HANT, KeyboardLayout::ChineseTraditional},
259 {LanguageCode::PT_BR, KeyboardLayout::Portuguese},
260}};
261
262/// This is nn::settings::system::AccountNotificationFlag
263struct AccountNotificationFlag {
264 union {
265 u32 raw{};
266
267 BitField<0, 1, u32> FriendOnlineFlag;
268 BitField<1, 1, u32> FriendRequestFlag;
269 BitField<8, 1, u32> CoralInvitationFlag;
270 };
271};
272static_assert(sizeof(AccountNotificationFlag) == 4, "AccountNotificationFlag is an invalid size");
273
274/// This is nn::settings::system::AccountSettings
275struct AccountSettings {
276 u32 flags;
277};
278static_assert(sizeof(AccountSettings) == 4, "AccountSettings is an invalid size");
279
280/// This is nn::settings::system::DataDeletionFlag
281struct DataDeletionFlag {
282 union {
283 u32 raw{};
284
285 BitField<0, 1, u32> AutomaticDeletionFlag;
286 };
287};
288static_assert(sizeof(DataDeletionFlag) == 4, "DataDeletionFlag is an invalid size");
289
290/// This is nn::settings::system::InitialLaunchFlag
291struct InitialLaunchFlag {
292 union {
293 u32 raw{};
294
295 BitField<0, 1, u32> InitialLaunchCompletionFlag;
296 BitField<8, 1, u32> InitialLaunchUserAdditionFlag;
297 BitField<16, 1, u32> InitialLaunchTimestampFlag;
298 };
299};
300static_assert(sizeof(InitialLaunchFlag) == 4, "InitialLaunchFlag is an invalid size");
301
302/// This is nn::settings::system::SleepFlag
303struct SleepFlag {
304 union {
305 u32 raw{};
306
307 BitField<0, 1, u32> SleepsWhilePlayingMedia;
308 BitField<1, 1, u32> WakesAtPowerStateChange;
309 };
310};
311static_assert(sizeof(SleepFlag) == 4, "TvFlag is an invalid size");
312
313/// This is nn::settings::system::NotificationFlag
314struct NotificationFlag {
315 union {
316 u32 raw{};
317
318 BitField<0, 1, u32> RingtoneFlag;
319 BitField<1, 1, u32> DownloadCompletionFlag;
320 BitField<8, 1, u32> EnablesNews;
321 BitField<9, 1, u32> IncomingLampFlag;
322 };
323};
324static_assert(sizeof(NotificationFlag) == 4, "NotificationFlag is an invalid size");
325
326/// This is nn::settings::system::TvFlag
327struct TvFlag {
328 union {
329 u32 raw{};
330
331 BitField<0, 1, u32> Allows4k;
332 BitField<1, 1, u32> Allows3d;
333 BitField<2, 1, u32> AllowsCec;
334 BitField<3, 1, u32> PreventsScreenBurnIn;
335 };
336};
337static_assert(sizeof(TvFlag) == 4, "TvFlag is an invalid size");
338
339/// This is nn::settings::system::UserSelectorFlag
340struct UserSelectorFlag {
341 union {
342 u32 raw{};
343
344 BitField<0, 1, u32> SkipIfSingleUser;
345 BitField<31, 1, u32> Unknown;
346 };
347};
348static_assert(sizeof(UserSelectorFlag) == 4, "UserSelectorFlag is an invalid size");
349
350/// This is nn::settings::system::AccountNotificationSettings
351struct AccountNotificationSettings {
352 Common::UUID uid;
353 AccountNotificationFlag flags;
354 FriendPresenceOverlayPermission friend_presence_permission;
355 FriendPresenceOverlayPermission friend_invitation_permission;
356 INSERT_PADDING_BYTES(0x2);
357};
358static_assert(sizeof(AccountNotificationSettings) == 0x18,
359 "AccountNotificationSettings is an invalid size");
360
361/// This is nn::settings::system::EulaVersion
362struct EulaVersion {
363 u32 version;
364 SystemRegionCode region_code;
365 EulaVersionClockType clock_type;
366 INSERT_PADDING_BYTES(0x4);
367 s64 posix_time;
368 Time::Clock::SteadyClockTimePoint timestamp;
369};
370static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size");
371
372struct FirmwareVersionFormat {
373 u8 major;
374 u8 minor;
375 u8 micro;
376 INSERT_PADDING_BYTES(1);
377 u8 revision_major;
378 u8 revision_minor;
379 INSERT_PADDING_BYTES(2);
380 std::array<char, 0x20> platform;
381 std::array<u8, 0x40> version_hash;
382 std::array<char, 0x18> display_version;
383 std::array<char, 0x80> display_title;
384};
385static_assert(sizeof(FirmwareVersionFormat) == 0x100, "FirmwareVersionFormat is an invalid size");
386
387/// This is nn::settings::system::HomeMenuScheme
388struct HomeMenuScheme {
389 u32 main;
390 u32 back;
391 u32 sub;
392 u32 bezel;
393 u32 extra;
394};
395static_assert(sizeof(HomeMenuScheme) == 0x14, "HomeMenuScheme is incorrect size");
396
397/// This is nn::settings::system::InitialLaunchSettings
398struct InitialLaunchSettings {
399 InitialLaunchFlag flags;
400 INSERT_PADDING_BYTES(0x4);
401 Service::Time::Clock::SteadyClockTimePoint timestamp;
402};
403static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size");
404
405#pragma pack(push, 4)
406struct InitialLaunchSettingsPacked {
407 InitialLaunchFlag flags;
408 Service::Time::Clock::SteadyClockTimePoint timestamp;
409};
410#pragma pack(pop)
411static_assert(sizeof(InitialLaunchSettingsPacked) == 0x1C,
412 "InitialLaunchSettingsPacked is incorrect size");
413
414/// This is nn::settings::system::NotificationTime
415struct NotificationTime {
416 u32 hour;
417 u32 minute;
418};
419static_assert(sizeof(NotificationTime) == 0x8, "NotificationTime is an invalid size");
420
421/// This is nn::settings::system::NotificationSettings
422struct NotificationSettings {
423 NotificationFlag flags;
424 NotificationVolume volume;
425 NotificationTime start_time;
426 NotificationTime stop_time;
427};
428static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size");
429
430/// This is nn::settings::system::SleepSettings
431struct SleepSettings {
432 SleepFlag flags;
433 HandheldSleepPlan handheld_sleep_plan;
434 ConsoleSleepPlan console_sleep_plan;
435};
436static_assert(sizeof(SleepSettings) == 0xc, "SleepSettings is incorrect size");
437
438/// This is nn::settings::system::TvSettings
439struct TvSettings {
440 TvFlag flags;
441 TvResolution tv_resolution;
442 HdmiContentType hdmi_content_type;
443 RgbRange rgb_range;
444 CmuMode cmu_mode;
445 u32 tv_underscan;
446 f32 tv_gama;
447 f32 contrast_ratio;
448};
449static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size");
450
451} // namespace Service::Set
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp
index af9348522..2e5785fed 100644
--- a/src/core/hle/service/set/system_settings_server.cpp
+++ b/src/core/hle/service/set/system_settings_server.cpp
@@ -97,8 +97,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
97 {3, &ISystemSettingsServer::GetFirmwareVersion, "GetFirmwareVersion"}, 97 {3, &ISystemSettingsServer::GetFirmwareVersion, "GetFirmwareVersion"},
98 {4, &ISystemSettingsServer::GetFirmwareVersion2, "GetFirmwareVersion2"}, 98 {4, &ISystemSettingsServer::GetFirmwareVersion2, "GetFirmwareVersion2"},
99 {5, nullptr, "GetFirmwareVersionDigest"}, 99 {5, nullptr, "GetFirmwareVersionDigest"},
100 {7, nullptr, "GetLockScreenFlag"}, 100 {7, &ISystemSettingsServer::GetLockScreenFlag, "GetLockScreenFlag"},
101 {8, nullptr, "SetLockScreenFlag"}, 101 {8, &ISystemSettingsServer::SetLockScreenFlag, "SetLockScreenFlag"},
102 {9, nullptr, "GetBacklightSettings"}, 102 {9, nullptr, "GetBacklightSettings"},
103 {10, nullptr, "SetBacklightSettings"}, 103 {10, nullptr, "SetBacklightSettings"},
104 {11, nullptr, "SetBluetoothDevicesSettings"}, 104 {11, nullptr, "SetBluetoothDevicesSettings"},
@@ -157,12 +157,12 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
157 {66, nullptr, "SetUsb30EnableFlag"}, 157 {66, nullptr, "SetUsb30EnableFlag"},
158 {67, nullptr, "GetBatteryLot"}, 158 {67, nullptr, "GetBatteryLot"},
159 {68, nullptr, "GetSerialNumber"}, 159 {68, nullptr, "GetSerialNumber"},
160 {69, nullptr, "GetNfcEnableFlag"}, 160 {69, &ISystemSettingsServer::GetNfcEnableFlag, "GetNfcEnableFlag"},
161 {70, nullptr, "SetNfcEnableFlag"}, 161 {70, &ISystemSettingsServer::SetNfcEnableFlag, "SetNfcEnableFlag"},
162 {71, &ISystemSettingsServer::GetSleepSettings, "GetSleepSettings"}, 162 {71, &ISystemSettingsServer::GetSleepSettings, "GetSleepSettings"},
163 {72, &ISystemSettingsServer::SetSleepSettings, "SetSleepSettings"}, 163 {72, &ISystemSettingsServer::SetSleepSettings, "SetSleepSettings"},
164 {73, nullptr, "GetWirelessLanEnableFlag"}, 164 {73, &ISystemSettingsServer::GetWirelessLanEnableFlag, "GetWirelessLanEnableFlag"},
165 {74, nullptr, "SetWirelessLanEnableFlag"}, 165 {74, &ISystemSettingsServer::SetWirelessLanEnableFlag, "SetWirelessLanEnableFlag"},
166 {75, &ISystemSettingsServer::GetInitialLaunchSettings, "GetInitialLaunchSettings"}, 166 {75, &ISystemSettingsServer::GetInitialLaunchSettings, "GetInitialLaunchSettings"},
167 {76, &ISystemSettingsServer::SetInitialLaunchSettings, "SetInitialLaunchSettings"}, 167 {76, &ISystemSettingsServer::SetInitialLaunchSettings, "SetInitialLaunchSettings"},
168 {77, &ISystemSettingsServer::GetDeviceNickName, "GetDeviceNickName"}, 168 {77, &ISystemSettingsServer::GetDeviceNickName, "GetDeviceNickName"},
@@ -176,8 +176,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
176 {85, nullptr, "SetPtmBatteryLot"}, 176 {85, nullptr, "SetPtmBatteryLot"},
177 {86, nullptr, "GetPtmFuelGaugeParameter"}, 177 {86, nullptr, "GetPtmFuelGaugeParameter"},
178 {87, nullptr, "SetPtmFuelGaugeParameter"}, 178 {87, nullptr, "SetPtmFuelGaugeParameter"},
179 {88, nullptr, "GetBluetoothEnableFlag"}, 179 {88, &ISystemSettingsServer::GetBluetoothEnableFlag, "GetBluetoothEnableFlag"},
180 {89, nullptr, "SetBluetoothEnableFlag"}, 180 {89, &ISystemSettingsServer::SetBluetoothEnableFlag, "SetBluetoothEnableFlag"},
181 {90, &ISystemSettingsServer::GetMiiAuthorId, "GetMiiAuthorId"}, 181 {90, &ISystemSettingsServer::GetMiiAuthorId, "GetMiiAuthorId"},
182 {91, nullptr, "SetShutdownRtcValue"}, 182 {91, nullptr, "SetShutdownRtcValue"},
183 {92, nullptr, "GetShutdownRtcValue"}, 183 {92, nullptr, "GetShutdownRtcValue"},
@@ -510,6 +510,25 @@ void ISystemSettingsServer::SetUserSystemClockContext(HLERequestContext& ctx) {
510 rb.Push(res); 510 rb.Push(res);
511} 511}
512 512
513void ISystemSettingsServer::GetLockScreenFlag(HLERequestContext& ctx) {
514 LOG_INFO(Service_SET, "called, lock_screen_flag={}", m_system_settings.lock_screen_flag);
515
516 IPC::ResponseBuilder rb{ctx, 3};
517 rb.Push(ResultSuccess);
518 rb.Push(m_system_settings.lock_screen_flag);
519}
520
521void ISystemSettingsServer::SetLockScreenFlag(HLERequestContext& ctx) {
522 IPC::RequestParser rp{ctx};
523 m_system_settings.lock_screen_flag = rp.Pop<bool>();
524 SetSaveNeeded();
525
526 LOG_INFO(Service_SET, "called, lock_screen_flag={}", m_system_settings.lock_screen_flag);
527
528 IPC::ResponseBuilder rb{ctx, 2};
529 rb.Push(ResultSuccess);
530}
531
513void ISystemSettingsServer::GetAccountSettings(HLERequestContext& ctx) { 532void ISystemSettingsServer::GetAccountSettings(HLERequestContext& ctx) {
514 LOG_INFO(Service_SET, "called"); 533 LOG_INFO(Service_SET, "called");
515 534
@@ -531,7 +550,7 @@ void ISystemSettingsServer::SetAccountSettings(HLERequestContext& ctx) {
531} 550}
532 551
533void ISystemSettingsServer::GetEulaVersions(HLERequestContext& ctx) { 552void ISystemSettingsServer::GetEulaVersions(HLERequestContext& ctx) {
534 LOG_INFO(Service_SET, "called"); 553 LOG_INFO(Service_SET, "called, elements={}", m_system_settings.eula_version_count);
535 554
536 ctx.WriteBuffer(m_system_settings.eula_versions); 555 ctx.WriteBuffer(m_system_settings.eula_versions);
537 556
@@ -557,7 +576,7 @@ void ISystemSettingsServer::SetEulaVersions(HLERequestContext& ctx) {
557} 576}
558 577
559void ISystemSettingsServer::GetColorSetId(HLERequestContext& ctx) { 578void ISystemSettingsServer::GetColorSetId(HLERequestContext& ctx) {
560 LOG_DEBUG(Service_SET, "called"); 579 LOG_DEBUG(Service_SET, "called, color_set=", m_system_settings.color_set_id);
561 580
562 IPC::ResponseBuilder rb{ctx, 3}; 581 IPC::ResponseBuilder rb{ctx, 3};
563 rb.Push(ResultSuccess); 582 rb.Push(ResultSuccess);
@@ -576,7 +595,13 @@ void ISystemSettingsServer::SetColorSetId(HLERequestContext& ctx) {
576} 595}
577 596
578void ISystemSettingsServer::GetNotificationSettings(HLERequestContext& ctx) { 597void ISystemSettingsServer::GetNotificationSettings(HLERequestContext& ctx) {
579 LOG_INFO(Service_SET, "called"); 598 LOG_INFO(Service_SET, "called, flags={}, volume={}, head_time={}:{}, tailt_time={}:{}",
599 m_system_settings.notification_settings.flags.raw,
600 m_system_settings.notification_settings.volume,
601 m_system_settings.notification_settings.start_time.hour,
602 m_system_settings.notification_settings.start_time.minute,
603 m_system_settings.notification_settings.stop_time.hour,
604 m_system_settings.notification_settings.stop_time.minute);
580 605
581 IPC::ResponseBuilder rb{ctx, 8}; 606 IPC::ResponseBuilder rb{ctx, 8};
582 rb.Push(ResultSuccess); 607 rb.Push(ResultSuccess);
@@ -601,7 +626,8 @@ void ISystemSettingsServer::SetNotificationSettings(HLERequestContext& ctx) {
601} 626}
602 627
603void ISystemSettingsServer::GetAccountNotificationSettings(HLERequestContext& ctx) { 628void ISystemSettingsServer::GetAccountNotificationSettings(HLERequestContext& ctx) {
604 LOG_INFO(Service_SET, "called"); 629 LOG_INFO(Service_SET, "called, elements={}",
630 m_system_settings.account_notification_settings_count);
605 631
606 ctx.WriteBuffer(m_system_settings.account_notification_settings); 632 ctx.WriteBuffer(m_system_settings.account_notification_settings);
607 633
@@ -645,6 +671,7 @@ using Settings =
645static Settings GetSettings() { 671static Settings GetSettings() {
646 Settings ret; 672 Settings ret;
647 673
674 // AM
648 ret["hbloader"]["applet_heap_size"] = ToBytes(u64{0x0}); 675 ret["hbloader"]["applet_heap_size"] = ToBytes(u64{0x0});
649 ret["hbloader"]["applet_heap_reservation_size"] = ToBytes(u64{0x8600000}); 676 ret["hbloader"]["applet_heap_reservation_size"] = ToBytes(u64{0x8600000});
650 677
@@ -656,6 +683,24 @@ static Settings GetSettings() {
656 ret["time"]["standard_steady_clock_test_offset_minutes"] = ToBytes(s32{0}); 683 ret["time"]["standard_steady_clock_test_offset_minutes"] = ToBytes(s32{0});
657 ret["time"]["standard_user_clock_initial_year"] = ToBytes(s32{2023}); 684 ret["time"]["standard_user_clock_initial_year"] = ToBytes(s32{2023});
658 685
686 // HID
687 ret["hid_debug"]["enables_debugpad"] = ToBytes(bool{true});
688 ret["hid_debug"]["manages_devices"] = ToBytes(bool{true});
689 ret["hid_debug"]["manages_touch_ic_i2c"] = ToBytes(bool{true});
690 ret["hid_debug"]["emulate_future_device"] = ToBytes(bool{false});
691 ret["hid_debug"]["emulate_mcu_hardware_error"] = ToBytes(bool{false});
692 ret["hid_debug"]["enables_rail"] = ToBytes(bool{true});
693 ret["hid_debug"]["emulate_firmware_update_failure"] = ToBytes(bool{false});
694 ret["hid_debug"]["failure_firmware_update"] = ToBytes(s32{0});
695 ret["hid_debug"]["ble_disabled"] = ToBytes(bool{false});
696 ret["hid_debug"]["dscale_disabled"] = ToBytes(bool{false});
697 ret["hid_debug"]["force_handheld"] = ToBytes(bool{true});
698 ret["hid_debug"]["disabled_features_per_id"] = std::vector<u8>(0xa8);
699 ret["hid_debug"]["touch_firmware_auto_update_disabled"] = ToBytes(bool{false});
700
701 // Settings
702 ret["settings_debug"]["is_debug_mode_enabled"] = ToBytes(bool{false});
703
659 return ret; 704 return ret;
660} 705}
661 706
@@ -708,7 +753,15 @@ void ISystemSettingsServer::GetSettingsItemValue(HLERequestContext& ctx) {
708} 753}
709 754
710void ISystemSettingsServer::GetTvSettings(HLERequestContext& ctx) { 755void ISystemSettingsServer::GetTvSettings(HLERequestContext& ctx) {
711 LOG_INFO(Service_SET, "called"); 756 LOG_INFO(Service_SET,
757 "called, flags={}, cmu_mode={}, contrast_ratio={}, hdmi_content_type={}, "
758 "rgb_range={}, tv_gama={}, tv_resolution={}, tv_underscan={}",
759 m_system_settings.tv_settings.flags.raw, m_system_settings.tv_settings.cmu_mode,
760 m_system_settings.tv_settings.contrast_ratio,
761 m_system_settings.tv_settings.hdmi_content_type,
762 m_system_settings.tv_settings.rgb_range, m_system_settings.tv_settings.tv_gama,
763 m_system_settings.tv_settings.tv_resolution,
764 m_system_settings.tv_settings.tv_underscan);
712 765
713 IPC::ResponseBuilder rb{ctx, 10}; 766 IPC::ResponseBuilder rb{ctx, 10};
714 rb.Push(ResultSuccess); 767 rb.Push(ResultSuccess);
@@ -735,23 +788,26 @@ void ISystemSettingsServer::SetTvSettings(HLERequestContext& ctx) {
735} 788}
736 789
737void ISystemSettingsServer::GetDebugModeFlag(HLERequestContext& ctx) { 790void ISystemSettingsServer::GetDebugModeFlag(HLERequestContext& ctx) {
738 LOG_DEBUG(Service_SET, "called"); 791 bool is_debug_mode_enabled = false;
792 GetSettingsItemValue<bool>(is_debug_mode_enabled, "settings_debug", "is_debug_mode_enabled");
793
794 LOG_DEBUG(Service_SET, "called, is_debug_mode_enabled={}", is_debug_mode_enabled);
739 795
740 IPC::ResponseBuilder rb{ctx, 3}; 796 IPC::ResponseBuilder rb{ctx, 3};
741 rb.Push(ResultSuccess); 797 rb.Push(ResultSuccess);
742 rb.Push<u32>(0); 798 rb.Push(is_debug_mode_enabled);
743} 799}
744 800
745void ISystemSettingsServer::GetQuestFlag(HLERequestContext& ctx) { 801void ISystemSettingsServer::GetQuestFlag(HLERequestContext& ctx) {
746 LOG_WARNING(Service_SET, "(STUBBED) called"); 802 LOG_INFO(Service_SET, "called, quest_flag={}", m_system_settings.quest_flag);
747 803
748 IPC::ResponseBuilder rb{ctx, 3}; 804 IPC::ResponseBuilder rb{ctx, 3};
749 rb.Push(ResultSuccess); 805 rb.Push(ResultSuccess);
750 rb.PushEnum(QuestFlag::Retail); 806 rb.PushEnum(m_system_settings.quest_flag);
751} 807}
752 808
753void ISystemSettingsServer::GetDeviceTimeZoneLocationName(HLERequestContext& ctx) { 809void ISystemSettingsServer::GetDeviceTimeZoneLocationName(HLERequestContext& ctx) {
754 LOG_WARNING(Service_SET, "called"); 810 LOG_INFO(Service_SET, "called");
755 811
756 Service::Time::TimeZone::LocationName name{}; 812 Service::Time::TimeZone::LocationName name{};
757 auto res = GetDeviceTimeZoneLocationName(name); 813 auto res = GetDeviceTimeZoneLocationName(name);
@@ -762,7 +818,7 @@ void ISystemSettingsServer::GetDeviceTimeZoneLocationName(HLERequestContext& ctx
762} 818}
763 819
764void ISystemSettingsServer::SetDeviceTimeZoneLocationName(HLERequestContext& ctx) { 820void ISystemSettingsServer::SetDeviceTimeZoneLocationName(HLERequestContext& ctx) {
765 LOG_WARNING(Service_SET, "called"); 821 LOG_INFO(Service_SET, "called");
766 822
767 IPC::RequestParser rp{ctx}; 823 IPC::RequestParser rp{ctx};
768 auto name{rp.PopRaw<Service::Time::TimeZone::LocationName>()}; 824 auto name{rp.PopRaw<Service::Time::TimeZone::LocationName>()};
@@ -775,7 +831,7 @@ void ISystemSettingsServer::SetDeviceTimeZoneLocationName(HLERequestContext& ctx
775 831
776void ISystemSettingsServer::SetRegionCode(HLERequestContext& ctx) { 832void ISystemSettingsServer::SetRegionCode(HLERequestContext& ctx) {
777 IPC::RequestParser rp{ctx}; 833 IPC::RequestParser rp{ctx};
778 m_system_settings.region_code = rp.PopEnum<RegionCode>(); 834 m_system_settings.region_code = rp.PopEnum<SystemRegionCode>();
779 SetSaveNeeded(); 835 SetSaveNeeded();
780 836
781 LOG_INFO(Service_SET, "called, region_code={}", m_system_settings.region_code); 837 LOG_INFO(Service_SET, "called, region_code={}", m_system_settings.region_code);
@@ -832,15 +888,38 @@ void ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled(HLERequ
832} 888}
833 889
834void ISystemSettingsServer::GetPrimaryAlbumStorage(HLERequestContext& ctx) { 890void ISystemSettingsServer::GetPrimaryAlbumStorage(HLERequestContext& ctx) {
835 LOG_WARNING(Service_SET, "(STUBBED) called"); 891 LOG_INFO(Service_SET, "called, primary_album_storage={}",
892 m_system_settings.primary_album_storage);
893
894 IPC::ResponseBuilder rb{ctx, 3};
895 rb.Push(ResultSuccess);
896 rb.PushEnum(m_system_settings.primary_album_storage);
897}
898
899void ISystemSettingsServer::GetNfcEnableFlag(HLERequestContext& ctx) {
900 LOG_INFO(Service_SET, "called, nfc_enable_flag={}", m_system_settings.nfc_enable_flag);
836 901
837 IPC::ResponseBuilder rb{ctx, 3}; 902 IPC::ResponseBuilder rb{ctx, 3};
838 rb.Push(ResultSuccess); 903 rb.Push(ResultSuccess);
839 rb.PushEnum(PrimaryAlbumStorage::SdCard); 904 rb.Push<u8>(m_system_settings.nfc_enable_flag);
905}
906
907void ISystemSettingsServer::SetNfcEnableFlag(HLERequestContext& ctx) {
908 IPC::RequestParser rp{ctx};
909 m_system_settings.nfc_enable_flag = rp.Pop<bool>();
910 SetSaveNeeded();
911
912 LOG_INFO(Service_SET, "called, nfc_enable_flag={}", m_system_settings.nfc_enable_flag);
913
914 IPC::ResponseBuilder rb{ctx, 2};
915 rb.Push(ResultSuccess);
840} 916}
841 917
842void ISystemSettingsServer::GetSleepSettings(HLERequestContext& ctx) { 918void ISystemSettingsServer::GetSleepSettings(HLERequestContext& ctx) {
843 LOG_INFO(Service_SET, "called"); 919 LOG_INFO(Service_SET, "called, flags={}, handheld_sleep_plan={}, console_sleep_plan={}",
920 m_system_settings.sleep_settings.flags.raw,
921 m_system_settings.sleep_settings.handheld_sleep_plan,
922 m_system_settings.sleep_settings.console_sleep_plan);
844 923
845 IPC::ResponseBuilder rb{ctx, 5}; 924 IPC::ResponseBuilder rb{ctx, 5};
846 rb.Push(ResultSuccess); 925 rb.Push(ResultSuccess);
@@ -861,8 +940,32 @@ void ISystemSettingsServer::SetSleepSettings(HLERequestContext& ctx) {
861 rb.Push(ResultSuccess); 940 rb.Push(ResultSuccess);
862} 941}
863 942
943void ISystemSettingsServer::GetWirelessLanEnableFlag(HLERequestContext& ctx) {
944 LOG_INFO(Service_SET, "called, wireless_lan_enable_flag={}",
945 m_system_settings.wireless_lan_enable_flag);
946
947 IPC::ResponseBuilder rb{ctx, 3};
948 rb.Push(ResultSuccess);
949 rb.Push(m_system_settings.wireless_lan_enable_flag);
950}
951
952void ISystemSettingsServer::SetWirelessLanEnableFlag(HLERequestContext& ctx) {
953 IPC::RequestParser rp{ctx};
954 m_system_settings.wireless_lan_enable_flag = rp.Pop<bool>();
955 SetSaveNeeded();
956
957 LOG_INFO(Service_SET, "called, wireless_lan_enable_flag={}",
958 m_system_settings.wireless_lan_enable_flag);
959
960 IPC::ResponseBuilder rb{ctx, 2};
961 rb.Push(ResultSuccess);
962}
963
864void ISystemSettingsServer::GetInitialLaunchSettings(HLERequestContext& ctx) { 964void ISystemSettingsServer::GetInitialLaunchSettings(HLERequestContext& ctx) {
865 LOG_INFO(Service_SET, "called"); 965 LOG_INFO(Service_SET, "called, flags={}, timestamp={}",
966 m_system_settings.initial_launch_settings_packed.flags.raw,
967 m_system_settings.initial_launch_settings_packed.timestamp.time_point);
968
866 IPC::ResponseBuilder rb{ctx, 10}; 969 IPC::ResponseBuilder rb{ctx, 10};
867 rb.Push(ResultSuccess); 970 rb.Push(ResultSuccess);
868 rb.PushRaw(m_system_settings.initial_launch_settings_packed); 971 rb.PushRaw(m_system_settings.initial_launch_settings_packed);
@@ -913,35 +1016,56 @@ void ISystemSettingsServer::GetProductModel(HLERequestContext& ctx) {
913 rb.Push(product_model); 1016 rb.Push(product_model);
914} 1017}
915 1018
1019void ISystemSettingsServer::GetBluetoothEnableFlag(HLERequestContext& ctx) {
1020 LOG_INFO(Service_SET, "called, bluetooth_enable_flag={}",
1021 m_system_settings.bluetooth_enable_flag);
1022
1023 IPC::ResponseBuilder rb{ctx, 3};
1024 rb.Push(ResultSuccess);
1025 rb.Push<u8>(m_system_settings.bluetooth_enable_flag);
1026}
1027
1028void ISystemSettingsServer::SetBluetoothEnableFlag(HLERequestContext& ctx) {
1029 IPC::RequestParser rp{ctx};
1030 m_system_settings.bluetooth_enable_flag = rp.Pop<bool>();
1031 SetSaveNeeded();
1032
1033 LOG_INFO(Service_SET, "called, bluetooth_enable_flag={}",
1034 m_system_settings.bluetooth_enable_flag);
1035
1036 IPC::ResponseBuilder rb{ctx, 2};
1037 rb.Push(ResultSuccess);
1038}
1039
916void ISystemSettingsServer::GetMiiAuthorId(HLERequestContext& ctx) { 1040void ISystemSettingsServer::GetMiiAuthorId(HLERequestContext& ctx) {
917 const auto author_id = Common::UUID::MakeDefault(); 1041 if (m_system_settings.mii_author_id.IsInvalid()) {
1042 m_system_settings.mii_author_id = Common::UUID::MakeDefault();
1043 SetSaveNeeded();
1044 }
918 1045
919 LOG_WARNING(Service_SET, "(STUBBED) called, author_id={}", author_id.FormattedString()); 1046 LOG_INFO(Service_SET, "called, author_id={}",
1047 m_system_settings.mii_author_id.FormattedString());
920 1048
921 IPC::ResponseBuilder rb{ctx, 6}; 1049 IPC::ResponseBuilder rb{ctx, 6};
922 rb.Push(ResultSuccess); 1050 rb.Push(ResultSuccess);
923 rb.PushRaw(author_id); 1051 rb.PushRaw(m_system_settings.mii_author_id);
924} 1052}
925 1053
926void ISystemSettingsServer::GetAutoUpdateEnableFlag(HLERequestContext& ctx) { 1054void ISystemSettingsServer::GetAutoUpdateEnableFlag(HLERequestContext& ctx) {
927 u8 auto_update_flag{}; 1055 LOG_INFO(Service_SET, "called, auto_update_flag={}", m_system_settings.auto_update_enable_flag);
928
929 LOG_WARNING(Service_SET, "(STUBBED) called, auto_update_flag={}", auto_update_flag);
930 1056
931 IPC::ResponseBuilder rb{ctx, 3}; 1057 IPC::ResponseBuilder rb{ctx, 3};
932 rb.Push(ResultSuccess); 1058 rb.Push(ResultSuccess);
933 rb.Push(auto_update_flag); 1059 rb.Push(m_system_settings.auto_update_enable_flag);
934} 1060}
935 1061
936void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) { 1062void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) {
937 u8 battery_percentage_flag{1}; 1063 LOG_DEBUG(Service_SET, "called, battery_percentage_flag={}",
938 1064 m_system_settings.battery_percentage_flag);
939 LOG_WARNING(Service_SET, "(STUBBED) called, battery_percentage_flag={}",
940 battery_percentage_flag);
941 1065
942 IPC::ResponseBuilder rb{ctx, 3}; 1066 IPC::ResponseBuilder rb{ctx, 3};
943 rb.Push(ResultSuccess); 1067 rb.Push(ResultSuccess);
944 rb.Push(battery_percentage_flag); 1068 rb.Push(m_system_settings.battery_percentage_flag);
945} 1069}
946 1070
947void ISystemSettingsServer::SetExternalSteadyClockInternalOffset(HLERequestContext& ctx) { 1071void ISystemSettingsServer::SetExternalSteadyClockInternalOffset(HLERequestContext& ctx) {
@@ -968,11 +1092,12 @@ void ISystemSettingsServer::GetExternalSteadyClockInternalOffset(HLERequestConte
968} 1092}
969 1093
970void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx) { 1094void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx) {
971 LOG_WARNING(Service_SET, "(STUBBED) called"); 1095 LOG_INFO(Service_SET, "called, error_report_share_permission={}",
1096 m_system_settings.error_report_share_permission);
972 1097
973 IPC::ResponseBuilder rb{ctx, 3}; 1098 IPC::ResponseBuilder rb{ctx, 3};
974 rb.Push(ResultSuccess); 1099 rb.Push(ResultSuccess);
975 rb.PushEnum(ErrorReportSharePermission::Denied); 1100 rb.PushEnum(m_system_settings.error_report_share_permission);
976} 1101}
977 1102
978void ISystemSettingsServer::GetAppletLaunchFlags(HLERequestContext& ctx) { 1103void ISystemSettingsServer::GetAppletLaunchFlags(HLERequestContext& ctx) {
@@ -1014,7 +1139,7 @@ void ISystemSettingsServer::GetKeyboardLayout(HLERequestContext& ctx) {
1014} 1139}
1015 1140
1016void ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) { 1141void ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) {
1017 LOG_WARNING(Service_SET, "called."); 1142 LOG_INFO(Service_SET, "called");
1018 1143
1019 Service::Time::Clock::SteadyClockTimePoint time_point{}; 1144 Service::Time::Clock::SteadyClockTimePoint time_point{};
1020 auto res = GetDeviceTimeZoneLocationUpdatedTime(time_point); 1145 auto res = GetDeviceTimeZoneLocationUpdatedTime(time_point);
@@ -1025,7 +1150,7 @@ void ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(HLERequestConte
1025} 1150}
1026 1151
1027void ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) { 1152void ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) {
1028 LOG_WARNING(Service_SET, "called."); 1153 LOG_INFO(Service_SET, "called");
1029 1154
1030 IPC::RequestParser rp{ctx}; 1155 IPC::RequestParser rp{ctx};
1031 auto time_point{rp.PopRaw<Service::Time::Clock::SteadyClockTimePoint>()}; 1156 auto time_point{rp.PopRaw<Service::Time::Clock::SteadyClockTimePoint>()};
@@ -1038,7 +1163,7 @@ void ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime(HLERequestConte
1038 1163
1039void ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime( 1164void ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime(
1040 HLERequestContext& ctx) { 1165 HLERequestContext& ctx) {
1041 LOG_WARNING(Service_SET, "called."); 1166 LOG_INFO(Service_SET, "called");
1042 1167
1043 Service::Time::Clock::SteadyClockTimePoint time_point{}; 1168 Service::Time::Clock::SteadyClockTimePoint time_point{};
1044 auto res = GetUserSystemClockAutomaticCorrectionUpdatedTime(time_point); 1169 auto res = GetUserSystemClockAutomaticCorrectionUpdatedTime(time_point);
@@ -1050,7 +1175,7 @@ void ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime(
1050 1175
1051void ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime( 1176void ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime(
1052 HLERequestContext& ctx) { 1177 HLERequestContext& ctx) {
1053 LOG_WARNING(Service_SET, "called."); 1178 LOG_INFO(Service_SET, "called");
1054 1179
1055 IPC::RequestParser rp{ctx}; 1180 IPC::RequestParser rp{ctx};
1056 auto time_point{rp.PopRaw<Service::Time::Clock::SteadyClockTimePoint>()}; 1181 auto time_point{rp.PopRaw<Service::Time::Clock::SteadyClockTimePoint>()};
@@ -1062,11 +1187,12 @@ void ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime(
1062} 1187}
1063 1188
1064void ISystemSettingsServer::GetChineseTraditionalInputMethod(HLERequestContext& ctx) { 1189void ISystemSettingsServer::GetChineseTraditionalInputMethod(HLERequestContext& ctx) {
1065 LOG_WARNING(Service_SET, "(STUBBED) called"); 1190 LOG_INFO(Service_SET, "called, chinese_traditional_input_method={}",
1191 m_system_settings.chinese_traditional_input_method);
1066 1192
1067 IPC::ResponseBuilder rb{ctx, 3}; 1193 IPC::ResponseBuilder rb{ctx, 3};
1068 rb.Push(ResultSuccess); 1194 rb.Push(ResultSuccess);
1069 rb.PushEnum(ChineseTraditionalInputMethod::Unknown0); 1195 rb.PushEnum(m_system_settings.chinese_traditional_input_method);
1070} 1196}
1071 1197
1072void ISystemSettingsServer::GetHomeMenuScheme(HLERequestContext& ctx) { 1198void ISystemSettingsServer::GetHomeMenuScheme(HLERequestContext& ctx) {
@@ -1094,11 +1220,11 @@ void ISystemSettingsServer::GetHomeMenuSchemeModel(HLERequestContext& ctx) {
1094} 1220}
1095 1221
1096void ISystemSettingsServer::GetFieldTestingFlag(HLERequestContext& ctx) { 1222void ISystemSettingsServer::GetFieldTestingFlag(HLERequestContext& ctx) {
1097 LOG_WARNING(Service_SET, "(STUBBED) called"); 1223 LOG_INFO(Service_SET, "called, field_testing_flag={}", m_system_settings.field_testing_flag);
1098 1224
1099 IPC::ResponseBuilder rb{ctx, 3}; 1225 IPC::ResponseBuilder rb{ctx, 3};
1100 rb.Push(ResultSuccess); 1226 rb.Push(ResultSuccess);
1101 rb.Push<u8>(false); 1227 rb.Push(m_system_settings.field_testing_flag);
1102} 1228}
1103 1229
1104void ISystemSettingsServer::SetupSettings() { 1230void ISystemSettingsServer::SetupSettings() {
diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h
index 6f587e0b3..32716f567 100644
--- a/src/core/hle/service/set/system_settings_server.h
+++ b/src/core/hle/service/set/system_settings_server.h
@@ -12,10 +12,11 @@
12#include "common/uuid.h" 12#include "common/uuid.h"
13#include "core/hle/result.h" 13#include "core/hle/result.h"
14#include "core/hle/service/service.h" 14#include "core/hle/service/service.h"
15#include "core/hle/service/set/appln_settings.h" 15#include "core/hle/service/set/setting_formats/appln_settings.h"
16#include "core/hle/service/set/device_settings.h" 16#include "core/hle/service/set/setting_formats/device_settings.h"
17#include "core/hle/service/set/private_settings.h" 17#include "core/hle/service/set/setting_formats/private_settings.h"
18#include "core/hle/service/set/system_settings.h" 18#include "core/hle/service/set/setting_formats/system_settings.h"
19#include "core/hle/service/set/settings_types.h"
19#include "core/hle/service/time/clock_types.h" 20#include "core/hle/service/time/clock_types.h"
20#include "core/hle/service/time/time_zone_types.h" 21#include "core/hle/service/time/time_zone_types.h"
21 22
@@ -24,25 +25,6 @@ class System;
24} 25}
25 26
26namespace Service::Set { 27namespace Service::Set {
27enum class GetFirmwareVersionType {
28 Version1,
29 Version2,
30};
31
32struct FirmwareVersionFormat {
33 u8 major;
34 u8 minor;
35 u8 micro;
36 INSERT_PADDING_BYTES(1);
37 u8 revision_major;
38 u8 revision_minor;
39 INSERT_PADDING_BYTES(2);
40 std::array<char, 0x20> platform;
41 std::array<u8, 0x40> version_hash;
42 std::array<char, 0x18> display_version;
43 std::array<char, 0x80> display_title;
44};
45static_assert(sizeof(FirmwareVersionFormat) == 0x100, "FirmwareVersionFormat is an invalid size");
46 28
47Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System& system, 29Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System& system,
48 GetFirmwareVersionType type); 30 GetFirmwareVersionType type);
@@ -55,6 +37,18 @@ public:
55 Result GetSettingsItemValue(std::vector<u8>& out_value, const std::string& category, 37 Result GetSettingsItemValue(std::vector<u8>& out_value, const std::string& category,
56 const std::string& name); 38 const std::string& name);
57 39
40 template <typename T>
41 Result GetSettingsItemValue(T& value, const std::string& category, const std::string& name) {
42 std::vector<u8> data;
43 const auto result = GetSettingsItemValue(data, category, name);
44 if (result.IsError()) {
45 return result;
46 }
47 ASSERT(data.size() >= sizeof(T));
48 std::memcpy(&value, data.data(), sizeof(T));
49 return result;
50 }
51
58 Result GetExternalSteadyClockSourceId(Common::UUID& out_id); 52 Result GetExternalSteadyClockSourceId(Common::UUID& out_id);
59 Result SetExternalSteadyClockSourceId(Common::UUID id); 53 Result SetExternalSteadyClockSourceId(Common::UUID id);
60 Result GetUserSystemClockContext(Service::Time::Clock::SystemClockContext& out_context); 54 Result GetUserSystemClockContext(Service::Time::Clock::SystemClockContext& out_context);
@@ -80,6 +74,8 @@ private:
80 void SetLanguageCode(HLERequestContext& ctx); 74 void SetLanguageCode(HLERequestContext& ctx);
81 void GetFirmwareVersion(HLERequestContext& ctx); 75 void GetFirmwareVersion(HLERequestContext& ctx);
82 void GetFirmwareVersion2(HLERequestContext& ctx); 76 void GetFirmwareVersion2(HLERequestContext& ctx);
77 void GetLockScreenFlag(HLERequestContext& ctx);
78 void SetLockScreenFlag(HLERequestContext& ctx);
83 void GetExternalSteadyClockSourceId(HLERequestContext& ctx); 79 void GetExternalSteadyClockSourceId(HLERequestContext& ctx);
84 void SetExternalSteadyClockSourceId(HLERequestContext& ctx); 80 void SetExternalSteadyClockSourceId(HLERequestContext& ctx);
85 void GetUserSystemClockContext(HLERequestContext& ctx); 81 void GetUserSystemClockContext(HLERequestContext& ctx);
@@ -108,13 +104,19 @@ private:
108 void IsUserSystemClockAutomaticCorrectionEnabled(HLERequestContext& ctx); 104 void IsUserSystemClockAutomaticCorrectionEnabled(HLERequestContext& ctx);
109 void SetUserSystemClockAutomaticCorrectionEnabled(HLERequestContext& ctx); 105 void SetUserSystemClockAutomaticCorrectionEnabled(HLERequestContext& ctx);
110 void GetPrimaryAlbumStorage(HLERequestContext& ctx); 106 void GetPrimaryAlbumStorage(HLERequestContext& ctx);
107 void GetNfcEnableFlag(HLERequestContext& ctx);
108 void SetNfcEnableFlag(HLERequestContext& ctx);
111 void GetSleepSettings(HLERequestContext& ctx); 109 void GetSleepSettings(HLERequestContext& ctx);
112 void SetSleepSettings(HLERequestContext& ctx); 110 void SetSleepSettings(HLERequestContext& ctx);
111 void GetWirelessLanEnableFlag(HLERequestContext& ctx);
112 void SetWirelessLanEnableFlag(HLERequestContext& ctx);
113 void GetInitialLaunchSettings(HLERequestContext& ctx); 113 void GetInitialLaunchSettings(HLERequestContext& ctx);
114 void SetInitialLaunchSettings(HLERequestContext& ctx); 114 void SetInitialLaunchSettings(HLERequestContext& ctx);
115 void GetDeviceNickName(HLERequestContext& ctx); 115 void GetDeviceNickName(HLERequestContext& ctx);
116 void SetDeviceNickName(HLERequestContext& ctx); 116 void SetDeviceNickName(HLERequestContext& ctx);
117 void GetProductModel(HLERequestContext& ctx); 117 void GetProductModel(HLERequestContext& ctx);
118 void GetBluetoothEnableFlag(HLERequestContext& ctx);
119 void SetBluetoothEnableFlag(HLERequestContext& ctx);
118 void GetMiiAuthorId(HLERequestContext& ctx); 120 void GetMiiAuthorId(HLERequestContext& ctx);
119 void GetAutoUpdateEnableFlag(HLERequestContext& ctx); 121 void GetAutoUpdateEnableFlag(HLERequestContext& ctx);
120 void GetBatteryPercentageFlag(HLERequestContext& ctx); 122 void GetBatteryPercentageFlag(HLERequestContext& ctx);
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp
index e2d9cd98a..725311c53 100644
--- a/src/core/hle/service/vi/display/vi_display.cpp
+++ b/src/core/hle/service/vi/display/vi_display.cpp
@@ -91,6 +91,10 @@ void Display::CreateLayer(u64 layer_id, u32 binder_id,
91 layers.emplace_back(std::make_unique<Layer>(layer_id, binder_id, *core, *producer, 91 layers.emplace_back(std::make_unique<Layer>(layer_id, binder_id, *core, *producer,
92 std::move(buffer_item_consumer))); 92 std::move(buffer_item_consumer)));
93 93
94 if (is_abandoned) {
95 this->FindLayer(layer_id)->GetConsumer().Abandon();
96 }
97
94 hos_binder_driver_server.RegisterProducer(std::move(producer)); 98 hos_binder_driver_server.RegisterProducer(std::move(producer));
95} 99}
96 100
@@ -103,6 +107,13 @@ void Display::DestroyLayer(u64 layer_id) {
103 [layer_id](const auto& layer) { return layer->GetLayerId() == layer_id; }); 107 [layer_id](const auto& layer) { return layer->GetLayerId() == layer_id; });
104} 108}
105 109
110void Display::Abandon() {
111 for (auto& layer : layers) {
112 layer->GetConsumer().Abandon();
113 }
114 is_abandoned = true;
115}
116
106Layer* Display::FindLayer(u64 layer_id) { 117Layer* Display::FindLayer(u64 layer_id) {
107 const auto itr = 118 const auto itr =
108 std::find_if(layers.begin(), layers.end(), [layer_id](const std::unique_ptr<Layer>& layer) { 119 std::find_if(layers.begin(), layers.end(), [layer_id](const std::unique_ptr<Layer>& layer) {
diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h
index 7e68ee79b..8eb8a5155 100644
--- a/src/core/hle/service/vi/display/vi_display.h
+++ b/src/core/hle/service/vi/display/vi_display.h
@@ -98,6 +98,8 @@ public:
98 layers.clear(); 98 layers.clear();
99 } 99 }
100 100
101 void Abandon();
102
101 /// Attempts to find a layer with the given ID. 103 /// Attempts to find a layer with the given ID.
102 /// 104 ///
103 /// @param layer_id The layer ID. 105 /// @param layer_id The layer ID.
@@ -124,6 +126,7 @@ private:
124 126
125 std::vector<std::unique_ptr<Layer>> layers; 127 std::vector<std::unique_ptr<Layer>> layers;
126 Kernel::KEvent* vsync_event{}; 128 Kernel::KEvent* vsync_event{};
129 bool is_abandoned{};
127}; 130};
128 131
129} // namespace Service::VI 132} // namespace Service::VI
diff --git a/src/core/hle/service/vi/layer/vi_layer.h b/src/core/hle/service/vi/layer/vi_layer.h
index 295005e23..f95e2dc71 100644
--- a/src/core/hle/service/vi/layer/vi_layer.h
+++ b/src/core/hle/service/vi/layer/vi_layer.h
@@ -4,6 +4,7 @@
4#pragma once 4#pragma once
5 5
6#include <memory> 6#include <memory>
7#include <utility>
7 8
8#include "common/common_types.h" 9#include "common/common_types.h"
9 10
@@ -75,12 +76,12 @@ public:
75 return open; 76 return open;
76 } 77 }
77 78
78 void Close() { 79 bool Close() {
79 open = false; 80 return std::exchange(open, false);
80 } 81 }
81 82
82 void Open() { 83 bool Open() {
83 open = true; 84 return !std::exchange(open, true);
84 } 85 }
85 86
86private: 87private:
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 39d5be90d..bfcc27ddc 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -719,7 +719,12 @@ private:
719 return; 719 return;
720 } 720 }
721 721
722 nvnflinger.OpenLayer(layer_id); 722 if (!nvnflinger.OpenLayer(layer_id)) {
723 LOG_WARNING(Service_VI, "Tried to open layer which was already open");
724 IPC::ResponseBuilder rb{ctx, 2};
725 rb.Push(ResultOperationFailed);
726 return;
727 }
723 728
724 android::OutputParcel parcel; 729 android::OutputParcel parcel;
725 parcel.WriteInterface(NativeWindow{*buffer_queue_id}); 730 parcel.WriteInterface(NativeWindow{*buffer_queue_id});
@@ -737,7 +742,12 @@ private:
737 742
738 LOG_DEBUG(Service_VI, "called. layer_id=0x{:016X}", layer_id); 743 LOG_DEBUG(Service_VI, "called. layer_id=0x{:016X}", layer_id);
739 744
740 nvnflinger.CloseLayer(layer_id); 745 if (!nvnflinger.CloseLayer(layer_id)) {
746 LOG_WARNING(Service_VI, "Tried to close layer which was not open");
747 IPC::ResponseBuilder rb{ctx, 2};
748 rb.Push(ResultOperationFailed);
749 return;
750 }
741 751
742 IPC::ResponseBuilder rb{ctx, 2}; 752 IPC::ResponseBuilder rb{ctx, 2};
743 rb.Push(ResultSuccess); 753 rb.Push(ResultSuccess);
diff --git a/src/frontend_common/CMakeLists.txt b/src/frontend_common/CMakeLists.txt
index 22e9337c4..94d8cc4c3 100644
--- a/src/frontend_common/CMakeLists.txt
+++ b/src/frontend_common/CMakeLists.txt
@@ -4,6 +4,7 @@
4add_library(frontend_common STATIC 4add_library(frontend_common STATIC
5 config.cpp 5 config.cpp
6 config.h 6 config.h
7 content_manager.h
7) 8)
8 9
9create_target_directory_groups(frontend_common) 10create_target_directory_groups(frontend_common)
diff --git a/src/frontend_common/content_manager.h b/src/frontend_common/content_manager.h
new file mode 100644
index 000000000..0b0fee73e
--- /dev/null
+++ b/src/frontend_common/content_manager.h
@@ -0,0 +1,371 @@
1// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <boost/algorithm/string.hpp>
7#include "common/common_types.h"
8#include "common/literals.h"
9#include "core/core.h"
10#include "core/file_sys/common_funcs.h"
11#include "core/file_sys/content_archive.h"
12#include "core/file_sys/mode.h"
13#include "core/file_sys/nca_metadata.h"
14#include "core/file_sys/patch_manager.h"
15#include "core/file_sys/registered_cache.h"
16#include "core/file_sys/submission_package.h"
17#include "core/hle/service/filesystem/filesystem.h"
18#include "core/loader/loader.h"
19#include "core/loader/nca.h"
20
21namespace ContentManager {
22
23enum class InstallResult {
24 Success,
25 Overwrite,
26 Failure,
27 BaseInstallAttempted,
28};
29
30enum class GameVerificationResult {
31 Success,
32 Failed,
33 NotImplemented,
34};
35
36/**
37 * \brief Removes a single installed DLC
38 * \param fs_controller [FileSystemController] reference from the Core::System instance
39 * \param title_id Unique title ID representing the DLC which will be removed
40 * \return 'true' if successful
41 */
42inline bool RemoveDLC(const Service::FileSystem::FileSystemController& fs_controller,
43 const u64 title_id) {
44 return fs_controller.GetUserNANDContents()->RemoveExistingEntry(title_id) ||
45 fs_controller.GetSDMCContents()->RemoveExistingEntry(title_id);
46}
47
48/**
49 * \brief Removes all DLC for a game
50 * \param system Raw pointer to the system instance
51 * \param program_id Program ID for the game that will have all of its DLC removed
52 * \return Number of DLC removed
53 */
54inline size_t RemoveAllDLC(Core::System* system, const u64 program_id) {
55 size_t count{};
56 const auto& fs_controller = system->GetFileSystemController();
57 const auto dlc_entries = system->GetContentProvider().ListEntriesFilter(
58 FileSys::TitleType::AOC, FileSys::ContentRecordType::Data);
59 std::vector<u64> program_dlc_entries;
60
61 for (const auto& entry : dlc_entries) {
62 if (FileSys::GetBaseTitleID(entry.title_id) == program_id) {
63 program_dlc_entries.push_back(entry.title_id);
64 }
65 }
66
67 for (const auto& entry : program_dlc_entries) {
68 if (RemoveDLC(fs_controller, entry)) {
69 ++count;
70 }
71 }
72 return count;
73}
74
75/**
76 * \brief Removes the installed update for a game
77 * \param fs_controller [FileSystemController] reference from the Core::System instance
78 * \param program_id Program ID for the game that will have its installed update removed
79 * \return 'true' if successful
80 */
81inline bool RemoveUpdate(const Service::FileSystem::FileSystemController& fs_controller,
82 const u64 program_id) {
83 const auto update_id = program_id | 0x800;
84 return fs_controller.GetUserNANDContents()->RemoveExistingEntry(update_id) ||
85 fs_controller.GetSDMCContents()->RemoveExistingEntry(update_id);
86}
87
88/**
89 * \brief Removes the base content for a game
90 * \param fs_controller [FileSystemController] reference from the Core::System instance
91 * \param program_id Program ID for the game that will have its base content removed
92 * \return 'true' if successful
93 */
94inline bool RemoveBaseContent(const Service::FileSystem::FileSystemController& fs_controller,
95 const u64 program_id) {
96 return fs_controller.GetUserNANDContents()->RemoveExistingEntry(program_id) ||
97 fs_controller.GetSDMCContents()->RemoveExistingEntry(program_id);
98}
99
100/**
101 * \brief Removes a mod for a game
102 * \param fs_controller [FileSystemController] reference from the Core::System instance
103 * \param program_id Program ID for the game where [mod_name] will be removed
104 * \param mod_name The name of a mod as given by FileSys::PatchManager::GetPatches. This corresponds
105 * with the name of the mod's directory in a game's load folder.
106 * \return 'true' if successful
107 */
108inline bool RemoveMod(const Service::FileSystem::FileSystemController& fs_controller,
109 const u64 program_id, const std::string& mod_name) {
110 // Check general Mods (LayeredFS and IPS)
111 const auto mod_dir = fs_controller.GetModificationLoadRoot(program_id);
112 if (mod_dir != nullptr) {
113 return mod_dir->DeleteSubdirectoryRecursive(mod_name);
114 }
115
116 // Check SDMC mod directory (RomFS LayeredFS)
117 const auto sdmc_mod_dir = fs_controller.GetSDMCModificationLoadRoot(program_id);
118 if (sdmc_mod_dir != nullptr) {
119 return sdmc_mod_dir->DeleteSubdirectoryRecursive(mod_name);
120 }
121
122 return false;
123}
124
125/**
126 * \brief Installs an NSP
127 * \param system Raw pointer to the system instance
128 * \param vfs Raw pointer to the VfsFilesystem instance in Core::System
129 * \param filename Path to the NSP file
130 * \param callback Callback to report the progress of the installation. The first size_t
131 * parameter is the total size of the virtual file and the second is the current progress. If you
132 * return true to the callback, it will cancel the installation as soon as possible.
133 * \return [InstallResult] representing how the installation finished
134 */
135inline InstallResult InstallNSP(Core::System* system, FileSys::VfsFilesystem* vfs,
136 const std::string& filename,
137 const std::function<bool(size_t, size_t)>& callback) {
138 const auto copy = [callback](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest,
139 std::size_t block_size) {
140 if (src == nullptr || dest == nullptr) {
141 return false;
142 }
143 if (!dest->Resize(src->GetSize())) {
144 return false;
145 }
146
147 using namespace Common::Literals;
148 std::vector<u8> buffer(1_MiB);
149
150 for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
151 if (callback(src->GetSize(), i)) {
152 dest->Resize(0);
153 return false;
154 }
155 const auto read = src->Read(buffer.data(), buffer.size(), i);
156 dest->Write(buffer.data(), read, i);
157 }
158 return true;
159 };
160
161 std::shared_ptr<FileSys::NSP> nsp;
162 FileSys::VirtualFile file = vfs->OpenFile(filename, FileSys::Mode::Read);
163 if (boost::to_lower_copy(file->GetName()).ends_with(std::string("nsp"))) {
164 nsp = std::make_shared<FileSys::NSP>(file);
165 if (nsp->IsExtractedType()) {
166 return InstallResult::Failure;
167 }
168 } else {
169 return InstallResult::Failure;
170 }
171
172 if (nsp->GetStatus() != Loader::ResultStatus::Success) {
173 return InstallResult::Failure;
174 }
175 const auto res =
176 system->GetFileSystemController().GetUserNANDContents()->InstallEntry(*nsp, true, copy);
177 switch (res) {
178 case FileSys::InstallResult::Success:
179 return InstallResult::Success;
180 case FileSys::InstallResult::OverwriteExisting:
181 return InstallResult::Overwrite;
182 case FileSys::InstallResult::ErrorBaseInstall:
183 return InstallResult::BaseInstallAttempted;
184 default:
185 return InstallResult::Failure;
186 }
187}
188
189/**
190 * \brief Installs an NCA
191 * \param vfs Raw pointer to the VfsFilesystem instance in Core::System
192 * \param filename Path to the NCA file
193 * \param registered_cache Raw pointer to the registered cache that the NCA will be installed to
194 * \param title_type Type of NCA package to install
195 * \param callback Callback to report the progress of the installation. The first size_t
196 * parameter is the total size of the virtual file and the second is the current progress. If you
197 * return true to the callback, it will cancel the installation as soon as possible.
198 * \return [InstallResult] representing how the installation finished
199 */
200inline InstallResult InstallNCA(FileSys::VfsFilesystem* vfs, const std::string& filename,
201 FileSys::RegisteredCache* registered_cache,
202 const FileSys::TitleType title_type,
203 const std::function<bool(size_t, size_t)>& callback) {
204 const auto copy = [callback](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest,
205 std::size_t block_size) {
206 if (src == nullptr || dest == nullptr) {
207 return false;
208 }
209 if (!dest->Resize(src->GetSize())) {
210 return false;
211 }
212
213 using namespace Common::Literals;
214 std::vector<u8> buffer(1_MiB);
215
216 for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
217 if (callback(src->GetSize(), i)) {
218 dest->Resize(0);
219 return false;
220 }
221 const auto read = src->Read(buffer.data(), buffer.size(), i);
222 dest->Write(buffer.data(), read, i);
223 }
224 return true;
225 };
226
227 const auto nca = std::make_shared<FileSys::NCA>(vfs->OpenFile(filename, FileSys::Mode::Read));
228 const auto id = nca->GetStatus();
229
230 // Game updates necessary are missing base RomFS
231 if (id != Loader::ResultStatus::Success &&
232 id != Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) {
233 return InstallResult::Failure;
234 }
235
236 const auto res = registered_cache->InstallEntry(*nca, title_type, true, copy);
237 if (res == FileSys::InstallResult::Success) {
238 return InstallResult::Success;
239 } else if (res == FileSys::InstallResult::OverwriteExisting) {
240 return InstallResult::Overwrite;
241 } else {
242 return InstallResult::Failure;
243 }
244}
245
246/**
247 * \brief Verifies the installed contents for a given ManualContentProvider
248 * \param system Raw pointer to the system instance
249 * \param provider Raw pointer to the content provider that's tracking indexed games
250 * \param callback Callback to report the progress of the installation. The first size_t
251 * parameter is the total size of the installed contents and the second is the current progress. If
252 * you return true to the callback, it will cancel the installation as soon as possible.
253 * \return A list of entries that failed to install. Returns an empty vector if successful.
254 */
255inline std::vector<std::string> VerifyInstalledContents(
256 Core::System* system, FileSys::ManualContentProvider* provider,
257 const std::function<bool(size_t, size_t)>& callback) {
258 // Get content registries.
259 auto bis_contents = system->GetFileSystemController().GetSystemNANDContents();
260 auto user_contents = system->GetFileSystemController().GetUserNANDContents();
261
262 std::vector<FileSys::RegisteredCache*> content_providers;
263 if (bis_contents) {
264 content_providers.push_back(bis_contents);
265 }
266 if (user_contents) {
267 content_providers.push_back(user_contents);
268 }
269
270 // Get associated NCA files.
271 std::vector<FileSys::VirtualFile> nca_files;
272
273 // Get all installed IDs.
274 size_t total_size = 0;
275 for (auto nca_provider : content_providers) {
276 const auto entries = nca_provider->ListEntriesFilter();
277
278 for (const auto& entry : entries) {
279 auto nca_file = nca_provider->GetEntryRaw(entry.title_id, entry.type);
280 if (!nca_file) {
281 continue;
282 }
283
284 total_size += nca_file->GetSize();
285 nca_files.push_back(std::move(nca_file));
286 }
287 }
288
289 // Declare a list of file names which failed to verify.
290 std::vector<std::string> failed;
291
292 size_t processed_size = 0;
293 bool cancelled = false;
294 auto nca_callback = [&](size_t nca_processed, size_t nca_total) {
295 cancelled = callback(total_size, processed_size + nca_processed);
296 return !cancelled;
297 };
298
299 // Using the NCA loader, determine if all NCAs are valid.
300 for (auto& nca_file : nca_files) {
301 Loader::AppLoader_NCA nca_loader(nca_file);
302
303 auto status = nca_loader.VerifyIntegrity(nca_callback);
304 if (cancelled) {
305 break;
306 }
307 if (status != Loader::ResultStatus::Success) {
308 FileSys::NCA nca(nca_file);
309 const auto title_id = nca.GetTitleId();
310 std::string title_name = "unknown";
311
312 const auto control = provider->GetEntry(FileSys::GetBaseTitleID(title_id),
313 FileSys::ContentRecordType::Control);
314 if (control && control->GetStatus() == Loader::ResultStatus::Success) {
315 const FileSys::PatchManager pm{title_id, system->GetFileSystemController(),
316 *provider};
317 const auto [nacp, logo] = pm.ParseControlNCA(*control);
318 if (nacp) {
319 title_name = nacp->GetApplicationName();
320 }
321 }
322
323 if (title_id > 0) {
324 failed.push_back(
325 fmt::format("{} ({:016X}) ({})", nca_file->GetName(), title_id, title_name));
326 } else {
327 failed.push_back(fmt::format("{} (unknown)", nca_file->GetName()));
328 }
329 }
330
331 processed_size += nca_file->GetSize();
332 }
333 return failed;
334}
335
336/**
337 * \brief Verifies the contents of a given game
338 * \param system Raw pointer to the system instance
339 * \param game_path Patch to the game file
340 * \param callback Callback to report the progress of the installation. The first size_t
341 * parameter is the total size of the installed contents and the second is the current progress. If
342 * you return true to the callback, it will cancel the installation as soon as possible.
343 * \return GameVerificationResult representing how the verification process finished
344 */
345inline GameVerificationResult VerifyGameContents(
346 Core::System* system, const std::string& game_path,
347 const std::function<bool(size_t, size_t)>& callback) {
348 const auto loader = Loader::GetLoader(
349 *system, system->GetFilesystem()->OpenFile(game_path, FileSys::Mode::Read));
350 if (loader == nullptr) {
351 return GameVerificationResult::NotImplemented;
352 }
353
354 bool cancelled = false;
355 auto loader_callback = [&](size_t processed, size_t total) {
356 cancelled = callback(total, processed);
357 return !cancelled;
358 };
359
360 const auto status = loader->VerifyIntegrity(loader_callback);
361 if (cancelled || status == Loader::ResultStatus::ErrorIntegrityVerificationNotImplemented) {
362 return GameVerificationResult::NotImplemented;
363 }
364
365 if (status == Loader::ResultStatus::ErrorIntegrityVerificationFailed) {
366 return GameVerificationResult::Failed;
367 }
368 return GameVerificationResult::Success;
369}
370
371} // namespace ContentManager
diff --git a/src/hid_core/frontend/emulated_controller.cpp b/src/hid_core/frontend/emulated_controller.cpp
index 2ab93402d..e12e5a77e 100644
--- a/src/hid_core/frontend/emulated_controller.cpp
+++ b/src/hid_core/frontend/emulated_controller.cpp
@@ -110,6 +110,7 @@ void EmulatedController::ReloadFromSettings() {
110 original_npad_type = npad_type; 110 original_npad_type = npad_type;
111 } 111 }
112 112
113 SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::Active);
113 Disconnect(); 114 Disconnect();
114 if (player.connected) { 115 if (player.connected) {
115 Connect(); 116 Connect();
@@ -144,8 +145,8 @@ void EmulatedController::ReloadColorsFromSettings() {
144 145
145void EmulatedController::LoadDevices() { 146void EmulatedController::LoadDevices() {
146 // TODO(german77): Use more buttons to detect the correct device 147 // TODO(german77): Use more buttons to detect the correct device
147 const auto left_joycon = button_params[Settings::NativeButton::DRight]; 148 const auto& left_joycon = button_params[Settings::NativeButton::DRight];
148 const auto right_joycon = button_params[Settings::NativeButton::A]; 149 const auto& right_joycon = button_params[Settings::NativeButton::A];
149 150
150 // Triggers for GC controllers 151 // Triggers for GC controllers
151 trigger_params[LeftIndex] = button_params[Settings::NativeButton::ZL]; 152 trigger_params[LeftIndex] = button_params[Settings::NativeButton::ZL];
@@ -1208,16 +1209,44 @@ void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) {
1208 controller.nfc_state = controller.nfc_values; 1209 controller.nfc_state = controller.nfc_values;
1209} 1210}
1210 1211
1211bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { 1212bool EmulatedController::SetVibration(bool should_vibrate) {
1213 VibrationValue vibration_value = DEFAULT_VIBRATION_VALUE;
1214 if (should_vibrate) {
1215 vibration_value.high_amplitude = 1.0f;
1216 vibration_value.low_amplitude = 1.0f;
1217 }
1218
1219 return SetVibration(DeviceIndex::Left, vibration_value);
1220}
1221
1222bool EmulatedController::SetVibration(u32 slot, Core::HID::VibrationGcErmCommand erm_command) {
1223 VibrationValue vibration_value = DEFAULT_VIBRATION_VALUE;
1224 if (erm_command == Core::HID::VibrationGcErmCommand::Start) {
1225 vibration_value.high_amplitude = 1.0f;
1226 vibration_value.low_amplitude = 1.0f;
1227 }
1228
1229 return SetVibration(DeviceIndex::Left, vibration_value);
1230}
1231
1232bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationValue& vibration) {
1212 if (!is_initialized) { 1233 if (!is_initialized) {
1213 return false; 1234 return false;
1214 } 1235 }
1215 if (device_index >= output_devices.size()) { 1236 if (device_index >= DeviceIndex::MaxDeviceIndex) {
1216 return false; 1237 return false;
1217 } 1238 }
1218 if (!output_devices[device_index]) { 1239 const std::size_t index = static_cast<std::size_t>(device_index);
1240 if (!output_devices[index]) {
1241 return false;
1242 }
1243
1244 last_vibration_value = vibration;
1245
1246 if (!Settings::values.vibration_enabled) {
1219 return false; 1247 return false;
1220 } 1248 }
1249
1221 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type); 1250 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
1222 const auto& player = Settings::values.players.GetValue()[player_index]; 1251 const auto& player = Settings::values.players.GetValue()[player_index];
1223 const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f; 1252 const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f;
@@ -1239,8 +1268,11 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v
1239 .high_frequency = vibration.high_frequency, 1268 .high_frequency = vibration.high_frequency,
1240 .type = type, 1269 .type = type,
1241 }; 1270 };
1242 return output_devices[device_index]->SetVibration(status) == 1271 return output_devices[index]->SetVibration(status) == Common::Input::DriverResult::Success;
1243 Common::Input::DriverResult::Success; 1272}
1273
1274VibrationValue EmulatedController::GetActualVibrationValue(DeviceIndex device_index) const {
1275 return last_vibration_value;
1244} 1276}
1245 1277
1246bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { 1278bool EmulatedController::IsVibrationEnabled(std::size_t device_index) {
diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h
index 90e536e07..168abe089 100644
--- a/src/hid_core/frontend/emulated_controller.h
+++ b/src/hid_core/frontend/emulated_controller.h
@@ -356,10 +356,27 @@ public:
356 const NfcState& GetNfc() const; 356 const NfcState& GetNfc() const;
357 357
358 /** 358 /**
359 * Sends an on/off vibration to the left device
360 * @return true if vibration had no errors
361 */
362 bool SetVibration(bool should_vibrate);
363
364 /**
365 * Sends an GC vibration to the left device
366 * @return true if vibration had no errors
367 */
368 bool SetVibration(u32 slot, Core::HID::VibrationGcErmCommand erm_command);
369
370 /**
359 * Sends a specific vibration to the output device 371 * Sends a specific vibration to the output device
360 * @return true if vibration had no errors 372 * @return true if vibration had no errors
361 */ 373 */
362 bool SetVibration(std::size_t device_index, VibrationValue vibration); 374 bool SetVibration(DeviceIndex device_index, const VibrationValue& vibration);
375
376 /**
377 * @return The last sent vibration
378 */
379 VibrationValue GetActualVibrationValue(DeviceIndex device_index) const;
363 380
364 /** 381 /**
365 * Sends a small vibration to the output device 382 * Sends a small vibration to the output device
@@ -564,6 +581,7 @@ private:
564 f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard}; 581 f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard};
565 u32 turbo_button_state{0}; 582 u32 turbo_button_state{0};
566 std::size_t nfc_handles{0}; 583 std::size_t nfc_handles{0};
584 VibrationValue last_vibration_value{DEFAULT_VIBRATION_VALUE};
567 585
568 // Temporary values to avoid doing changes while the controller is in configuring mode 586 // Temporary values to avoid doing changes while the controller is in configuring mode
569 NpadStyleIndex tmp_npad_type{NpadStyleIndex::None}; 587 NpadStyleIndex tmp_npad_type{NpadStyleIndex::None};
diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp
index 2c5fe6d51..ca824b4a3 100644
--- a/src/hid_core/resource_manager.cpp
+++ b/src/hid_core/resource_manager.cpp
@@ -7,6 +7,7 @@
7#include "core/hle/kernel/k_shared_memory.h" 7#include "core/hle/kernel/k_shared_memory.h"
8#include "core/hle/service/ipc_helpers.h" 8#include "core/hle/service/ipc_helpers.h"
9#include "hid_core/hid_core.h" 9#include "hid_core/hid_core.h"
10#include "hid_core/hid_util.h"
10#include "hid_core/resource_manager.h" 11#include "hid_core/resource_manager.h"
11 12
12#include "hid_core/resources/applet_resource.h" 13#include "hid_core/resources/applet_resource.h"
@@ -27,6 +28,10 @@
27#include "hid_core/resources/touch_screen/gesture.h" 28#include "hid_core/resources/touch_screen/gesture.h"
28#include "hid_core/resources/touch_screen/touch_screen.h" 29#include "hid_core/resources/touch_screen/touch_screen.h"
29#include "hid_core/resources/unique_pad/unique_pad.h" 30#include "hid_core/resources/unique_pad/unique_pad.h"
31#include "hid_core/resources/vibration/gc_vibration_device.h"
32#include "hid_core/resources/vibration/n64_vibration_device.h"
33#include "hid_core/resources/vibration/vibration_base.h"
34#include "hid_core/resources/vibration/vibration_device.h"
30 35
31namespace Service::HID { 36namespace Service::HID {
32 37
@@ -52,6 +57,7 @@ void ResourceManager::Initialize() {
52 57
53 system.HIDCore().ReloadInputDevices(); 58 system.HIDCore().ReloadInputDevices();
54 59
60 handheld_config = std::make_shared<HandheldConfig>();
55 InitializeHidCommonSampler(); 61 InitializeHidCommonSampler();
56 InitializeTouchScreenSampler(); 62 InitializeTouchScreenSampler();
57 InitializeConsoleSixAxisSampler(); 63 InitializeConsoleSixAxisSampler();
@@ -174,7 +180,7 @@ void ResourceManager::InitializeHidCommonSampler() {
174 debug_pad->SetAppletResource(applet_resource, &shared_mutex); 180 debug_pad->SetAppletResource(applet_resource, &shared_mutex);
175 digitizer->SetAppletResource(applet_resource, &shared_mutex); 181 digitizer->SetAppletResource(applet_resource, &shared_mutex);
176 keyboard->SetAppletResource(applet_resource, &shared_mutex); 182 keyboard->SetAppletResource(applet_resource, &shared_mutex);
177 npad->SetNpadExternals(applet_resource, &shared_mutex); 183 npad->SetNpadExternals(applet_resource, &shared_mutex, handheld_config);
178 six_axis->SetAppletResource(applet_resource, &shared_mutex); 184 six_axis->SetAppletResource(applet_resource, &shared_mutex);
179 mouse->SetAppletResource(applet_resource, &shared_mutex); 185 mouse->SetAppletResource(applet_resource, &shared_mutex);
180 debug_mouse->SetAppletResource(applet_resource, &shared_mutex); 186 debug_mouse->SetAppletResource(applet_resource, &shared_mutex);
@@ -257,6 +263,121 @@ void ResourceManager::EnableTouchScreen(u64 aruid, bool is_enabled) {
257 applet_resource->EnableTouchScreen(aruid, is_enabled); 263 applet_resource->EnableTouchScreen(aruid, is_enabled);
258} 264}
259 265
266NpadVibrationBase* ResourceManager::GetVibrationDevice(
267 const Core::HID::VibrationDeviceHandle& handle) {
268 return npad->GetVibrationDevice(handle);
269}
270
271NpadN64VibrationDevice* ResourceManager::GetN64VibrationDevice(
272 const Core::HID::VibrationDeviceHandle& handle) {
273 return npad->GetN64VibrationDevice(handle);
274}
275
276NpadVibrationDevice* ResourceManager::GetNSVibrationDevice(
277 const Core::HID::VibrationDeviceHandle& handle) {
278 return npad->GetNSVibrationDevice(handle);
279}
280
281NpadGcVibrationDevice* ResourceManager::GetGcVibrationDevice(
282 const Core::HID::VibrationDeviceHandle& handle) {
283 return npad->GetGcVibrationDevice(handle);
284}
285
286Result ResourceManager::SetAruidValidForVibration(u64 aruid, bool is_enabled) {
287 std::scoped_lock lock{shared_mutex};
288 const bool has_changed = applet_resource->SetAruidValidForVibration(aruid, is_enabled);
289
290 if (has_changed) {
291 auto devices = npad->GetAllVibrationDevices();
292 for ([[maybe_unused]] auto* device : devices) {
293 // TODO
294 }
295 }
296
297 auto* vibration_handler = npad->GetVibrationHandler();
298 if (aruid != vibration_handler->GetSessionAruid()) {
299 vibration_handler->EndPermitVibrationSession();
300 }
301
302 return ResultSuccess;
303}
304
305void ResourceManager::SetForceHandheldStyleVibration(bool is_forced) {
306 handheld_config->is_force_handheld_style_vibration = is_forced;
307}
308
309Result ResourceManager::IsVibrationAruidActive(u64 aruid, bool& is_active) const {
310 std::scoped_lock lock{shared_mutex};
311 is_active = applet_resource->IsVibrationAruidActive(aruid);
312 return ResultSuccess;
313}
314
315Result ResourceManager::GetVibrationDeviceInfo(Core::HID::VibrationDeviceInfo& device_info,
316 const Core::HID::VibrationDeviceHandle& handle) {
317 bool check_device_index = false;
318
319 const Result is_valid = IsVibrationHandleValid(handle);
320 if (is_valid.IsError()) {
321 return is_valid;
322 }
323
324 switch (handle.npad_type) {
325 case Core::HID::NpadStyleIndex::Fullkey:
326 case Core::HID::NpadStyleIndex::Handheld:
327 case Core::HID::NpadStyleIndex::JoyconDual:
328 case Core::HID::NpadStyleIndex::JoyconLeft:
329 case Core::HID::NpadStyleIndex::JoyconRight:
330 device_info.type = Core::HID::VibrationDeviceType::LinearResonantActuator;
331 check_device_index = true;
332 break;
333 case Core::HID::NpadStyleIndex::GameCube:
334 device_info.type = Core::HID::VibrationDeviceType::GcErm;
335 break;
336 case Core::HID::NpadStyleIndex::N64:
337 device_info.type = Core::HID::VibrationDeviceType::N64;
338 break;
339 default:
340 device_info.type = Core::HID::VibrationDeviceType::Unknown;
341 break;
342 }
343
344 device_info.position = Core::HID::VibrationDevicePosition::None;
345 if (check_device_index) {
346 switch (handle.device_index) {
347 case Core::HID::DeviceIndex::Left:
348 device_info.position = Core::HID::VibrationDevicePosition::Left;
349 break;
350 case Core::HID::DeviceIndex::Right:
351 device_info.position = Core::HID::VibrationDevicePosition::Right;
352 break;
353 case Core::HID::DeviceIndex::None:
354 default:
355 ASSERT_MSG(false, "DeviceIndex should never be None!");
356 break;
357 }
358 }
359 return ResultSuccess;
360}
361
362Result ResourceManager::SendVibrationValue(u64 aruid,
363 const Core::HID::VibrationDeviceHandle& handle,
364 const Core::HID::VibrationValue& value) {
365 bool has_active_aruid{};
366 NpadVibrationDevice* device{nullptr};
367 Result result = IsVibrationAruidActive(aruid, has_active_aruid);
368
369 if (result.IsSuccess() && has_active_aruid) {
370 result = IsVibrationHandleValid(handle);
371 }
372 if (result.IsSuccess() && has_active_aruid) {
373 device = GetNSVibrationDevice(handle);
374 }
375 if (device != nullptr) {
376 result = device->SendVibrationValue(value);
377 }
378 return result;
379}
380
260void ResourceManager::UpdateControllers(std::chrono::nanoseconds ns_late) { 381void ResourceManager::UpdateControllers(std::chrono::nanoseconds ns_late) {
261 auto& core_timing = system.CoreTiming(); 382 auto& core_timing = system.CoreTiming();
262 debug_pad->OnUpdate(core_timing); 383 debug_pad->OnUpdate(core_timing);
diff --git a/src/hid_core/resource_manager.h b/src/hid_core/resource_manager.h
index 7a21d8eb8..128e00125 100644
--- a/src/hid_core/resource_manager.h
+++ b/src/hid_core/resource_manager.h
@@ -10,6 +10,12 @@ namespace Core {
10class System; 10class System;
11} 11}
12 12
13namespace Core::HID {
14struct VibrationDeviceHandle;
15struct VibrationValue;
16struct VibrationDeviceInfo;
17} // namespace Core::HID
18
13namespace Core::Timing { 19namespace Core::Timing {
14struct EventType; 20struct EventType;
15} 21}
@@ -37,6 +43,11 @@ class SixAxis;
37class SleepButton; 43class SleepButton;
38class TouchScreen; 44class TouchScreen;
39class UniquePad; 45class UniquePad;
46class NpadVibrationBase;
47class NpadN64VibrationDevice;
48class NpadGcVibrationDevice;
49class NpadVibrationDevice;
50struct HandheldConfig;
40 51
41class ResourceManager { 52class ResourceManager {
42 53
@@ -79,6 +90,18 @@ public:
79 void EnablePadInput(u64 aruid, bool is_enabled); 90 void EnablePadInput(u64 aruid, bool is_enabled);
80 void EnableTouchScreen(u64 aruid, bool is_enabled); 91 void EnableTouchScreen(u64 aruid, bool is_enabled);
81 92
93 NpadVibrationBase* GetVibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
94 NpadN64VibrationDevice* GetN64VibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
95 NpadVibrationDevice* GetNSVibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
96 NpadGcVibrationDevice* GetGcVibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
97 Result SetAruidValidForVibration(u64 aruid, bool is_enabled);
98 void SetForceHandheldStyleVibration(bool is_forced);
99 Result IsVibrationAruidActive(u64 aruid, bool& is_active) const;
100 Result GetVibrationDeviceInfo(Core::HID::VibrationDeviceInfo& device_info,
101 const Core::HID::VibrationDeviceHandle& handle);
102 Result SendVibrationValue(u64 aruid, const Core::HID::VibrationDeviceHandle& handle,
103 const Core::HID::VibrationValue& value);
104
82 void UpdateControllers(std::chrono::nanoseconds ns_late); 105 void UpdateControllers(std::chrono::nanoseconds ns_late);
83 void UpdateNpad(std::chrono::nanoseconds ns_late); 106 void UpdateNpad(std::chrono::nanoseconds ns_late);
84 void UpdateMouseKeyboard(std::chrono::nanoseconds ns_late); 107 void UpdateMouseKeyboard(std::chrono::nanoseconds ns_late);
@@ -113,6 +136,8 @@ private:
113 std::shared_ptr<TouchScreen> touch_screen = nullptr; 136 std::shared_ptr<TouchScreen> touch_screen = nullptr;
114 std::shared_ptr<UniquePad> unique_pad = nullptr; 137 std::shared_ptr<UniquePad> unique_pad = nullptr;
115 138
139 std::shared_ptr<HandheldConfig> handheld_config = nullptr;
140
116 // TODO: Create these resources 141 // TODO: Create these resources
117 // std::shared_ptr<AudioControl> audio_control = nullptr; 142 // std::shared_ptr<AudioControl> audio_control = nullptr;
118 // std::shared_ptr<ButtonConfig> button_config = nullptr; 143 // std::shared_ptr<ButtonConfig> button_config = nullptr;
diff --git a/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp
index d4e4181bf..e399edfd7 100644
--- a/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp
+++ b/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp
@@ -115,7 +115,7 @@ Result NpadAbstractIrSensorHandler::GetXcdHandleForNpadWithIrSensor(u64& handle)
115 if (sensor_state < NpadIrSensorState::Available) { 115 if (sensor_state < NpadIrSensorState::Available) {
116 return ResultIrSensorIsNotReady; 116 return ResultIrSensorIsNotReady;
117 } 117 }
118 handle = xcd_handle; 118 // handle = xcd_handle;
119 return ResultSuccess; 119 return ResultSuccess;
120} 120}
121 121
diff --git a/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.h b/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.h
index fe8e005af..997811511 100644
--- a/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.h
+++ b/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.h
@@ -7,6 +7,10 @@
7#include "core/hle/result.h" 7#include "core/hle/result.h"
8#include "hid_core/hid_types.h" 8#include "hid_core/hid_types.h"
9 9
10namespace Core::HID {
11class EmulatedController;
12}
13
10namespace Kernel { 14namespace Kernel {
11class KEvent; 15class KEvent;
12class KReadableEvent; 16class KReadableEvent;
@@ -50,7 +54,7 @@ private:
50 54
51 s32 ref_counter{}; 55 s32 ref_counter{};
52 Kernel::KEvent* ir_sensor_event{nullptr}; 56 Kernel::KEvent* ir_sensor_event{nullptr};
53 u64 xcd_handle{}; 57 Core::HID::EmulatedController* xcd_handle{};
54 NpadIrSensorState sensor_state{}; 58 NpadIrSensorState sensor_state{};
55}; 59};
56} // namespace Service::HID 60} // namespace Service::HID
diff --git a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp
index 2c7691d7c..435b095f0 100644
--- a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp
+++ b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp
@@ -1,6 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "hid_core/hid_core.h"
4#include "hid_core/hid_result.h" 5#include "hid_core/hid_result.h"
5#include "hid_core/resources/abstracted_pad/abstract_pad.h" 6#include "hid_core/resources/abstracted_pad/abstract_pad.h"
6#include "hid_core/resources/applet_resource.h" 7#include "hid_core/resources/applet_resource.h"
@@ -16,7 +17,7 @@ void AbstractPad::SetExternals(AppletResourceHolder* applet_resource,
16 CaptureButtonResource* capture_button_resource, 17 CaptureButtonResource* capture_button_resource,
17 HomeButtonResource* home_button_resource, 18 HomeButtonResource* home_button_resource,
18 SixAxisResource* sixaxis_resource, PalmaResource* palma_resource, 19 SixAxisResource* sixaxis_resource, PalmaResource* palma_resource,
19 VibrationHandler* vibration) { 20 NpadVibration* vibration, Core::HID::HIDCore* core) {
20 applet_resource_holder = applet_resource; 21 applet_resource_holder = applet_resource;
21 22
22 properties_handler.SetAppletResource(applet_resource_holder); 23 properties_handler.SetAppletResource(applet_resource_holder);
@@ -35,13 +36,14 @@ void AbstractPad::SetExternals(AppletResourceHolder* applet_resource,
35 mcu_handler.SetAbstractPadHolder(&abstract_pad_holder); 36 mcu_handler.SetAbstractPadHolder(&abstract_pad_holder);
36 mcu_handler.SetPropertiesHandler(&properties_handler); 37 mcu_handler.SetPropertiesHandler(&properties_handler);
37 38
38 std::array<NpadVibrationDevice*, 2> vibration_devices{&vibration_left, &vibration_right};
39 vibration_handler.SetAppletResource(applet_resource_holder); 39 vibration_handler.SetAppletResource(applet_resource_holder);
40 vibration_handler.SetAbstractPadHolder(&abstract_pad_holder); 40 vibration_handler.SetAbstractPadHolder(&abstract_pad_holder);
41 vibration_handler.SetPropertiesHandler(&properties_handler); 41 vibration_handler.SetPropertiesHandler(&properties_handler);
42 vibration_handler.SetN64Vibration(&vibration_n64); 42 vibration_handler.SetN64Vibration(&vibration_n64);
43 vibration_handler.SetVibration(vibration_devices); 43 vibration_handler.SetVibration(&vibration_left, &vibration_right);
44 vibration_handler.SetGcVibration(&vibration_gc); 44 vibration_handler.SetGcVibration(&vibration_gc);
45 vibration_handler.SetVibrationHandler(vibration);
46 vibration_handler.SetHidCore(core);
45 47
46 sixaxis_handler.SetAppletResource(applet_resource_holder); 48 sixaxis_handler.SetAppletResource(applet_resource_holder);
47 sixaxis_handler.SetAbstractPadHolder(&abstract_pad_holder); 49 sixaxis_handler.SetAbstractPadHolder(&abstract_pad_holder);
@@ -239,11 +241,6 @@ NpadVibrationDevice* AbstractPad::GetVibrationDevice(Core::HID::DeviceIndex devi
239 return &vibration_left; 241 return &vibration_left;
240} 242}
241 243
242void AbstractPad::GetLeftRightVibrationDevice(std::vector<NpadVibrationDevice*> list) {
243 list.emplace_back(&vibration_left);
244 list.emplace_back(&vibration_right);
245}
246
247NpadGcVibrationDevice* AbstractPad::GetGCVibrationDevice() { 244NpadGcVibrationDevice* AbstractPad::GetGCVibrationDevice() {
248 return &vibration_gc; 245 return &vibration_gc;
249} 246}
diff --git a/src/hid_core/resources/abstracted_pad/abstract_pad.h b/src/hid_core/resources/abstracted_pad/abstract_pad.h
index cbdf84af7..329792457 100644
--- a/src/hid_core/resources/abstracted_pad/abstract_pad.h
+++ b/src/hid_core/resources/abstracted_pad/abstract_pad.h
@@ -32,7 +32,6 @@ class AppletResource;
32class SixAxisResource; 32class SixAxisResource;
33class PalmaResource; 33class PalmaResource;
34class NPadResource; 34class NPadResource;
35class AbstractPad;
36class NpadLastActiveHandler; 35class NpadLastActiveHandler;
37class NpadIrNfcHandler; 36class NpadIrNfcHandler;
38class UniquePads; 37class UniquePads;
@@ -44,7 +43,6 @@ class NpadGcVibration;
44 43
45class CaptureButtonResource; 44class CaptureButtonResource;
46class HomeButtonResource; 45class HomeButtonResource;
47class VibrationHandler;
48 46
49struct HandheldConfig; 47struct HandheldConfig;
50 48
@@ -57,7 +55,8 @@ public:
57 void SetExternals(AppletResourceHolder* applet_resource, 55 void SetExternals(AppletResourceHolder* applet_resource,
58 CaptureButtonResource* capture_button_resource, 56 CaptureButtonResource* capture_button_resource,
59 HomeButtonResource* home_button_resource, SixAxisResource* sixaxis_resource, 57 HomeButtonResource* home_button_resource, SixAxisResource* sixaxis_resource,
60 PalmaResource* palma_resource, VibrationHandler* vibration); 58 PalmaResource* palma_resource, NpadVibration* vibration,
59 Core::HID::HIDCore* core);
61 void SetNpadId(Core::HID::NpadIdType npad_id); 60 void SetNpadId(Core::HID::NpadIdType npad_id);
62 61
63 Result Activate(); 62 Result Activate();
@@ -78,7 +77,6 @@ public:
78 77
79 NpadN64VibrationDevice* GetN64VibrationDevice(); 78 NpadN64VibrationDevice* GetN64VibrationDevice();
80 NpadVibrationDevice* GetVibrationDevice(Core::HID::DeviceIndex device_index); 79 NpadVibrationDevice* GetVibrationDevice(Core::HID::DeviceIndex device_index);
81 void GetLeftRightVibrationDevice(std::vector<NpadVibrationDevice*> list);
82 NpadGcVibrationDevice* GetGCVibrationDevice(); 80 NpadGcVibrationDevice* GetGCVibrationDevice();
83 81
84 Core::HID::NpadIdType GetLastActiveNpad(); 82 Core::HID::NpadIdType GetLastActiveNpad();
diff --git a/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp
index a00d6c9de..ca64b0a43 100644
--- a/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp
+++ b/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp
@@ -1,6 +1,8 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "hid_core/frontend/emulated_controller.h"
5#include "hid_core/hid_core.h"
4#include "hid_core/hid_result.h" 6#include "hid_core/hid_result.h"
5#include "hid_core/hid_util.h" 7#include "hid_core/hid_util.h"
6#include "hid_core/resources/abstracted_pad/abstract_pad_holder.h" 8#include "hid_core/resources/abstracted_pad/abstract_pad_holder.h"
@@ -30,14 +32,22 @@ void NpadAbstractVibrationHandler::SetPropertiesHandler(NpadAbstractPropertiesHa
30 properties_handler = handler; 32 properties_handler = handler;
31} 33}
32 34
35void NpadAbstractVibrationHandler::SetVibrationHandler(NpadVibration* handler) {
36 vibration_handler = handler;
37}
38
39void NpadAbstractVibrationHandler::SetHidCore(Core::HID::HIDCore* core) {
40 hid_core = core;
41}
42
33void NpadAbstractVibrationHandler::SetN64Vibration(NpadN64VibrationDevice* n64_device) { 43void NpadAbstractVibrationHandler::SetN64Vibration(NpadN64VibrationDevice* n64_device) {
34 n64_vibration_device = n64_device; 44 n64_vibration_device = n64_device;
35} 45}
36 46
37void NpadAbstractVibrationHandler::SetVibration(std::span<NpadVibrationDevice*> device) { 47void NpadAbstractVibrationHandler::SetVibration(NpadVibrationDevice* left_device,
38 for (std::size_t i = 0; i < device.size() && i < vibration_device.size(); i++) { 48 NpadVibrationDevice* right_device) {
39 vibration_device[i] = device[i]; 49 left_vibration_device = left_device;
40 } 50 right_vibration_device = right_device;
41} 51}
42 52
43void NpadAbstractVibrationHandler::SetGcVibration(NpadGcVibrationDevice* gc_device) { 53void NpadAbstractVibrationHandler::SetGcVibration(NpadGcVibrationDevice* gc_device) {
@@ -69,5 +79,29 @@ void NpadAbstractVibrationHandler::UpdateVibrationState() {
69 if (!is_handheld_hid_enabled && is_force_handheld_style_vibration) { 79 if (!is_handheld_hid_enabled && is_force_handheld_style_vibration) {
70 // TODO 80 // TODO
71 } 81 }
82
83 // TODO: This function isn't accurate. It's supposed to get 5 abstracted pads from the
84 // NpadAbstractPropertiesHandler but this handler isn't fully implemented yet
85 IAbstractedPad abstracted_pad{};
86 const auto npad_id = properties_handler->GetNpadId();
87 abstracted_pad.xcd_handle = hid_core->GetEmulatedController(npad_id);
88 abstracted_pad.internal_flags.is_connected.Assign(abstracted_pad.xcd_handle->IsConnected());
89
90 if (abstracted_pad.internal_flags.is_connected) {
91 left_vibration_device->Mount(abstracted_pad, Core::HID::DeviceIndex::Left,
92 vibration_handler);
93 right_vibration_device->Mount(abstracted_pad, Core::HID::DeviceIndex::Right,
94 vibration_handler);
95 gc_vibration_device->Mount(abstracted_pad, 0, vibration_handler);
96 gc_vibration_device->Mount(abstracted_pad, 0, vibration_handler);
97 n64_vibration_device->Mount(abstracted_pad, vibration_handler);
98 return;
99 }
100
101 left_vibration_device->Unmount();
102 right_vibration_device->Unmount();
103 gc_vibration_device->Unmount();
104 gc_vibration_device->Unmount();
105 n64_vibration_device->Unmount();
72} 106}
73} // namespace Service::HID 107} // namespace Service::HID
diff --git a/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.h b/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.h
index aeb07ce86..8bc8129c2 100644
--- a/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.h
+++ b/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.h
@@ -9,6 +9,10 @@
9#include "core/hle/result.h" 9#include "core/hle/result.h"
10#include "hid_core/hid_types.h" 10#include "hid_core/hid_types.h"
11 11
12namespace Core::HID {
13class HIDCore;
14}
15
12namespace Service::HID { 16namespace Service::HID {
13struct AppletResourceHolder; 17struct AppletResourceHolder;
14class NpadAbstractedPadHolder; 18class NpadAbstractedPadHolder;
@@ -27,9 +31,11 @@ public:
27 void SetAbstractPadHolder(NpadAbstractedPadHolder* holder); 31 void SetAbstractPadHolder(NpadAbstractedPadHolder* holder);
28 void SetAppletResource(AppletResourceHolder* applet_resource); 32 void SetAppletResource(AppletResourceHolder* applet_resource);
29 void SetPropertiesHandler(NpadAbstractPropertiesHandler* handler); 33 void SetPropertiesHandler(NpadAbstractPropertiesHandler* handler);
34 void SetVibrationHandler(NpadVibration* handler);
35 void SetHidCore(Core::HID::HIDCore* core);
30 36
31 void SetN64Vibration(NpadN64VibrationDevice* n64_device); 37 void SetN64Vibration(NpadN64VibrationDevice* n64_device);
32 void SetVibration(std::span<NpadVibrationDevice*> device); 38 void SetVibration(NpadVibrationDevice* left_device, NpadVibrationDevice* right_device);
33 void SetGcVibration(NpadGcVibrationDevice* gc_device); 39 void SetGcVibration(NpadGcVibrationDevice* gc_device);
34 40
35 Result IncrementRefCounter(); 41 Result IncrementRefCounter();
@@ -41,9 +47,11 @@ private:
41 AppletResourceHolder* applet_resource_holder{nullptr}; 47 AppletResourceHolder* applet_resource_holder{nullptr};
42 NpadAbstractedPadHolder* abstract_pad_holder{nullptr}; 48 NpadAbstractedPadHolder* abstract_pad_holder{nullptr};
43 NpadAbstractPropertiesHandler* properties_handler{nullptr}; 49 NpadAbstractPropertiesHandler* properties_handler{nullptr};
50 Core::HID::HIDCore* hid_core{nullptr};
44 51
45 NpadN64VibrationDevice* n64_vibration_device{nullptr}; 52 NpadN64VibrationDevice* n64_vibration_device{nullptr};
46 std::array<NpadVibrationDevice*, 2> vibration_device{}; 53 NpadVibrationDevice* left_vibration_device{};
54 NpadVibrationDevice* right_vibration_device{};
47 NpadGcVibrationDevice* gc_vibration_device{nullptr}; 55 NpadGcVibrationDevice* gc_vibration_device{nullptr};
48 NpadVibration* vibration_handler{nullptr}; 56 NpadVibration* vibration_handler{nullptr};
49 s32 ref_counter{}; 57 s32 ref_counter{};
diff --git a/src/hid_core/resources/applet_resource.cpp b/src/hid_core/resources/applet_resource.cpp
index a84826050..db4134037 100644
--- a/src/hid_core/resources/applet_resource.cpp
+++ b/src/hid_core/resources/applet_resource.cpp
@@ -200,6 +200,25 @@ void AppletResource::EnableInput(u64 aruid, bool is_enabled) {
200 data[index].flag.enable_touchscreen.Assign(is_enabled); 200 data[index].flag.enable_touchscreen.Assign(is_enabled);
201} 201}
202 202
203bool AppletResource::SetAruidValidForVibration(u64 aruid, bool is_enabled) {
204 const u64 index = GetIndexFromAruid(aruid);
205 if (index >= AruidIndexMax) {
206 return false;
207 }
208
209 if (!is_enabled && aruid == active_vibration_aruid) {
210 active_vibration_aruid = SystemAruid;
211 return true;
212 }
213
214 if (is_enabled && aruid != active_vibration_aruid) {
215 active_vibration_aruid = aruid;
216 return true;
217 }
218
219 return false;
220}
221
203void AppletResource::EnableSixAxisSensor(u64 aruid, bool is_enabled) { 222void AppletResource::EnableSixAxisSensor(u64 aruid, bool is_enabled) {
204 const u64 index = GetIndexFromAruid(aruid); 223 const u64 index = GetIndexFromAruid(aruid);
205 if (index >= AruidIndexMax) { 224 if (index >= AruidIndexMax) {
diff --git a/src/hid_core/resources/applet_resource.h b/src/hid_core/resources/applet_resource.h
index f3f32bac1..e9710d306 100644
--- a/src/hid_core/resources/applet_resource.h
+++ b/src/hid_core/resources/applet_resource.h
@@ -101,6 +101,7 @@ public:
101 Result DestroySevenSixAxisTransferMemory(); 101 Result DestroySevenSixAxisTransferMemory();
102 102
103 void EnableInput(u64 aruid, bool is_enabled); 103 void EnableInput(u64 aruid, bool is_enabled);
104 bool SetAruidValidForVibration(u64 aruid, bool is_enabled);
104 void EnableSixAxisSensor(u64 aruid, bool is_enabled); 105 void EnableSixAxisSensor(u64 aruid, bool is_enabled);
105 void EnablePadInput(u64 aruid, bool is_enabled); 106 void EnablePadInput(u64 aruid, bool is_enabled);
106 void EnableTouchScreen(u64 aruid, bool is_enabled); 107 void EnableTouchScreen(u64 aruid, bool is_enabled);
diff --git a/src/hid_core/resources/hid_firmware_settings.cpp b/src/hid_core/resources/hid_firmware_settings.cpp
index 9fa0db17e..00ceff7e6 100644
--- a/src/hid_core/resources/hid_firmware_settings.cpp
+++ b/src/hid_core/resources/hid_firmware_settings.cpp
@@ -1,11 +1,14 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "core/hle/service/set/system_settings_server.h"
5#include "core/hle/service/sm/sm.h"
4#include "hid_core/resources/hid_firmware_settings.h" 6#include "hid_core/resources/hid_firmware_settings.h"
5 7
6namespace Service::HID { 8namespace Service::HID {
7 9
8HidFirmwareSettings::HidFirmwareSettings() { 10HidFirmwareSettings::HidFirmwareSettings(Core::System& system) {
11 m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys");
9 LoadSettings(true); 12 LoadSettings(true);
10} 13}
11 14
@@ -18,21 +21,25 @@ void HidFirmwareSettings::LoadSettings(bool reload_config) {
18 return; 21 return;
19 } 22 }
20 23
21 // TODO: Use nn::settings::fwdbg::GetSettingsItemValue to load config values 24 m_set_sys->GetSettingsItemValue<bool>(is_debug_pad_enabled, "hid_debug", "enables_debugpad");
22 25 m_set_sys->GetSettingsItemValue<bool>(is_device_managed, "hid_debug", "manages_devices");
23 is_debug_pad_enabled = true; 26 m_set_sys->GetSettingsItemValue<bool>(is_touch_i2c_managed, "hid_debug",
24 is_device_managed = true; 27 "manages_touch_ic_i2c");
25 is_touch_i2c_managed = is_device_managed; 28 m_set_sys->GetSettingsItemValue<bool>(is_future_devices_emulated, "hid_debug",
26 is_future_devices_emulated = false; 29 "emulate_future_device");
27 is_mcu_hardware_error_emulated = false; 30 m_set_sys->GetSettingsItemValue<bool>(is_mcu_hardware_error_emulated, "hid_debug",
28 is_rail_enabled = true; 31 "emulate_mcu_hardware_error");
29 is_firmware_update_failure_emulated = false; 32 m_set_sys->GetSettingsItemValue<bool>(is_rail_enabled, "hid_debug", "enables_rail");
33 m_set_sys->GetSettingsItemValue<bool>(is_firmware_update_failure_emulated, "hid_debug",
34 "emulate_firmware_update_failure");
30 is_firmware_update_failure = {}; 35 is_firmware_update_failure = {};
31 is_ble_disabled = false; 36 m_set_sys->GetSettingsItemValue<bool>(is_ble_disabled, "hid_debug", "ble_disabled");
32 is_dscale_disabled = false; 37 m_set_sys->GetSettingsItemValue<bool>(is_dscale_disabled, "hid_debug", "dscale_disabled");
33 is_handheld_forced = true; 38 m_set_sys->GetSettingsItemValue<bool>(is_handheld_forced, "hid_debug", "force_handheld");
34 features_per_id_disabled = {}; 39 features_per_id_disabled = {};
35 is_touch_firmware_auto_update_disabled = false; 40 m_set_sys->GetSettingsItemValue<bool>(is_touch_firmware_auto_update_disabled, "hid_debug",
41 "touch_firmware_auto_update_disabled");
42
36 is_initialized = true; 43 is_initialized = true;
37} 44}
38 45
diff --git a/src/hid_core/resources/hid_firmware_settings.h b/src/hid_core/resources/hid_firmware_settings.h
index 00201fd94..3694fa9a3 100644
--- a/src/hid_core/resources/hid_firmware_settings.h
+++ b/src/hid_core/resources/hid_firmware_settings.h
@@ -5,6 +5,14 @@
5 5
6#include "common/common_types.h" 6#include "common/common_types.h"
7 7
8namespace Core {
9class System;
10}
11
12namespace Service::Set {
13class ISystemSettingsServer;
14}
15
8namespace Service::HID { 16namespace Service::HID {
9 17
10/// Loads firmware config from nn::settings::fwdbg 18/// Loads firmware config from nn::settings::fwdbg
@@ -13,7 +21,7 @@ public:
13 using FirmwareSetting = std::array<u8, 4>; 21 using FirmwareSetting = std::array<u8, 4>;
14 using FeaturesPerId = std::array<bool, 0xA8>; 22 using FeaturesPerId = std::array<bool, 0xA8>;
15 23
16 HidFirmwareSettings(); 24 HidFirmwareSettings(Core::System& system);
17 25
18 void Reload(); 26 void Reload();
19 void LoadSettings(bool reload_config); 27 void LoadSettings(bool reload_config);
@@ -49,6 +57,8 @@ private:
49 bool is_touch_firmware_auto_update_disabled{}; 57 bool is_touch_firmware_auto_update_disabled{};
50 FirmwareSetting is_firmware_update_failure{}; 58 FirmwareSetting is_firmware_update_failure{};
51 FeaturesPerId features_per_id_disabled{}; 59 FeaturesPerId features_per_id_disabled{};
60
61 std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
52}; 62};
53 63
54} // namespace Service::HID 64} // namespace Service::HID
diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp
index 97537a2e2..d13a489c9 100644
--- a/src/hid_core/resources/npad/npad.cpp
+++ b/src/hid_core/resources/npad/npad.cpp
@@ -21,6 +21,7 @@
21#include "hid_core/hid_util.h" 21#include "hid_core/hid_util.h"
22#include "hid_core/resources/applet_resource.h" 22#include "hid_core/resources/applet_resource.h"
23#include "hid_core/resources/npad/npad.h" 23#include "hid_core/resources/npad/npad.h"
24#include "hid_core/resources/npad/npad_vibration.h"
24#include "hid_core/resources/shared_memory_format.h" 25#include "hid_core/resources/shared_memory_format.h"
25 26
26namespace Service::HID { 27namespace Service::HID {
@@ -31,10 +32,6 @@ NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service
31 for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { 32 for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) {
32 auto& controller = controller_data[aruid_index][i]; 33 auto& controller = controller_data[aruid_index][i];
33 controller.device = hid_core.GetEmulatedControllerByIndex(i); 34 controller.device = hid_core.GetEmulatedControllerByIndex(i);
34 controller.vibration[Core::HID::EmulatedDeviceIndex::LeftIndex].latest_vibration_value =
35 Core::HID::DEFAULT_VIBRATION_VALUE;
36 controller.vibration[Core::HID::EmulatedDeviceIndex::RightIndex]
37 .latest_vibration_value = Core::HID::DEFAULT_VIBRATION_VALUE;
38 Core::HID::ControllerUpdateCallback engine_callback{ 35 Core::HID::ControllerUpdateCallback engine_callback{
39 .on_change = 36 .on_change =
40 [this, i](Core::HID::ControllerTriggerType type) { ControllerUpdate(type, i); }, 37 [this, i](Core::HID::ControllerTriggerType type) { ControllerUpdate(type, i); },
@@ -43,6 +40,10 @@ NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service
43 controller.callback_key = controller.device->SetCallback(engine_callback); 40 controller.callback_key = controller.device->SetCallback(engine_callback);
44 } 41 }
45 } 42 }
43 for (std::size_t i = 0; i < abstracted_pads.size(); ++i) {
44 abstracted_pads[i] = AbstractPad{};
45 abstracted_pads[i].SetNpadId(IndexToNpadIdType(i));
46 }
46} 47}
47 48
48NPad::~NPad() { 49NPad::~NPad() {
@@ -359,6 +360,7 @@ void NPad::InitNewlyAddedController(u64 aruid, Core::HID::NpadIdType npad_id) {
359 npad_resource.SignalStyleSetUpdateEvent(aruid, npad_id); 360 npad_resource.SignalStyleSetUpdateEvent(aruid, npad_id);
360 WriteEmptyEntry(controller.shared_memory); 361 WriteEmptyEntry(controller.shared_memory);
361 hid_core.SetLastActiveController(npad_id); 362 hid_core.SetLastActiveController(npad_id);
363 abstracted_pads[NpadIdTypeToIndex(npad_id)].Update();
362} 364}
363 365
364void NPad::WriteEmptyEntry(NpadInternalState* npad) { 366void NPad::WriteEmptyEntry(NpadInternalState* npad) {
@@ -478,6 +480,10 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) {
478 continue; 480 continue;
479 } 481 }
480 482
483 if (!data->flag.enable_pad_input) {
484 continue;
485 }
486
481 RequestPadStateUpdate(aruid, controller.device->GetNpadIdType()); 487 RequestPadStateUpdate(aruid, controller.device->GetNpadIdType());
482 auto& pad_state = controller.npad_pad_state; 488 auto& pad_state = controller.npad_pad_state;
483 auto& libnx_state = controller.npad_libnx_state; 489 auto& libnx_state = controller.npad_libnx_state;
@@ -740,171 +746,6 @@ bool NPad::SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID:
740 return true; 746 return true;
741} 747}
742 748
743bool NPad::VibrateControllerAtIndex(u64 aruid, Core::HID::NpadIdType npad_id,
744 std::size_t device_index,
745 const Core::HID::VibrationValue& vibration_value) {
746 auto& controller = GetControllerFromNpadIdType(aruid, npad_id);
747 if (!controller.device->IsConnected()) {
748 return false;
749 }
750
751 if (!controller.device->IsVibrationEnabled(device_index)) {
752 if (controller.vibration[device_index].latest_vibration_value.low_amplitude != 0.0f ||
753 controller.vibration[device_index].latest_vibration_value.high_amplitude != 0.0f) {
754 // Send an empty vibration to stop any vibrations.
755 Core::HID::VibrationValue vibration{0.0f, 160.0f, 0.0f, 320.0f};
756 controller.device->SetVibration(device_index, vibration);
757 // Then reset the vibration value to its default value.
758 controller.vibration[device_index].latest_vibration_value =
759 Core::HID::DEFAULT_VIBRATION_VALUE;
760 }
761
762 return false;
763 }
764
765 if (!Settings::values.enable_accurate_vibrations.GetValue()) {
766 using std::chrono::duration_cast;
767 using std::chrono::milliseconds;
768 using std::chrono::steady_clock;
769
770 const auto now = steady_clock::now();
771
772 // Filter out non-zero vibrations that are within 15ms of each other.
773 if ((vibration_value.low_amplitude != 0.0f || vibration_value.high_amplitude != 0.0f) &&
774 duration_cast<milliseconds>(
775 now - controller.vibration[device_index].last_vibration_timepoint) <
776 milliseconds(15)) {
777 return false;
778 }
779
780 controller.vibration[device_index].last_vibration_timepoint = now;
781 }
782
783 Core::HID::VibrationValue vibration{
784 vibration_value.low_amplitude, vibration_value.low_frequency,
785 vibration_value.high_amplitude, vibration_value.high_frequency};
786 return controller.device->SetVibration(device_index, vibration);
787}
788
789void NPad::VibrateController(u64 aruid,
790 const Core::HID::VibrationDeviceHandle& vibration_device_handle,
791 const Core::HID::VibrationValue& vibration_value) {
792 if (IsVibrationHandleValid(vibration_device_handle).IsError()) {
793 return;
794 }
795
796 if (!Settings::values.vibration_enabled.GetValue() && !permit_vibration_session_enabled) {
797 return;
798 }
799
800 auto& controller = GetControllerFromHandle(aruid, vibration_device_handle);
801 const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
802
803 if (!controller.vibration[device_index].device_mounted || !controller.device->IsConnected()) {
804 return;
805 }
806
807 if (vibration_device_handle.device_index == Core::HID::DeviceIndex::None) {
808 ASSERT_MSG(false, "DeviceIndex should never be None!");
809 return;
810 }
811
812 // Some games try to send mismatched parameters in the device handle, block these.
813 if ((controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconLeft &&
814 (vibration_device_handle.npad_type == Core::HID::NpadStyleIndex::JoyconRight ||
815 vibration_device_handle.device_index == Core::HID::DeviceIndex::Right)) ||
816 (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight &&
817 (vibration_device_handle.npad_type == Core::HID::NpadStyleIndex::JoyconLeft ||
818 vibration_device_handle.device_index == Core::HID::DeviceIndex::Left))) {
819 return;
820 }
821
822 // Filter out vibrations with equivalent values to reduce unnecessary state changes.
823 if (vibration_value.low_amplitude ==
824 controller.vibration[device_index].latest_vibration_value.low_amplitude &&
825 vibration_value.high_amplitude ==
826 controller.vibration[device_index].latest_vibration_value.high_amplitude) {
827 return;
828 }
829
830 if (VibrateControllerAtIndex(aruid, controller.device->GetNpadIdType(), device_index,
831 vibration_value)) {
832 controller.vibration[device_index].latest_vibration_value = vibration_value;
833 }
834}
835
836void NPad::VibrateControllers(
837 u64 aruid, std::span<const Core::HID::VibrationDeviceHandle> vibration_device_handles,
838 std::span<const Core::HID::VibrationValue> vibration_values) {
839 if (!Settings::values.vibration_enabled.GetValue() && !permit_vibration_session_enabled) {
840 return;
841 }
842
843 ASSERT_OR_EXECUTE_MSG(
844 vibration_device_handles.size() == vibration_values.size(), { return; },
845 "The amount of device handles does not match with the amount of vibration values,"
846 "this is undefined behavior!");
847
848 for (std::size_t i = 0; i < vibration_device_handles.size(); ++i) {
849 VibrateController(aruid, vibration_device_handles[i], vibration_values[i]);
850 }
851}
852
853Core::HID::VibrationValue NPad::GetLastVibration(
854 u64 aruid, const Core::HID::VibrationDeviceHandle& vibration_device_handle) const {
855 if (IsVibrationHandleValid(vibration_device_handle).IsError()) {
856 return {};
857 }
858
859 const auto& controller = GetControllerFromHandle(aruid, vibration_device_handle);
860 const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
861 return controller.vibration[device_index].latest_vibration_value;
862}
863
864void NPad::InitializeVibrationDevice(
865 const Core::HID::VibrationDeviceHandle& vibration_device_handle) {
866 if (IsVibrationHandleValid(vibration_device_handle).IsError()) {
867 return;
868 }
869
870 const auto aruid = applet_resource_holder.applet_resource->GetActiveAruid();
871 const auto npad_index = static_cast<Core::HID::NpadIdType>(vibration_device_handle.npad_id);
872 const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
873
874 if (aruid == 0) {
875 return;
876 }
877
878 InitializeVibrationDeviceAtIndex(aruid, npad_index, device_index);
879}
880
881void NPad::InitializeVibrationDeviceAtIndex(u64 aruid, Core::HID::NpadIdType npad_id,
882 std::size_t device_index) {
883 auto& controller = GetControllerFromNpadIdType(aruid, npad_id);
884 if (!Settings::values.vibration_enabled.GetValue()) {
885 controller.vibration[device_index].device_mounted = false;
886 return;
887 }
888
889 controller.vibration[device_index].device_mounted =
890 controller.device->IsVibrationEnabled(device_index);
891}
892
893void NPad::SetPermitVibrationSession(bool permit_vibration_session) {
894 permit_vibration_session_enabled = permit_vibration_session;
895}
896
897bool NPad::IsVibrationDeviceMounted(
898 u64 aruid, const Core::HID::VibrationDeviceHandle& vibration_device_handle) const {
899 if (IsVibrationHandleValid(vibration_device_handle).IsError()) {
900 return false;
901 }
902
903 const auto& controller = GetControllerFromHandle(aruid, vibration_device_handle);
904 const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
905 return controller.vibration[device_index].device_mounted;
906}
907
908Result NPad::AcquireNpadStyleSetUpdateEventHandle(u64 aruid, Kernel::KReadableEvent** out_event, 749Result NPad::AcquireNpadStyleSetUpdateEventHandle(u64 aruid, Kernel::KReadableEvent** out_event,
909 Core::HID::NpadIdType npad_id) { 750 Core::HID::NpadIdType npad_id) {
910 std::scoped_lock lock{mutex}; 751 std::scoped_lock lock{mutex};
@@ -936,11 +777,6 @@ Result NPad::DisconnectNpad(u64 aruid, Core::HID::NpadIdType npad_id) {
936 777
937 LOG_DEBUG(Service_HID, "Npad disconnected {}", npad_id); 778 LOG_DEBUG(Service_HID, "Npad disconnected {}", npad_id);
938 auto& controller = GetControllerFromNpadIdType(aruid, npad_id); 779 auto& controller = GetControllerFromNpadIdType(aruid, npad_id);
939 for (std::size_t device_idx = 0; device_idx < controller.vibration.size(); ++device_idx) {
940 // Send an empty vibration to stop any vibrations.
941 VibrateControllerAtIndex(aruid, npad_id, device_idx, {});
942 controller.vibration[device_idx].device_mounted = false;
943 }
944 780
945 auto* shared_memory = controller.shared_memory; 781 auto* shared_memory = controller.shared_memory;
946 // Don't reset shared_memory->assignment_mode this value is persistent 782 // Don't reset shared_memory->assignment_mode this value is persistent
@@ -1232,26 +1068,28 @@ Result NPad::RegisterAppletResourceUserId(u64 aruid) {
1232} 1068}
1233 1069
1234void NPad::UnregisterAppletResourceUserId(u64 aruid) { 1070void NPad::UnregisterAppletResourceUserId(u64 aruid) {
1071 // TODO: Remove this once abstract pad is emulated properly
1072 const auto aruid_index = npad_resource.GetIndexFromAruid(aruid);
1073 for (auto& controller : controller_data[aruid_index]) {
1074 controller.is_connected = false;
1075 controller.shared_memory = nullptr;
1076 }
1077
1235 npad_resource.UnregisterAppletResourceUserId(aruid); 1078 npad_resource.UnregisterAppletResourceUserId(aruid);
1236} 1079}
1237 1080
1238void NPad::SetNpadExternals(std::shared_ptr<AppletResource> resource, 1081void NPad::SetNpadExternals(std::shared_ptr<AppletResource> resource,
1239 std::recursive_mutex* shared_mutex) { 1082 std::recursive_mutex* shared_mutex,
1083 std::shared_ptr<HandheldConfig> handheld_config) {
1240 applet_resource_holder.applet_resource = resource; 1084 applet_resource_holder.applet_resource = resource;
1241 applet_resource_holder.shared_mutex = shared_mutex; 1085 applet_resource_holder.shared_mutex = shared_mutex;
1242 applet_resource_holder.shared_npad_resource = &npad_resource; 1086 applet_resource_holder.shared_npad_resource = &npad_resource;
1243} 1087 applet_resource_holder.handheld_config = handheld_config;
1244
1245NPad::NpadControllerData& NPad::GetControllerFromHandle(
1246 u64 aruid, const Core::HID::VibrationDeviceHandle& device_handle) {
1247 const auto npad_id = static_cast<Core::HID::NpadIdType>(device_handle.npad_id);
1248 return GetControllerFromNpadIdType(aruid, npad_id);
1249}
1250 1088
1251const NPad::NpadControllerData& NPad::GetControllerFromHandle( 1089 for (auto& abstract_pad : abstracted_pads) {
1252 u64 aruid, const Core::HID::VibrationDeviceHandle& device_handle) const { 1090 abstract_pad.SetExternals(&applet_resource_holder, nullptr, nullptr, nullptr, nullptr,
1253 const auto npad_id = static_cast<Core::HID::NpadIdType>(device_handle.npad_id); 1091 &vibration_handler, &hid_core);
1254 return GetControllerFromNpadIdType(aruid, npad_id); 1092 }
1255} 1093}
1256 1094
1257NPad::NpadControllerData& NPad::GetControllerFromHandle( 1095NPad::NpadControllerData& NPad::GetControllerFromHandle(
@@ -1389,4 +1227,106 @@ Result NPad::GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const {
1389 return ResultSuccess; 1227 return ResultSuccess;
1390} 1228}
1391 1229
1230NpadVibration* NPad::GetVibrationHandler() {
1231 return &vibration_handler;
1232}
1233
1234std::vector<NpadVibrationBase*> NPad::GetAllVibrationDevices() {
1235 std::vector<NpadVibrationBase*> vibration_devices;
1236
1237 for (auto& abstract_pad : abstracted_pads) {
1238 auto* left_device = abstract_pad.GetVibrationDevice(Core::HID::DeviceIndex::Left);
1239 auto* right_device = abstract_pad.GetVibrationDevice(Core::HID::DeviceIndex::Right);
1240 auto* n64_device = abstract_pad.GetGCVibrationDevice();
1241 auto* gc_device = abstract_pad.GetGCVibrationDevice();
1242
1243 if (left_device != nullptr) {
1244 vibration_devices.emplace_back(left_device);
1245 }
1246 if (right_device != nullptr) {
1247 vibration_devices.emplace_back(right_device);
1248 }
1249 if (n64_device != nullptr) {
1250 vibration_devices.emplace_back(n64_device);
1251 }
1252 if (gc_device != nullptr) {
1253 vibration_devices.emplace_back(gc_device);
1254 }
1255 }
1256
1257 return vibration_devices;
1258}
1259
1260NpadVibrationBase* NPad::GetVibrationDevice(const Core::HID::VibrationDeviceHandle& handle) {
1261 if (IsVibrationHandleValid(handle).IsError()) {
1262 return nullptr;
1263 }
1264
1265 const auto npad_index = NpadIdTypeToIndex(static_cast<Core::HID::NpadIdType>(handle.npad_id));
1266 const auto style_inde = static_cast<Core::HID::NpadStyleIndex>(handle.npad_type);
1267 if (style_inde == Core::HID::NpadStyleIndex::GameCube) {
1268 return abstracted_pads[npad_index].GetGCVibrationDevice();
1269 }
1270 if (style_inde == Core::HID::NpadStyleIndex::N64) {
1271 return abstracted_pads[npad_index].GetN64VibrationDevice();
1272 }
1273 return abstracted_pads[npad_index].GetVibrationDevice(handle.device_index);
1274}
1275
1276NpadN64VibrationDevice* NPad::GetN64VibrationDevice(
1277 const Core::HID::VibrationDeviceHandle& handle) {
1278 if (IsVibrationHandleValid(handle).IsError()) {
1279 return nullptr;
1280 }
1281
1282 const auto npad_index = NpadIdTypeToIndex(static_cast<Core::HID::NpadIdType>(handle.npad_id));
1283 const auto style_inde = static_cast<Core::HID::NpadStyleIndex>(handle.npad_type);
1284 if (style_inde != Core::HID::NpadStyleIndex::N64) {
1285 return nullptr;
1286 }
1287 return abstracted_pads[npad_index].GetN64VibrationDevice();
1288}
1289
1290NpadVibrationDevice* NPad::GetNSVibrationDevice(const Core::HID::VibrationDeviceHandle& handle) {
1291 if (IsVibrationHandleValid(handle).IsError()) {
1292 return nullptr;
1293 }
1294
1295 const auto npad_index = NpadIdTypeToIndex(static_cast<Core::HID::NpadIdType>(handle.npad_id));
1296 const auto style_inde = static_cast<Core::HID::NpadStyleIndex>(handle.npad_type);
1297 if (style_inde == Core::HID::NpadStyleIndex::GameCube ||
1298 style_inde == Core::HID::NpadStyleIndex::N64) {
1299 return nullptr;
1300 }
1301
1302 return abstracted_pads[npad_index].GetVibrationDevice(handle.device_index);
1303}
1304
1305NpadGcVibrationDevice* NPad::GetGcVibrationDevice(const Core::HID::VibrationDeviceHandle& handle) {
1306 if (IsVibrationHandleValid(handle).IsError()) {
1307 return nullptr;
1308 }
1309
1310 const auto npad_index = NpadIdTypeToIndex(static_cast<Core::HID::NpadIdType>(handle.npad_id));
1311 const auto style_inde = static_cast<Core::HID::NpadStyleIndex>(handle.npad_type);
1312 if (style_inde != Core::HID::NpadStyleIndex::GameCube) {
1313 return nullptr;
1314 }
1315 return abstracted_pads[npad_index].GetGCVibrationDevice();
1316}
1317
1318void NPad::UpdateHandheldAbstractState() {
1319 std::scoped_lock lock{mutex};
1320 abstracted_pads[NpadIdTypeToIndex(Core::HID::NpadIdType::Handheld)].Update();
1321}
1322
1323void NPad::EnableAppletToGetInput(u64 aruid) {
1324 std::scoped_lock lock{mutex};
1325 std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex};
1326
1327 for (auto& abstract_pad : abstracted_pads) {
1328 abstract_pad.EnableAppletToGetInput(aruid);
1329 }
1330}
1331
1392} // namespace Service::HID 1332} // namespace Service::HID
diff --git a/src/hid_core/resources/npad/npad.h b/src/hid_core/resources/npad/npad.h
index 01f3dabb1..88289fa2b 100644
--- a/src/hid_core/resources/npad/npad.h
+++ b/src/hid_core/resources/npad/npad.h
@@ -10,9 +10,15 @@
10 10
11#include "common/common_types.h" 11#include "common/common_types.h"
12#include "hid_core/hid_types.h" 12#include "hid_core/hid_types.h"
13#include "hid_core/resources/abstracted_pad/abstract_pad.h"
13#include "hid_core/resources/controller_base.h" 14#include "hid_core/resources/controller_base.h"
14#include "hid_core/resources/npad/npad_resource.h" 15#include "hid_core/resources/npad/npad_resource.h"
15#include "hid_core/resources/npad/npad_types.h" 16#include "hid_core/resources/npad/npad_types.h"
17#include "hid_core/resources/npad/npad_vibration.h"
18#include "hid_core/resources/vibration/gc_vibration_device.h"
19#include "hid_core/resources/vibration/n64_vibration_device.h"
20#include "hid_core/resources/vibration/vibration_base.h"
21#include "hid_core/resources/vibration/vibration_device.h"
16 22
17namespace Core::HID { 23namespace Core::HID {
18class EmulatedController; 24class EmulatedController;
@@ -32,6 +38,7 @@ union Result;
32 38
33namespace Service::HID { 39namespace Service::HID {
34class AppletResource; 40class AppletResource;
41struct HandheldConfig;
35struct NpadInternalState; 42struct NpadInternalState;
36struct NpadSixAxisSensorLifo; 43struct NpadSixAxisSensorLifo;
37struct NpadSharedMemoryFormat; 44struct NpadSharedMemoryFormat;
@@ -68,31 +75,6 @@ public:
68 bool SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID::NpadIdType npad_id, 75 bool SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID::NpadIdType npad_id,
69 NpadJoyDeviceType npad_device_type, NpadJoyAssignmentMode assignment_mode); 76 NpadJoyDeviceType npad_device_type, NpadJoyAssignmentMode assignment_mode);
70 77
71 bool VibrateControllerAtIndex(u64 aruid, Core::HID::NpadIdType npad_id,
72 std::size_t device_index,
73 const Core::HID::VibrationValue& vibration_value);
74
75 void VibrateController(u64 aruid,
76 const Core::HID::VibrationDeviceHandle& vibration_device_handle,
77 const Core::HID::VibrationValue& vibration_value);
78
79 void VibrateControllers(
80 u64 aruid, std::span<const Core::HID::VibrationDeviceHandle> vibration_device_handles,
81 std::span<const Core::HID::VibrationValue> vibration_values);
82
83 Core::HID::VibrationValue GetLastVibration(
84 u64 aruid, const Core::HID::VibrationDeviceHandle& vibration_device_handle) const;
85
86 void InitializeVibrationDevice(const Core::HID::VibrationDeviceHandle& vibration_device_handle);
87
88 void InitializeVibrationDeviceAtIndex(u64 aruid, Core::HID::NpadIdType npad_id,
89 std::size_t device_index);
90
91 void SetPermitVibrationSession(bool permit_vibration_session);
92
93 bool IsVibrationDeviceMounted(
94 u64 aruid, const Core::HID::VibrationDeviceHandle& vibration_device_handle) const;
95
96 Result AcquireNpadStyleSetUpdateEventHandle(u64 aruid, Kernel::KReadableEvent** out_event, 78 Result AcquireNpadStyleSetUpdateEventHandle(u64 aruid, Kernel::KReadableEvent** out_event,
97 Core::HID::NpadIdType npad_id); 79 Core::HID::NpadIdType npad_id);
98 80
@@ -145,7 +127,8 @@ public:
145 Result RegisterAppletResourceUserId(u64 aruid); 127 Result RegisterAppletResourceUserId(u64 aruid);
146 void UnregisterAppletResourceUserId(u64 aruid); 128 void UnregisterAppletResourceUserId(u64 aruid);
147 void SetNpadExternals(std::shared_ptr<AppletResource> resource, 129 void SetNpadExternals(std::shared_ptr<AppletResource> resource,
148 std::recursive_mutex* shared_mutex); 130 std::recursive_mutex* shared_mutex,
131 std::shared_ptr<HandheldConfig> handheld_config);
149 132
150 AppletDetailedUiType GetAppletDetailedUiType(Core::HID::NpadIdType npad_id); 133 AppletDetailedUiType GetAppletDetailedUiType(Core::HID::NpadIdType npad_id);
151 134
@@ -161,18 +144,22 @@ public:
161 144
162 Result GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const; 145 Result GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const;
163 146
164private: 147 NpadVibration* GetVibrationHandler();
165 struct VibrationData { 148 std::vector<NpadVibrationBase*> GetAllVibrationDevices();
166 bool device_mounted{}; 149 NpadVibrationBase* GetVibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
167 Core::HID::VibrationValue latest_vibration_value{}; 150 NpadN64VibrationDevice* GetN64VibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
168 std::chrono::steady_clock::time_point last_vibration_timepoint{}; 151 NpadVibrationDevice* GetNSVibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
169 }; 152 NpadGcVibrationDevice* GetGcVibrationDevice(const Core::HID::VibrationDeviceHandle& handle);
153
154 void UpdateHandheldAbstractState();
155
156 void EnableAppletToGetInput(u64 aruid);
170 157
158private:
171 struct NpadControllerData { 159 struct NpadControllerData {
172 NpadInternalState* shared_memory = nullptr; 160 NpadInternalState* shared_memory = nullptr;
173 Core::HID::EmulatedController* device = nullptr; 161 Core::HID::EmulatedController* device = nullptr;
174 162
175 std::array<VibrationData, 2> vibration{};
176 bool is_connected{}; 163 bool is_connected{};
177 164
178 // Dual joycons can have only one side connected 165 // Dual joycons can have only one side connected
@@ -192,10 +179,6 @@ private:
192 void WriteEmptyEntry(NpadInternalState* npad); 179 void WriteEmptyEntry(NpadInternalState* npad);
193 180
194 NpadControllerData& GetControllerFromHandle( 181 NpadControllerData& GetControllerFromHandle(
195 u64 aruid, const Core::HID::VibrationDeviceHandle& device_handle);
196 const NpadControllerData& GetControllerFromHandle(
197 u64 aruid, const Core::HID::VibrationDeviceHandle& device_handle) const;
198 NpadControllerData& GetControllerFromHandle(
199 u64 aruid, const Core::HID::SixAxisSensorHandle& device_handle); 182 u64 aruid, const Core::HID::SixAxisSensorHandle& device_handle);
200 const NpadControllerData& GetControllerFromHandle( 183 const NpadControllerData& GetControllerFromHandle(
201 u64 aruid, const Core::HID::SixAxisSensorHandle& device_handle) const; 184 u64 aruid, const Core::HID::SixAxisSensorHandle& device_handle) const;
@@ -215,11 +198,13 @@ private:
215 mutable std::mutex mutex; 198 mutable std::mutex mutex;
216 NPadResource npad_resource; 199 NPadResource npad_resource;
217 AppletResourceHolder applet_resource_holder{}; 200 AppletResourceHolder applet_resource_holder{};
201 std::array<AbstractPad, MaxSupportedNpadIdTypes> abstracted_pads;
202 NpadVibration vibration_handler{};
203
218 Kernel::KEvent* input_event{nullptr}; 204 Kernel::KEvent* input_event{nullptr};
219 std::mutex* input_mutex{nullptr}; 205 std::mutex* input_mutex{nullptr};
220 206
221 std::atomic<u64> press_state{}; 207 std::atomic<u64> press_state{};
222 bool permit_vibration_session_enabled;
223 std::array<std::array<NpadControllerData, MaxSupportedNpadIdTypes>, AruidIndexMax> 208 std::array<std::array<NpadControllerData, MaxSupportedNpadIdTypes>, AruidIndexMax>
224 controller_data{}; 209 controller_data{};
225}; 210};
diff --git a/src/hid_core/resources/npad/npad_types.h b/src/hid_core/resources/npad/npad_types.h
index fd86c8e40..92700d69a 100644
--- a/src/hid_core/resources/npad/npad_types.h
+++ b/src/hid_core/resources/npad/npad_types.h
@@ -8,6 +8,10 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "hid_core/hid_types.h" 9#include "hid_core/hid_types.h"
10 10
11namespace Core::HID {
12class EmulatedController;
13}
14
11namespace Service::HID { 15namespace Service::HID {
12static constexpr std::size_t MaxSupportedNpadIdTypes = 10; 16static constexpr std::size_t MaxSupportedNpadIdTypes = 10;
13static constexpr std::size_t StyleIndexCount = 7; 17static constexpr std::size_t StyleIndexCount = 7;
@@ -348,7 +352,7 @@ struct IAbstractedPad {
348 u8 indicator; 352 u8 indicator;
349 std::vector<f32> virtual_six_axis_sensor_acceleration; 353 std::vector<f32> virtual_six_axis_sensor_acceleration;
350 std::vector<f32> virtual_six_axis_sensor_angle; 354 std::vector<f32> virtual_six_axis_sensor_angle;
351 u64 xcd_handle; 355 Core::HID::EmulatedController* xcd_handle;
352 u64 color; 356 u64 color;
353}; 357};
354} // namespace Service::HID 358} // namespace Service::HID
diff --git a/src/hid_core/resources/npad/npad_vibration.cpp b/src/hid_core/resources/npad/npad_vibration.cpp
index 7056e8eab..05aad4c54 100644
--- a/src/hid_core/resources/npad/npad_vibration.cpp
+++ b/src/hid_core/resources/npad/npad_vibration.cpp
@@ -77,4 +77,8 @@ Result NpadVibration::EndPermitVibrationSession() {
77 return ResultSuccess; 77 return ResultSuccess;
78} 78}
79 79
80u64 NpadVibration::GetSessionAruid() const {
81 return session_aruid;
82}
83
80} // namespace Service::HID 84} // namespace Service::HID
diff --git a/src/hid_core/resources/npad/npad_vibration.h b/src/hid_core/resources/npad/npad_vibration.h
index 0748aeffc..d5a95f2a0 100644
--- a/src/hid_core/resources/npad/npad_vibration.h
+++ b/src/hid_core/resources/npad/npad_vibration.h
@@ -25,6 +25,8 @@ public:
25 Result BeginPermitVibrationSession(u64 aruid); 25 Result BeginPermitVibrationSession(u64 aruid);
26 Result EndPermitVibrationSession(); 26 Result EndPermitVibrationSession();
27 27
28 u64 GetSessionAruid() const;
29
28private: 30private:
29 f32 volume{}; 31 f32 volume{};
30 u64 session_aruid{}; 32 u64 session_aruid{};
diff --git a/src/hid_core/resources/vibration/gc_vibration_device.cpp b/src/hid_core/resources/vibration/gc_vibration_device.cpp
index f01f81b9a..ad42b9d66 100644
--- a/src/hid_core/resources/vibration/gc_vibration_device.cpp
+++ b/src/hid_core/resources/vibration/gc_vibration_device.cpp
@@ -1,6 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "hid_core/frontend/emulated_controller.h"
4#include "hid_core/hid_result.h" 5#include "hid_core/hid_result.h"
5#include "hid_core/resources/npad/npad_types.h" 6#include "hid_core/resources/npad/npad_types.h"
6#include "hid_core/resources/npad/npad_vibration.h" 7#include "hid_core/resources/npad/npad_vibration.h"
@@ -10,24 +11,25 @@ namespace Service::HID {
10 11
11NpadGcVibrationDevice::NpadGcVibrationDevice() {} 12NpadGcVibrationDevice::NpadGcVibrationDevice() {}
12 13
13Result NpadGcVibrationDevice::IncrementRefCounter() { 14Result NpadGcVibrationDevice::Activate() {
14 if (ref_counter == 0 && is_mounted) { 15 if (ref_counter == 0 && is_mounted) {
15 f32 volume = 1.0f; 16 f32 volume = 1.0f;
16 const auto result = vibration_handler->GetVibrationVolume(volume); 17 const auto result = vibration_handler->GetVibrationVolume(volume);
17 if (result.IsSuccess()) { 18 if (result.IsSuccess()) {
18 // TODO: SendVibrationGcErmCommand 19 xcd_handle->SetVibration(adapter_slot, Core::HID::VibrationGcErmCommand::Stop);
19 } 20 }
20 } 21 }
22
21 ref_counter++; 23 ref_counter++;
22 return ResultSuccess; 24 return ResultSuccess;
23} 25}
24 26
25Result NpadGcVibrationDevice::DecrementRefCounter() { 27Result NpadGcVibrationDevice::Deactivate() {
26 if (ref_counter == 1 && !is_mounted) { 28 if (ref_counter == 1 && is_mounted) {
27 f32 volume = 1.0f; 29 f32 volume = 1.0f;
28 const auto result = vibration_handler->GetVibrationVolume(volume); 30 const auto result = vibration_handler->GetVibrationVolume(volume);
29 if (result.IsSuccess()) { 31 if (result.IsSuccess()) {
30 // TODO: SendVibrationGcErmCommand 32 xcd_handle->SetVibration(adapter_slot, Core::HID::VibrationGcErmCommand::Stop);
31 } 33 }
32 } 34 }
33 35
@@ -38,6 +40,48 @@ Result NpadGcVibrationDevice::DecrementRefCounter() {
38 return ResultSuccess; 40 return ResultSuccess;
39} 41}
40 42
43Result NpadGcVibrationDevice::Mount(IAbstractedPad& abstracted_pad, u32 slot,
44 NpadVibration* handler) {
45 if (!abstracted_pad.internal_flags.is_connected) {
46 return ResultSuccess;
47 }
48
49 // TODO: This device doesn't use a xcd handle instead has an GC adapter handle. This is just to
50 // keep compatibility with the front end.
51 xcd_handle = abstracted_pad.xcd_handle;
52 adapter_slot = slot;
53 vibration_handler = handler;
54 is_mounted = true;
55
56 if (ref_counter == 0) {
57 return ResultSuccess;
58 }
59
60 f32 volume{1.0f};
61 const auto result = vibration_handler->GetVibrationVolume(volume);
62 if (result.IsSuccess()) {
63 xcd_handle->SetVibration(adapter_slot, Core::HID::VibrationGcErmCommand::Stop);
64 }
65
66 return ResultSuccess;
67}
68
69Result NpadGcVibrationDevice::Unmount() {
70 if (ref_counter == 0 || !is_mounted) {
71 is_mounted = false;
72 return ResultSuccess;
73 }
74
75 f32 volume{1.0f};
76 const auto result = vibration_handler->GetVibrationVolume(volume);
77 if (result.IsSuccess()) {
78 xcd_handle->SetVibration(adapter_slot, Core::HID::VibrationGcErmCommand::Stop);
79 }
80
81 is_mounted = false;
82 return ResultSuccess;
83}
84
41Result NpadGcVibrationDevice::SendVibrationGcErmCommand(Core::HID::VibrationGcErmCommand command) { 85Result NpadGcVibrationDevice::SendVibrationGcErmCommand(Core::HID::VibrationGcErmCommand command) {
42 if (!is_mounted) { 86 if (!is_mounted) {
43 return ResultSuccess; 87 return ResultSuccess;
@@ -55,7 +99,7 @@ Result NpadGcVibrationDevice::SendVibrationGcErmCommand(Core::HID::VibrationGcEr
55 return ResultSuccess; 99 return ResultSuccess;
56 } 100 }
57 } 101 }
58 // TODO: SendVibrationGcErmCommand 102 xcd_handle->SetVibration(adapter_slot, command);
59 return ResultSuccess; 103 return ResultSuccess;
60} 104}
61 105
diff --git a/src/hid_core/resources/vibration/gc_vibration_device.h b/src/hid_core/resources/vibration/gc_vibration_device.h
index 87abca57d..c624cbb28 100644
--- a/src/hid_core/resources/vibration/gc_vibration_device.h
+++ b/src/hid_core/resources/vibration/gc_vibration_device.h
@@ -20,12 +20,18 @@ class NpadGcVibrationDevice final : public NpadVibrationBase {
20public: 20public:
21 explicit NpadGcVibrationDevice(); 21 explicit NpadGcVibrationDevice();
22 22
23 Result IncrementRefCounter() override; 23 Result Activate() override;
24 Result DecrementRefCounter() override; 24 Result Deactivate() override;
25
26 Result Mount(IAbstractedPad& abstracted_pad, u32 slot, NpadVibration* handler);
27 Result Unmount();
25 28
26 Result SendVibrationGcErmCommand(Core::HID::VibrationGcErmCommand command); 29 Result SendVibrationGcErmCommand(Core::HID::VibrationGcErmCommand command);
27 30
28 Result GetActualVibrationGcErmCommand(Core::HID::VibrationGcErmCommand& out_command); 31 Result GetActualVibrationGcErmCommand(Core::HID::VibrationGcErmCommand& out_command);
29 Result SendVibrationNotificationPattern(Core::HID::VibrationGcErmCommand command); 32 Result SendVibrationNotificationPattern(Core::HID::VibrationGcErmCommand command);
33
34private:
35 u32 adapter_slot;
30}; 36};
31} // namespace Service::HID 37} // namespace Service::HID
diff --git a/src/hid_core/resources/vibration/n64_vibration_device.cpp b/src/hid_core/resources/vibration/n64_vibration_device.cpp
index 639f87abf..94ad37c8f 100644
--- a/src/hid_core/resources/vibration/n64_vibration_device.cpp
+++ b/src/hid_core/resources/vibration/n64_vibration_device.cpp
@@ -1,6 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "hid_core/frontend/emulated_controller.h"
4#include "hid_core/hid_result.h" 5#include "hid_core/hid_result.h"
5#include "hid_core/resources/npad/npad_types.h" 6#include "hid_core/resources/npad/npad_types.h"
6#include "hid_core/resources/npad/npad_vibration.h" 7#include "hid_core/resources/npad/npad_vibration.h"
@@ -10,12 +11,12 @@ namespace Service::HID {
10 11
11NpadN64VibrationDevice::NpadN64VibrationDevice() {} 12NpadN64VibrationDevice::NpadN64VibrationDevice() {}
12 13
13Result NpadN64VibrationDevice::IncrementRefCounter() { 14Result NpadN64VibrationDevice::Activate() {
14 if (ref_counter == 0 && is_mounted) { 15 if (ref_counter == 0 && is_mounted) {
15 f32 volume = 1.0f; 16 f32 volume = 1.0f;
16 const auto result = vibration_handler->GetVibrationVolume(volume); 17 const auto result = vibration_handler->GetVibrationVolume(volume);
17 if (result.IsSuccess()) { 18 if (result.IsSuccess()) {
18 // TODO: SendVibrationInBool 19 xcd_handle->SetVibration(false);
19 } 20 }
20 } 21 }
21 22
@@ -23,19 +24,12 @@ Result NpadN64VibrationDevice::IncrementRefCounter() {
23 return ResultSuccess; 24 return ResultSuccess;
24} 25}
25 26
26Result NpadN64VibrationDevice::DecrementRefCounter() { 27Result NpadN64VibrationDevice::Deactivate() {
27 if (ref_counter == 1) { 28 if (ref_counter == 1 && is_mounted) {
28 if (!is_mounted) {
29 ref_counter = 0;
30 if (is_mounted != false) {
31 // TODO: SendVibrationInBool
32 }
33 return ResultSuccess;
34 }
35 f32 volume = 1.0f; 29 f32 volume = 1.0f;
36 const auto result = vibration_handler->GetVibrationVolume(volume); 30 const auto result = vibration_handler->GetVibrationVolume(volume);
37 if (result.IsSuccess()) { 31 if (result.IsSuccess()) {
38 // TODO 32 xcd_handle->SetVibration(false);
39 } 33 }
40 } 34 }
41 35
@@ -46,6 +40,43 @@ Result NpadN64VibrationDevice::DecrementRefCounter() {
46 return ResultSuccess; 40 return ResultSuccess;
47} 41}
48 42
43Result NpadN64VibrationDevice::Mount(IAbstractedPad& abstracted_pad, NpadVibration* handler) {
44 if (!abstracted_pad.internal_flags.is_connected) {
45 return ResultSuccess;
46 }
47 xcd_handle = abstracted_pad.xcd_handle;
48 vibration_handler = handler;
49 is_mounted = true;
50
51 if (ref_counter == 0) {
52 return ResultSuccess;
53 }
54
55 f32 volume{1.0f};
56 const auto result = vibration_handler->GetVibrationVolume(volume);
57 if (result.IsSuccess()) {
58 xcd_handle->SetVibration(false);
59 }
60
61 return ResultSuccess;
62}
63
64Result NpadN64VibrationDevice::Unmount() {
65 if (ref_counter == 0 || !is_mounted) {
66 is_mounted = false;
67 return ResultSuccess;
68 }
69
70 f32 volume{1.0f};
71 const auto result = vibration_handler->GetVibrationVolume(volume);
72 if (result.IsSuccess()) {
73 xcd_handle->SetVibration(false);
74 }
75
76 is_mounted = false;
77 return ResultSuccess;
78}
79
49Result NpadN64VibrationDevice::SendValueInBool(bool is_vibrating) { 80Result NpadN64VibrationDevice::SendValueInBool(bool is_vibrating) {
50 if (ref_counter < 1) { 81 if (ref_counter < 1) {
51 return ResultVibrationNotInitialized; 82 return ResultVibrationNotInitialized;
@@ -56,7 +87,7 @@ Result NpadN64VibrationDevice::SendValueInBool(bool is_vibrating) {
56 if (result.IsError()) { 87 if (result.IsError()) {
57 return result; 88 return result;
58 } 89 }
59 // TODO: SendVibrationInBool 90 xcd_handle->SetVibration(false);
60 } 91 }
61 return ResultSuccess; 92 return ResultSuccess;
62} 93}
diff --git a/src/hid_core/resources/vibration/n64_vibration_device.h b/src/hid_core/resources/vibration/n64_vibration_device.h
index 54e6efc1a..09de7701c 100644
--- a/src/hid_core/resources/vibration/n64_vibration_device.h
+++ b/src/hid_core/resources/vibration/n64_vibration_device.h
@@ -14,14 +14,18 @@
14 14
15namespace Service::HID { 15namespace Service::HID {
16class NpadVibration; 16class NpadVibration;
17struct IAbstractedPad;
17 18
18/// Handles Npad request from HID interfaces 19/// Handles Npad request from HID interfaces
19class NpadN64VibrationDevice final : public NpadVibrationBase { 20class NpadN64VibrationDevice final : public NpadVibrationBase {
20public: 21public:
21 explicit NpadN64VibrationDevice(); 22 explicit NpadN64VibrationDevice();
22 23
23 Result IncrementRefCounter() override; 24 Result Activate() override;
24 Result DecrementRefCounter() override; 25 Result Deactivate() override;
26
27 Result Mount(IAbstractedPad& abstracted_pad, NpadVibration* handler);
28 Result Unmount();
25 29
26 Result SendValueInBool(bool is_vibrating); 30 Result SendValueInBool(bool is_vibrating);
27 Result SendVibrationNotificationPattern(u32 pattern); 31 Result SendVibrationNotificationPattern(u32 pattern);
diff --git a/src/hid_core/resources/vibration/vibration_base.cpp b/src/hid_core/resources/vibration/vibration_base.cpp
index 350f349c2..f28d30406 100644
--- a/src/hid_core/resources/vibration/vibration_base.cpp
+++ b/src/hid_core/resources/vibration/vibration_base.cpp
@@ -10,12 +10,12 @@ namespace Service::HID {
10 10
11NpadVibrationBase::NpadVibrationBase() {} 11NpadVibrationBase::NpadVibrationBase() {}
12 12
13Result NpadVibrationBase::IncrementRefCounter() { 13Result NpadVibrationBase::Activate() {
14 ref_counter++; 14 ref_counter++;
15 return ResultSuccess; 15 return ResultSuccess;
16} 16}
17 17
18Result NpadVibrationBase::DecrementRefCounter() { 18Result NpadVibrationBase::Deactivate() {
19 if (ref_counter > 0) { 19 if (ref_counter > 0) {
20 ref_counter--; 20 ref_counter--;
21 } 21 }
diff --git a/src/hid_core/resources/vibration/vibration_base.h b/src/hid_core/resources/vibration/vibration_base.h
index c6c5fc4d9..69c26e669 100644
--- a/src/hid_core/resources/vibration/vibration_base.h
+++ b/src/hid_core/resources/vibration/vibration_base.h
@@ -6,6 +6,10 @@
6#include "common/common_types.h" 6#include "common/common_types.h"
7#include "core/hle/result.h" 7#include "core/hle/result.h"
8 8
9namespace Core::HID {
10class EmulatedController;
11}
12
9namespace Service::HID { 13namespace Service::HID {
10class NpadVibration; 14class NpadVibration;
11 15
@@ -14,13 +18,13 @@ class NpadVibrationBase {
14public: 18public:
15 explicit NpadVibrationBase(); 19 explicit NpadVibrationBase();
16 20
17 virtual Result IncrementRefCounter(); 21 virtual Result Activate();
18 virtual Result DecrementRefCounter(); 22 virtual Result Deactivate();
19 23
20 bool IsVibrationMounted() const; 24 bool IsVibrationMounted() const;
21 25
22protected: 26protected:
23 u64 xcd_handle{}; 27 Core::HID::EmulatedController* xcd_handle{nullptr};
24 s32 ref_counter{}; 28 s32 ref_counter{};
25 bool is_mounted{}; 29 bool is_mounted{};
26 NpadVibration* vibration_handler{nullptr}; 30 NpadVibration* vibration_handler{nullptr};
diff --git a/src/hid_core/resources/vibration/vibration_device.cpp b/src/hid_core/resources/vibration/vibration_device.cpp
index 888c3a7ed..08b14591f 100644
--- a/src/hid_core/resources/vibration/vibration_device.cpp
+++ b/src/hid_core/resources/vibration/vibration_device.cpp
@@ -1,6 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "hid_core/frontend/emulated_controller.h"
4#include "hid_core/hid_result.h" 5#include "hid_core/hid_result.h"
5#include "hid_core/resources/npad/npad_types.h" 6#include "hid_core/resources/npad/npad_types.h"
6#include "hid_core/resources/npad/npad_vibration.h" 7#include "hid_core/resources/npad/npad_vibration.h"
@@ -10,12 +11,30 @@ namespace Service::HID {
10 11
11NpadVibrationDevice::NpadVibrationDevice() {} 12NpadVibrationDevice::NpadVibrationDevice() {}
12 13
13Result NpadVibrationDevice::IncrementRefCounter() { 14Result NpadVibrationDevice::Activate() {
15 if (ref_counter == 0 && is_mounted) {
16 f32 volume = 1.0f;
17 const auto result = vibration_handler->GetVibrationVolume(volume);
18 if (result.IsSuccess()) {
19 xcd_handle->SetVibration(device_index, Core::HID::DEFAULT_VIBRATION_VALUE);
20 // TODO: SendNotificationPattern;
21 }
22 }
23
14 ref_counter++; 24 ref_counter++;
15 return ResultSuccess; 25 return ResultSuccess;
16} 26}
17 27
18Result NpadVibrationDevice::DecrementRefCounter() { 28Result NpadVibrationDevice::Deactivate() {
29 if (ref_counter == 1 && is_mounted) {
30 f32 volume = 1.0f;
31 const auto result = vibration_handler->GetVibrationVolume(volume);
32 if (result.IsSuccess()) {
33 xcd_handle->SetVibration(device_index, Core::HID::DEFAULT_VIBRATION_VALUE);
34 // TODO: SendNotificationPattern;
35 }
36 }
37
19 if (ref_counter > 0) { 38 if (ref_counter > 0) {
20 ref_counter--; 39 ref_counter--;
21 } 40 }
@@ -23,6 +42,45 @@ Result NpadVibrationDevice::DecrementRefCounter() {
23 return ResultSuccess; 42 return ResultSuccess;
24} 43}
25 44
45Result NpadVibrationDevice::Mount(IAbstractedPad& abstracted_pad, Core::HID::DeviceIndex index,
46 NpadVibration* handler) {
47 if (!abstracted_pad.internal_flags.is_connected) {
48 return ResultSuccess;
49 }
50 xcd_handle = abstracted_pad.xcd_handle;
51 device_index = index;
52 vibration_handler = handler;
53 is_mounted = true;
54
55 if (ref_counter == 0) {
56 return ResultSuccess;
57 }
58
59 f32 volume{1.0f};
60 const auto result = vibration_handler->GetVibrationVolume(volume);
61 if (result.IsSuccess()) {
62 xcd_handle->SetVibration(false);
63 }
64
65 return ResultSuccess;
66}
67
68Result NpadVibrationDevice::Unmount() {
69 if (ref_counter == 0 || !is_mounted) {
70 is_mounted = false;
71 return ResultSuccess;
72 }
73
74 f32 volume{1.0f};
75 const auto result = vibration_handler->GetVibrationVolume(volume);
76 if (result.IsSuccess()) {
77 xcd_handle->SetVibration(device_index, Core::HID::DEFAULT_VIBRATION_VALUE);
78 }
79
80 is_mounted = false;
81 return ResultSuccess;
82}
83
26Result NpadVibrationDevice::SendVibrationValue(const Core::HID::VibrationValue& value) { 84Result NpadVibrationDevice::SendVibrationValue(const Core::HID::VibrationValue& value) {
27 if (ref_counter == 0) { 85 if (ref_counter == 0) {
28 return ResultVibrationNotInitialized; 86 return ResultVibrationNotInitialized;
@@ -37,7 +95,7 @@ Result NpadVibrationDevice::SendVibrationValue(const Core::HID::VibrationValue&
37 return result; 95 return result;
38 } 96 }
39 if (volume <= 0.0f) { 97 if (volume <= 0.0f) {
40 // TODO: SendVibrationValue 98 xcd_handle->SetVibration(device_index, Core::HID::DEFAULT_VIBRATION_VALUE);
41 return ResultSuccess; 99 return ResultSuccess;
42 } 100 }
43 101
@@ -45,7 +103,7 @@ Result NpadVibrationDevice::SendVibrationValue(const Core::HID::VibrationValue&
45 vibration_value.high_amplitude *= volume; 103 vibration_value.high_amplitude *= volume;
46 vibration_value.low_amplitude *= volume; 104 vibration_value.low_amplitude *= volume;
47 105
48 // TODO: SendVibrationValue 106 xcd_handle->SetVibration(device_index, vibration_value);
49 return ResultSuccess; 107 return ResultSuccess;
50} 108}
51 109
@@ -63,11 +121,11 @@ Result NpadVibrationDevice::SendVibrationNotificationPattern([[maybe_unused]] u3
63 pattern = 0; 121 pattern = 0;
64 } 122 }
65 123
66 // return xcd_handle->SendVibrationNotificationPattern(pattern); 124 // TODO: SendVibrationNotificationPattern;
67 return ResultSuccess; 125 return ResultSuccess;
68} 126}
69 127
70Result NpadVibrationDevice::GetActualVibrationValue(Core::HID::VibrationValue& out_value) { 128Result NpadVibrationDevice::GetActualVibrationValue(Core::HID::VibrationValue& out_value) const {
71 if (ref_counter < 1) { 129 if (ref_counter < 1) {
72 return ResultVibrationNotInitialized; 130 return ResultVibrationNotInitialized;
73 } 131 }
@@ -77,7 +135,7 @@ Result NpadVibrationDevice::GetActualVibrationValue(Core::HID::VibrationValue& o
77 return ResultSuccess; 135 return ResultSuccess;
78 } 136 }
79 137
80 // TODO: SendVibrationValue 138 out_value = xcd_handle->GetActualVibrationValue(device_index);
81 return ResultSuccess; 139 return ResultSuccess;
82} 140}
83 141
diff --git a/src/hid_core/resources/vibration/vibration_device.h b/src/hid_core/resources/vibration/vibration_device.h
index 3574ad60b..c2f9891d3 100644
--- a/src/hid_core/resources/vibration/vibration_device.h
+++ b/src/hid_core/resources/vibration/vibration_device.h
@@ -12,6 +12,10 @@
12#include "hid_core/resources/npad/npad_types.h" 12#include "hid_core/resources/npad/npad_types.h"
13#include "hid_core/resources/vibration/vibration_base.h" 13#include "hid_core/resources/vibration/vibration_base.h"
14 14
15namespace Core::HID {
16enum class DeviceIndex : u8;
17}
18
15namespace Service::HID { 19namespace Service::HID {
16class NpadVibration; 20class NpadVibration;
17 21
@@ -20,16 +24,20 @@ class NpadVibrationDevice final : public NpadVibrationBase {
20public: 24public:
21 explicit NpadVibrationDevice(); 25 explicit NpadVibrationDevice();
22 26
23 Result IncrementRefCounter(); 27 Result Activate();
24 Result DecrementRefCounter(); 28 Result Deactivate();
29
30 Result Mount(IAbstractedPad& abstracted_pad, Core::HID::DeviceIndex index,
31 NpadVibration* handler);
32 Result Unmount();
25 33
26 Result SendVibrationValue(const Core::HID::VibrationValue& value); 34 Result SendVibrationValue(const Core::HID::VibrationValue& value);
27 Result SendVibrationNotificationPattern(u32 pattern); 35 Result SendVibrationNotificationPattern(u32 pattern);
28 36
29 Result GetActualVibrationValue(Core::HID::VibrationValue& out_value); 37 Result GetActualVibrationValue(Core::HID::VibrationValue& out_value) const;
30 38
31private: 39private:
32 u32 device_index{}; 40 Core::HID::DeviceIndex device_index{};
33}; 41};
34 42
35} // namespace Service::HID 43} // namespace Service::HID
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 800754554..64a4e0e55 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -12,6 +12,11 @@ namespace Shader::Backend::SPIRV {
12namespace { 12namespace {
13class ImageOperands { 13class ImageOperands {
14public: 14public:
15 [[maybe_unused]] static constexpr bool ImageSampleOffsetAllowed = false;
16 [[maybe_unused]] static constexpr bool ImageGatherOffsetAllowed = true;
17 [[maybe_unused]] static constexpr bool ImageFetchOffsetAllowed = false;
18 [[maybe_unused]] static constexpr bool ImageGradientOffsetAllowed = false;
19
15 explicit ImageOperands(EmitContext& ctx, bool has_bias, bool has_lod, bool has_lod_clamp, 20 explicit ImageOperands(EmitContext& ctx, bool has_bias, bool has_lod, bool has_lod_clamp,
16 Id lod, const IR::Value& offset) { 21 Id lod, const IR::Value& offset) {
17 if (has_bias) { 22 if (has_bias) {
@@ -22,7 +27,7 @@ public:
22 const Id lod_value{has_lod_clamp ? ctx.OpCompositeExtract(ctx.F32[1], lod, 0) : lod}; 27 const Id lod_value{has_lod_clamp ? ctx.OpCompositeExtract(ctx.F32[1], lod, 0) : lod};
23 Add(spv::ImageOperandsMask::Lod, lod_value); 28 Add(spv::ImageOperandsMask::Lod, lod_value);
24 } 29 }
25 AddOffset(ctx, offset); 30 AddOffset(ctx, offset, ImageSampleOffsetAllowed);
26 if (has_lod_clamp) { 31 if (has_lod_clamp) {
27 const Id lod_clamp{has_bias ? ctx.OpCompositeExtract(ctx.F32[1], lod, 1) : lod}; 32 const Id lod_clamp{has_bias ? ctx.OpCompositeExtract(ctx.F32[1], lod, 1) : lod};
28 Add(spv::ImageOperandsMask::MinLod, lod_clamp); 33 Add(spv::ImageOperandsMask::MinLod, lod_clamp);
@@ -55,20 +60,17 @@ public:
55 Add(spv::ImageOperandsMask::ConstOffsets, offsets); 60 Add(spv::ImageOperandsMask::ConstOffsets, offsets);
56 } 61 }
57 62
58 explicit ImageOperands(Id offset, Id lod, Id ms) { 63 explicit ImageOperands(Id lod, Id ms) {
59 if (Sirit::ValidId(lod)) { 64 if (Sirit::ValidId(lod)) {
60 Add(spv::ImageOperandsMask::Lod, lod); 65 Add(spv::ImageOperandsMask::Lod, lod);
61 } 66 }
62 if (Sirit::ValidId(offset)) {
63 Add(spv::ImageOperandsMask::Offset, offset);
64 }
65 if (Sirit::ValidId(ms)) { 67 if (Sirit::ValidId(ms)) {
66 Add(spv::ImageOperandsMask::Sample, ms); 68 Add(spv::ImageOperandsMask::Sample, ms);
67 } 69 }
68 } 70 }
69 71
70 explicit ImageOperands(EmitContext& ctx, bool has_lod_clamp, Id derivatives, 72 explicit ImageOperands(EmitContext& ctx, bool has_lod_clamp, Id derivatives,
71 u32 num_derivatives, Id offset, Id lod_clamp) { 73 u32 num_derivatives, const IR::Value& offset, Id lod_clamp) {
72 if (!Sirit::ValidId(derivatives)) { 74 if (!Sirit::ValidId(derivatives)) {
73 throw LogicError("Derivatives must be present"); 75 throw LogicError("Derivatives must be present");
74 } 76 }
@@ -83,16 +85,14 @@ public:
83 const Id derivatives_Y{ctx.OpCompositeConstruct( 85 const Id derivatives_Y{ctx.OpCompositeConstruct(
84 ctx.F32[num_derivatives], std::span{deriv_y_accum.data(), deriv_y_accum.size()})}; 86 ctx.F32[num_derivatives], std::span{deriv_y_accum.data(), deriv_y_accum.size()})};
85 Add(spv::ImageOperandsMask::Grad, derivatives_X, derivatives_Y); 87 Add(spv::ImageOperandsMask::Grad, derivatives_X, derivatives_Y);
86 if (Sirit::ValidId(offset)) { 88 AddOffset(ctx, offset, ImageGradientOffsetAllowed);
87 Add(spv::ImageOperandsMask::Offset, offset);
88 }
89 if (has_lod_clamp) { 89 if (has_lod_clamp) {
90 Add(spv::ImageOperandsMask::MinLod, lod_clamp); 90 Add(spv::ImageOperandsMask::MinLod, lod_clamp);
91 } 91 }
92 } 92 }
93 93
94 explicit ImageOperands(EmitContext& ctx, bool has_lod_clamp, Id derivatives_1, Id derivatives_2, 94 explicit ImageOperands(EmitContext& ctx, bool has_lod_clamp, Id derivatives_1, Id derivatives_2,
95 Id offset, Id lod_clamp) { 95 const IR::Value& offset, Id lod_clamp) {
96 if (!Sirit::ValidId(derivatives_1) || !Sirit::ValidId(derivatives_2)) { 96 if (!Sirit::ValidId(derivatives_1) || !Sirit::ValidId(derivatives_2)) {
97 throw LogicError("Derivatives must be present"); 97 throw LogicError("Derivatives must be present");
98 } 98 }
@@ -111,9 +111,7 @@ public:
111 const Id derivatives_id2{ctx.OpCompositeConstruct( 111 const Id derivatives_id2{ctx.OpCompositeConstruct(
112 ctx.F32[3], std::span{deriv_2_accum.data(), deriv_2_accum.size()})}; 112 ctx.F32[3], std::span{deriv_2_accum.data(), deriv_2_accum.size()})};
113 Add(spv::ImageOperandsMask::Grad, derivatives_id1, derivatives_id2); 113 Add(spv::ImageOperandsMask::Grad, derivatives_id1, derivatives_id2);
114 if (Sirit::ValidId(offset)) { 114 AddOffset(ctx, offset, ImageGradientOffsetAllowed);
115 Add(spv::ImageOperandsMask::Offset, offset);
116 }
117 if (has_lod_clamp) { 115 if (has_lod_clamp) {
118 Add(spv::ImageOperandsMask::MinLod, lod_clamp); 116 Add(spv::ImageOperandsMask::MinLod, lod_clamp);
119 } 117 }
@@ -132,7 +130,7 @@ public:
132 } 130 }
133 131
134private: 132private:
135 void AddOffset(EmitContext& ctx, const IR::Value& offset) { 133 void AddOffset(EmitContext& ctx, const IR::Value& offset, bool runtime_offset_allowed) {
136 if (offset.IsEmpty()) { 134 if (offset.IsEmpty()) {
137 return; 135 return;
138 } 136 }
@@ -165,7 +163,9 @@ private:
165 break; 163 break;
166 } 164 }
167 } 165 }
168 Add(spv::ImageOperandsMask::Offset, ctx.Def(offset)); 166 if (runtime_offset_allowed) {
167 Add(spv::ImageOperandsMask::Offset, ctx.Def(offset));
168 }
169 } 169 }
170 170
171 void Add(spv::ImageOperandsMask new_mask, Id value) { 171 void Add(spv::ImageOperandsMask new_mask, Id value) {
@@ -311,6 +311,37 @@ Id ImageGatherSubpixelOffset(EmitContext& ctx, const IR::TextureInstInfo& info,
311 return coords; 311 return coords;
312 } 312 }
313} 313}
314
315void AddOffsetToCoordinates(EmitContext& ctx, const IR::TextureInstInfo& info, Id& coords,
316 Id offset) {
317 if (!Sirit::ValidId(offset)) {
318 return;
319 }
320
321 Id result_type{};
322 switch (info.type) {
323 case TextureType::Buffer:
324 case TextureType::Color1D:
325 case TextureType::ColorArray1D: {
326 result_type = ctx.U32[1];
327 break;
328 }
329 case TextureType::Color2D:
330 case TextureType::Color2DRect:
331 case TextureType::ColorArray2D: {
332 result_type = ctx.U32[2];
333 break;
334 }
335 case TextureType::Color3D: {
336 result_type = ctx.U32[3];
337 break;
338 }
339 case TextureType::ColorCube:
340 case TextureType::ColorArrayCube:
341 return;
342 }
343 coords = ctx.OpIAdd(result_type, coords, offset);
344}
314} // Anonymous namespace 345} // Anonymous namespace
315 346
316Id EmitBindlessImageSampleImplicitLod(EmitContext&) { 347Id EmitBindlessImageSampleImplicitLod(EmitContext&) {
@@ -496,6 +527,7 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
496Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, 527Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset,
497 Id lod, Id ms) { 528 Id lod, Id ms) {
498 const auto info{inst->Flags<IR::TextureInstInfo>()}; 529 const auto info{inst->Flags<IR::TextureInstInfo>()};
530 AddOffsetToCoordinates(ctx, info, coords, offset);
499 if (info.type == TextureType::Buffer) { 531 if (info.type == TextureType::Buffer) {
500 lod = Id{}; 532 lod = Id{};
501 } 533 }
@@ -503,7 +535,7 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id c
503 // This image is multisampled, lod must be implicit 535 // This image is multisampled, lod must be implicit
504 lod = Id{}; 536 lod = Id{};
505 } 537 }
506 const ImageOperands operands(offset, lod, ms); 538 const ImageOperands operands(lod, ms);
507 return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4], 539 return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4],
508 TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span()); 540 TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span());
509} 541}
@@ -548,13 +580,13 @@ Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, I
548} 580}
549 581
550Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 582Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
551 Id derivatives, Id offset, Id lod_clamp) { 583 Id derivatives, const IR::Value& offset, Id lod_clamp) {
552 const auto info{inst->Flags<IR::TextureInstInfo>()}; 584 const auto info{inst->Flags<IR::TextureInstInfo>()};
553 const auto operands = 585 const auto operands = info.num_derivatives == 3
554 info.num_derivatives == 3 586 ? ImageOperands(ctx, info.has_lod_clamp != 0, derivatives,
555 ? ImageOperands(ctx, info.has_lod_clamp != 0, derivatives, offset, {}, lod_clamp) 587 ctx.Def(offset), {}, lod_clamp)
556 : ImageOperands(ctx, info.has_lod_clamp != 0, derivatives, info.num_derivatives, offset, 588 : ImageOperands(ctx, info.has_lod_clamp != 0, derivatives,
557 lod_clamp); 589 info.num_derivatives, offset, lod_clamp);
558 return Emit(&EmitContext::OpImageSparseSampleExplicitLod, 590 return Emit(&EmitContext::OpImageSparseSampleExplicitLod,
559 &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4], 591 &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4],
560 Texture(ctx, info, index), coords, operands.Mask(), operands.Span()); 592 Texture(ctx, info, index), coords, operands.Mask(), operands.Span());
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
index 7d34575c8..5c01b1012 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
@@ -543,7 +543,7 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& i
543 const IR::Value& skip_mips); 543 const IR::Value& skip_mips);
544Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords); 544Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
545Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 545Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
546 Id derivatives, Id offset, Id lod_clamp); 546 Id derivatives, const IR::Value& offset, Id lod_clamp);
547Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords); 547Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
548void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color); 548void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color);
549Id EmitIsTextureScaled(EmitContext& ctx, const IR::Value& index); 549Id EmitIsTextureScaled(EmitContext& ctx, const IR::Value& index);
diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp
index 792ed9615..5e7518d96 100644
--- a/src/video_core/renderer_vulkan/vk_present_manager.cpp
+++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp
@@ -329,7 +329,7 @@ void PresentManager::CopyToSwapchainImpl(Frame* frame) {
329 // to account for that. 329 // to account for that.
330 const bool is_suboptimal = swapchain.NeedsRecreation(); 330 const bool is_suboptimal = swapchain.NeedsRecreation();
331 const bool size_changed = 331 const bool size_changed =
332 swapchain.GetWidth() < frame->width || swapchain.GetHeight() < frame->height; 332 swapchain.GetWidth() != frame->width || swapchain.GetHeight() != frame->height;
333 if (is_suboptimal || size_changed) { 333 if (is_suboptimal || size_changed) {
334 RecreateSwapchain(frame); 334 RecreateSwapchain(frame);
335 } 335 }
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index 90278052a..93b03b917 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -351,7 +351,7 @@ if (APPLE)
351 351
352 if (NOT USE_SYSTEM_MOLTENVK) 352 if (NOT USE_SYSTEM_MOLTENVK)
353 set(MOLTENVK_PLATFORM "macOS") 353 set(MOLTENVK_PLATFORM "macOS")
354 set(MOLTENVK_VERSION "v1.2.5") 354 set(MOLTENVK_VERSION "v1.2.7")
355 download_moltenvk_external(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION}) 355 download_moltenvk_external(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION})
356 endif() 356 endif()
357 find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED) 357 find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp
index 140a7fe5d..568775027 100644
--- a/src/yuzu/configuration/configure_per_game_addons.cpp
+++ b/src/yuzu/configuration/configure_per_game_addons.cpp
@@ -122,9 +122,8 @@ void ConfigurePerGameAddons::LoadConfiguration() {
122 122
123 const auto& disabled = Settings::values.disabled_addons[title_id]; 123 const auto& disabled = Settings::values.disabled_addons[title_id];
124 124
125 for (const auto& patch : pm.GetPatchVersionNames(update_raw)) { 125 for (const auto& patch : pm.GetPatches(update_raw)) {
126 const auto name = 126 const auto name = QString::fromStdString(patch.name);
127 QString::fromStdString(patch.first).replace(QStringLiteral("[D] "), QString{});
128 127
129 auto* const first_item = new QStandardItem; 128 auto* const first_item = new QStandardItem;
130 first_item->setText(name); 129 first_item->setText(name);
@@ -136,7 +135,7 @@ void ConfigurePerGameAddons::LoadConfiguration() {
136 first_item->setCheckState(patch_disabled ? Qt::Unchecked : Qt::Checked); 135 first_item->setCheckState(patch_disabled ? Qt::Unchecked : Qt::Checked);
137 136
138 list_items.push_back(QList<QStandardItem*>{ 137 list_items.push_back(QList<QStandardItem*>{
139 first_item, new QStandardItem{QString::fromStdString(patch.second)}}); 138 first_item, new QStandardItem{QString::fromStdString(patch.version)}});
140 item_model->appendRow(list_items.back()); 139 item_model->appendRow(list_items.back());
141 } 140 }
142 141
diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp
index d898d8acc..6b1f4527b 100644
--- a/src/yuzu/configuration/configure_vibration.cpp
+++ b/src/yuzu/configuration/configure_vibration.cpp
@@ -116,8 +116,8 @@ void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type
116 .high_amplitude = 1.0f, 116 .high_amplitude = 1.0f,
117 .high_frequency = 320.0f, 117 .high_frequency = 320.0f,
118 }; 118 };
119 controller->SetVibration(0, vibration); 119 controller->SetVibration(Core::HID::DeviceIndex::Left, vibration);
120 controller->SetVibration(1, vibration); 120 controller->SetVibration(Core::HID::DeviceIndex::Right, vibration);
121 121
122 // Restore previous values 122 // Restore previous values
123 player.vibration_enabled = old_vibration_enabled; 123 player.vibration_enabled = old_vibration_enabled;
@@ -127,7 +127,7 @@ void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type
127void ConfigureVibration::StopVibrations() { 127void ConfigureVibration::StopVibrations() {
128 for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { 128 for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
129 auto controller = hid_core.GetEmulatedControllerByIndex(i); 129 auto controller = hid_core.GetEmulatedControllerByIndex(i);
130 controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE); 130 controller->SetVibration(Core::HID::DeviceIndex::Left, Core::HID::DEFAULT_VIBRATION_VALUE);
131 controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE); 131 controller->SetVibration(Core::HID::DeviceIndex::Right, Core::HID::DEFAULT_VIBRATION_VALUE);
132 } 132 }
133} 133}
diff --git a/src/yuzu/game_list_worker.cpp b/src/yuzu/game_list_worker.cpp
index dc006832e..9747e3fb3 100644
--- a/src/yuzu/game_list_worker.cpp
+++ b/src/yuzu/game_list_worker.cpp
@@ -164,18 +164,19 @@ QString FormatPatchNameVersions(const FileSys::PatchManager& patch_manager,
164 QString out; 164 QString out;
165 FileSys::VirtualFile update_raw; 165 FileSys::VirtualFile update_raw;
166 loader.ReadUpdateRaw(update_raw); 166 loader.ReadUpdateRaw(update_raw);
167 for (const auto& kv : patch_manager.GetPatchVersionNames(update_raw)) { 167 for (const auto& patch : patch_manager.GetPatches(update_raw)) {
168 const bool is_update = kv.first == "Update" || kv.first == "[D] Update"; 168 const bool is_update = patch.name == "Update";
169 if (!updatable && is_update) { 169 if (!updatable && is_update) {
170 continue; 170 continue;
171 } 171 }
172 172
173 const QString type = QString::fromStdString(kv.first); 173 const QString type =
174 QString::fromStdString(patch.enabled ? patch.name : "[D] " + patch.name);
174 175
175 if (kv.second.empty()) { 176 if (patch.version.empty()) {
176 out.append(QStringLiteral("%1\n").arg(type)); 177 out.append(QStringLiteral("%1\n").arg(type));
177 } else { 178 } else {
178 auto ver = kv.second; 179 auto ver = patch.version;
179 180
180 // Display container name for packed updates 181 // Display container name for packed updates
181 if (is_update && ver == "PACKED") { 182 if (is_update && ver == "PACKED") {
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 33756febf..d8b0beadf 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -47,6 +47,7 @@
47#include "core/hle/service/am/applet_oe.h" 47#include "core/hle/service/am/applet_oe.h"
48#include "core/hle/service/am/applets/applets.h" 48#include "core/hle/service/am/applets/applets.h"
49#include "core/hle/service/set/system_settings_server.h" 49#include "core/hle/service/set/system_settings_server.h"
50#include "frontend_common/content_manager.h"
50#include "hid_core/frontend/emulated_controller.h" 51#include "hid_core/frontend/emulated_controller.h"
51#include "hid_core/hid_core.h" 52#include "hid_core/hid_core.h"
52#include "yuzu/multiplayer/state.h" 53#include "yuzu/multiplayer/state.h"
@@ -518,12 +519,21 @@ GMainWindow::GMainWindow(std::unique_ptr<QtConfig> config_, bool has_broken_vulk
518 continue; 519 continue;
519 } 520 }
520 521
522 int user_arg_idx = ++i;
521 bool argument_ok; 523 bool argument_ok;
522 const std::size_t selected_user = args[++i].toUInt(&argument_ok); 524 std::size_t selected_user = args[user_arg_idx].toUInt(&argument_ok);
523 525
524 if (!argument_ok) { 526 if (!argument_ok) {
525 LOG_ERROR(Frontend, "Invalid user argument"); 527 // try to look it up by username, only finds the first username that matches.
526 continue; 528 const std::string user_arg_str = args[user_arg_idx].toStdString();
529 const auto user_idx = system->GetProfileManager().GetUserIndex(user_arg_str);
530
531 if (user_idx == std::nullopt) {
532 LOG_ERROR(Frontend, "Invalid user argument");
533 continue;
534 }
535
536 selected_user = user_idx.value();
527 } 537 }
528 538
529 if (!system->GetProfileManager().UserExistsIndex(selected_user)) { 539 if (!system->GetProfileManager().UserExistsIndex(selected_user)) {
@@ -532,6 +542,8 @@ GMainWindow::GMainWindow(std::unique_ptr<QtConfig> config_, bool has_broken_vulk
532 } 542 }
533 543
534 Settings::values.current_user = static_cast<s32>(selected_user); 544 Settings::values.current_user = static_cast<s32>(selected_user);
545
546 user_flag_cmd_line = true;
535 continue; 547 continue;
536 } 548 }
537 549
@@ -1942,7 +1954,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
1942 1954
1943 Settings::LogSettings(); 1955 Settings::LogSettings();
1944 1956
1945 if (UISettings::values.select_user_on_boot) { 1957 if (UISettings::values.select_user_on_boot && !user_flag_cmd_line) {
1946 const Core::Frontend::ProfileSelectParameters parameters{ 1958 const Core::Frontend::ProfileSelectParameters parameters{
1947 .mode = Service::AM::Applets::UiMode::UserSelector, 1959 .mode = Service::AM::Applets::UiMode::UserSelector,
1948 .invalid_uid_list = {}, 1960 .invalid_uid_list = {},
@@ -1954,6 +1966,11 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
1954 } 1966 }
1955 } 1967 }
1956 1968
1969 // If the user specifies -u (successfully) on the cmd line, don't prompt for a user on first
1970 // game startup only. If the user stops emulation and starts a new one, go back to the expected
1971 // behavior of asking.
1972 user_flag_cmd_line = false;
1973
1957 if (!LoadROM(filename, program_id, program_index, launch_type)) { 1974 if (!LoadROM(filename, program_id, program_index, launch_type)) {
1958 return; 1975 return;
1959 } 1976 }
@@ -2460,10 +2477,8 @@ void GMainWindow::OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryT
2460} 2477}
2461 2478
2462void GMainWindow::RemoveBaseContent(u64 program_id, InstalledEntryType type) { 2479void GMainWindow::RemoveBaseContent(u64 program_id, InstalledEntryType type) {
2463 const auto& fs_controller = system->GetFileSystemController(); 2480 const auto res =
2464 const auto res = fs_controller.GetUserNANDContents()->RemoveExistingEntry(program_id) || 2481 ContentManager::RemoveBaseContent(system->GetFileSystemController(), program_id);
2465 fs_controller.GetSDMCContents()->RemoveExistingEntry(program_id);
2466
2467 if (res) { 2482 if (res) {
2468 QMessageBox::information(this, tr("Successfully Removed"), 2483 QMessageBox::information(this, tr("Successfully Removed"),
2469 tr("Successfully removed the installed base game.")); 2484 tr("Successfully removed the installed base game."));
@@ -2475,11 +2490,7 @@ void GMainWindow::RemoveBaseContent(u64 program_id, InstalledEntryType type) {
2475} 2490}
2476 2491
2477void GMainWindow::RemoveUpdateContent(u64 program_id, InstalledEntryType type) { 2492void GMainWindow::RemoveUpdateContent(u64 program_id, InstalledEntryType type) {
2478 const auto update_id = program_id | 0x800; 2493 const auto res = ContentManager::RemoveUpdate(system->GetFileSystemController(), program_id);
2479 const auto& fs_controller = system->GetFileSystemController();
2480 const auto res = fs_controller.GetUserNANDContents()->RemoveExistingEntry(update_id) ||
2481 fs_controller.GetSDMCContents()->RemoveExistingEntry(update_id);
2482
2483 if (res) { 2494 if (res) {
2484 QMessageBox::information(this, tr("Successfully Removed"), 2495 QMessageBox::information(this, tr("Successfully Removed"),
2485 tr("Successfully removed the installed update.")); 2496 tr("Successfully removed the installed update."));
@@ -2490,22 +2501,7 @@ void GMainWindow::RemoveUpdateContent(u64 program_id, InstalledEntryType type) {
2490} 2501}
2491 2502
2492void GMainWindow::RemoveAddOnContent(u64 program_id, InstalledEntryType type) { 2503void GMainWindow::RemoveAddOnContent(u64 program_id, InstalledEntryType type) {
2493 u32 count{}; 2504 const size_t count = ContentManager::RemoveAllDLC(system.get(), program_id);
2494 const auto& fs_controller = system->GetFileSystemController();
2495 const auto dlc_entries = system->GetContentProvider().ListEntriesFilter(
2496 FileSys::TitleType::AOC, FileSys::ContentRecordType::Data);
2497
2498 for (const auto& entry : dlc_entries) {
2499 if (FileSys::GetBaseTitleID(entry.title_id) == program_id) {
2500 const auto res =
2501 fs_controller.GetUserNANDContents()->RemoveExistingEntry(entry.title_id) ||
2502 fs_controller.GetSDMCContents()->RemoveExistingEntry(entry.title_id);
2503 if (res) {
2504 ++count;
2505 }
2506 }
2507 }
2508
2509 if (count == 0) { 2505 if (count == 0) {
2510 QMessageBox::warning(this, GetGameListErrorRemoving(type), 2506 QMessageBox::warning(this, GetGameListErrorRemoving(type),
2511 tr("There are no DLC installed for this title.")); 2507 tr("There are no DLC installed for this title."));
@@ -2790,16 +2786,6 @@ void GMainWindow::OnGameListVerifyIntegrity(const std::string& game_path) {
2790 QMessageBox::warning(this, tr("Integrity verification couldn't be performed!"), 2786 QMessageBox::warning(this, tr("Integrity verification couldn't be performed!"),
2791 tr("File contents were not checked for validity.")); 2787 tr("File contents were not checked for validity."));
2792 }; 2788 };
2793 const auto Failed = [this] {
2794 QMessageBox::critical(this, tr("Integrity verification failed!"),
2795 tr("File contents may be corrupt."));
2796 };
2797
2798 const auto loader = Loader::GetLoader(*system, vfs->OpenFile(game_path, FileSys::Mode::Read));
2799 if (loader == nullptr) {
2800 NotImplemented();
2801 return;
2802 }
2803 2789
2804 QProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, this); 2790 QProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, this);
2805 progress.setWindowModality(Qt::WindowModal); 2791 progress.setWindowModality(Qt::WindowModal);
@@ -2807,30 +2793,26 @@ void GMainWindow::OnGameListVerifyIntegrity(const std::string& game_path) {
2807 progress.setAutoClose(false); 2793 progress.setAutoClose(false);
2808 progress.setAutoReset(false); 2794 progress.setAutoReset(false);
2809 2795
2810 const auto QtProgressCallback = [&](size_t processed_size, size_t total_size) { 2796 const auto QtProgressCallback = [&](size_t total_size, size_t processed_size) {
2811 if (progress.wasCanceled()) {
2812 return false;
2813 }
2814
2815 progress.setValue(static_cast<int>((processed_size * 100) / total_size)); 2797 progress.setValue(static_cast<int>((processed_size * 100) / total_size));
2816 return true; 2798 return progress.wasCanceled();
2817 }; 2799 };
2818 2800
2819 const auto status = loader->VerifyIntegrity(QtProgressCallback); 2801 const auto result =
2820 if (progress.wasCanceled() || 2802 ContentManager::VerifyGameContents(system.get(), game_path, QtProgressCallback);
2821 status == Loader::ResultStatus::ErrorIntegrityVerificationNotImplemented) { 2803 progress.close();
2804 switch (result) {
2805 case ContentManager::GameVerificationResult::Success:
2806 QMessageBox::information(this, tr("Integrity verification succeeded!"),
2807 tr("The operation completed successfully."));
2808 break;
2809 case ContentManager::GameVerificationResult::Failed:
2810 QMessageBox::critical(this, tr("Integrity verification failed!"),
2811 tr("File contents may be corrupt."));
2812 break;
2813 case ContentManager::GameVerificationResult::NotImplemented:
2822 NotImplemented(); 2814 NotImplemented();
2823 return;
2824 } 2815 }
2825
2826 if (status == Loader::ResultStatus::ErrorIntegrityVerificationFailed) {
2827 Failed();
2828 return;
2829 }
2830
2831 progress.close();
2832 QMessageBox::information(this, tr("Integrity verification succeeded!"),
2833 tr("The operation completed successfully."));
2834} 2816}
2835 2817
2836void GMainWindow::OnGameListCopyTID(u64 program_id) { 2818void GMainWindow::OnGameListCopyTID(u64 program_id) {
@@ -3274,12 +3256,21 @@ void GMainWindow::OnMenuInstallToNAND() {
3274 install_progress->setLabelText( 3256 install_progress->setLabelText(
3275 tr("Installing file \"%1\"...").arg(QFileInfo(file).fileName())); 3257 tr("Installing file \"%1\"...").arg(QFileInfo(file).fileName()));
3276 3258
3277 QFuture<InstallResult> future; 3259 QFuture<ContentManager::InstallResult> future;
3278 InstallResult result; 3260 ContentManager::InstallResult result;
3279 3261
3280 if (file.endsWith(QStringLiteral("nsp"), Qt::CaseInsensitive)) { 3262 if (file.endsWith(QStringLiteral("nsp"), Qt::CaseInsensitive)) {
3281 3263 const auto progress_callback = [this](size_t size, size_t progress) {
3282 future = QtConcurrent::run([this, &file] { return InstallNSP(file); }); 3264 emit UpdateInstallProgress();
3265 if (install_progress->wasCanceled()) {
3266 return true;
3267 }
3268 return false;
3269 };
3270 future = QtConcurrent::run([this, &file, progress_callback] {
3271 return ContentManager::InstallNSP(system.get(), vfs.get(), file.toStdString(),
3272 progress_callback);
3273 });
3283 3274
3284 while (!future.isFinished()) { 3275 while (!future.isFinished()) {
3285 QCoreApplication::processEvents(); 3276 QCoreApplication::processEvents();
@@ -3295,16 +3286,16 @@ void GMainWindow::OnMenuInstallToNAND() {
3295 std::this_thread::sleep_for(std::chrono::milliseconds(10)); 3286 std::this_thread::sleep_for(std::chrono::milliseconds(10));
3296 3287
3297 switch (result) { 3288 switch (result) {
3298 case InstallResult::Success: 3289 case ContentManager::InstallResult::Success:
3299 new_files.append(QFileInfo(file).fileName()); 3290 new_files.append(QFileInfo(file).fileName());
3300 break; 3291 break;
3301 case InstallResult::Overwrite: 3292 case ContentManager::InstallResult::Overwrite:
3302 overwritten_files.append(QFileInfo(file).fileName()); 3293 overwritten_files.append(QFileInfo(file).fileName());
3303 break; 3294 break;
3304 case InstallResult::Failure: 3295 case ContentManager::InstallResult::Failure:
3305 failed_files.append(QFileInfo(file).fileName()); 3296 failed_files.append(QFileInfo(file).fileName());
3306 break; 3297 break;
3307 case InstallResult::BaseInstallAttempted: 3298 case ContentManager::InstallResult::BaseInstallAttempted:
3308 failed_files.append(QFileInfo(file).fileName()); 3299 failed_files.append(QFileInfo(file).fileName());
3309 detected_base_install = true; 3300 detected_base_install = true;
3310 break; 3301 break;
@@ -3338,96 +3329,7 @@ void GMainWindow::OnMenuInstallToNAND() {
3338 ui->action_Install_File_NAND->setEnabled(true); 3329 ui->action_Install_File_NAND->setEnabled(true);
3339} 3330}
3340 3331
3341InstallResult GMainWindow::InstallNSP(const QString& filename) { 3332ContentManager::InstallResult GMainWindow::InstallNCA(const QString& filename) {
3342 const auto qt_raw_copy = [this](const FileSys::VirtualFile& src,
3343 const FileSys::VirtualFile& dest, std::size_t block_size) {
3344 if (src == nullptr || dest == nullptr) {
3345 return false;
3346 }
3347 if (!dest->Resize(src->GetSize())) {
3348 return false;
3349 }
3350
3351 std::vector<u8> buffer(CopyBufferSize);
3352
3353 for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
3354 if (install_progress->wasCanceled()) {
3355 dest->Resize(0);
3356 return false;
3357 }
3358
3359 emit UpdateInstallProgress();
3360
3361 const auto read = src->Read(buffer.data(), buffer.size(), i);
3362 dest->Write(buffer.data(), read, i);
3363 }
3364 return true;
3365 };
3366
3367 std::shared_ptr<FileSys::NSP> nsp;
3368 if (filename.endsWith(QStringLiteral("nsp"), Qt::CaseInsensitive)) {
3369 nsp = std::make_shared<FileSys::NSP>(
3370 vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
3371 if (nsp->IsExtractedType()) {
3372 return InstallResult::Failure;
3373 }
3374 } else {
3375 return InstallResult::Failure;
3376 }
3377
3378 if (nsp->GetStatus() != Loader::ResultStatus::Success) {
3379 return InstallResult::Failure;
3380 }
3381 const auto res = system->GetFileSystemController().GetUserNANDContents()->InstallEntry(
3382 *nsp, true, qt_raw_copy);
3383 switch (res) {
3384 case FileSys::InstallResult::Success:
3385 return InstallResult::Success;
3386 case FileSys::InstallResult::OverwriteExisting:
3387 return InstallResult::Overwrite;
3388 case FileSys::InstallResult::ErrorBaseInstall:
3389 return InstallResult::BaseInstallAttempted;
3390 default:
3391 return InstallResult::Failure;
3392 }
3393}
3394
3395InstallResult GMainWindow::InstallNCA(const QString& filename) {
3396 const auto qt_raw_copy = [this](const FileSys::VirtualFile& src,
3397 const FileSys::VirtualFile& dest, std::size_t block_size) {
3398 if (src == nullptr || dest == nullptr) {
3399 return false;
3400 }
3401 if (!dest->Resize(src->GetSize())) {
3402 return false;
3403 }
3404
3405 std::vector<u8> buffer(CopyBufferSize);
3406
3407 for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
3408 if (install_progress->wasCanceled()) {
3409 dest->Resize(0);
3410 return false;
3411 }
3412
3413 emit UpdateInstallProgress();
3414
3415 const auto read = src->Read(buffer.data(), buffer.size(), i);
3416 dest->Write(buffer.data(), read, i);
3417 }
3418 return true;
3419 };
3420
3421 const auto nca =
3422 std::make_shared<FileSys::NCA>(vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
3423 const auto id = nca->GetStatus();
3424
3425 // Game updates necessary are missing base RomFS
3426 if (id != Loader::ResultStatus::Success &&
3427 id != Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) {
3428 return InstallResult::Failure;
3429 }
3430
3431 const QStringList tt_options{tr("System Application"), 3333 const QStringList tt_options{tr("System Application"),
3432 tr("System Archive"), 3334 tr("System Archive"),
3433 tr("System Application Update"), 3335 tr("System Application Update"),
@@ -3448,7 +3350,7 @@ InstallResult GMainWindow::InstallNCA(const QString& filename) {
3448 if (!ok || index == -1) { 3350 if (!ok || index == -1) {
3449 QMessageBox::warning(this, tr("Failed to Install"), 3351 QMessageBox::warning(this, tr("Failed to Install"),
3450 tr("The title type you selected for the NCA is invalid.")); 3352 tr("The title type you selected for the NCA is invalid."));
3451 return InstallResult::Failure; 3353 return ContentManager::InstallResult::Failure;
3452 } 3354 }
3453 3355
3454 // If index is equal to or past Game, add the jump in TitleType. 3356 // If index is equal to or past Game, add the jump in TitleType.
@@ -3462,15 +3364,15 @@ InstallResult GMainWindow::InstallNCA(const QString& filename) {
3462 auto* registered_cache = is_application ? fs_controller.GetUserNANDContents() 3364 auto* registered_cache = is_application ? fs_controller.GetUserNANDContents()
3463 : fs_controller.GetSystemNANDContents(); 3365 : fs_controller.GetSystemNANDContents();
3464 3366
3465 const auto res = registered_cache->InstallEntry(*nca, static_cast<FileSys::TitleType>(index), 3367 const auto progress_callback = [this](size_t size, size_t progress) {
3466 true, qt_raw_copy); 3368 emit UpdateInstallProgress();
3467 if (res == FileSys::InstallResult::Success) { 3369 if (install_progress->wasCanceled()) {
3468 return InstallResult::Success; 3370 return true;
3469 } else if (res == FileSys::InstallResult::OverwriteExisting) { 3371 }
3470 return InstallResult::Overwrite; 3372 return false;
3471 } else { 3373 };
3472 return InstallResult::Failure; 3374 return ContentManager::InstallNCA(vfs.get(), filename.toStdString(), registered_cache,
3473 } 3375 static_cast<FileSys::TitleType>(index), progress_callback);
3474} 3376}
3475 3377
3476void GMainWindow::OnMenuRecentFile() { 3378void GMainWindow::OnMenuRecentFile() {
@@ -4205,10 +4107,6 @@ void GMainWindow::OnOpenYuzuFolder() {
4205} 4107}
4206 4108
4207void GMainWindow::OnVerifyInstalledContents() { 4109void GMainWindow::OnVerifyInstalledContents() {
4208 // Declare sizes.
4209 size_t total_size = 0;
4210 size_t processed_size = 0;
4211
4212 // Initialize a progress dialog. 4110 // Initialize a progress dialog.
4213 QProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, this); 4111 QProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, this);
4214 progress.setWindowModality(Qt::WindowModal); 4112 progress.setWindowModality(Qt::WindowModal);
@@ -4216,93 +4114,25 @@ void GMainWindow::OnVerifyInstalledContents() {
4216 progress.setAutoClose(false); 4114 progress.setAutoClose(false);
4217 progress.setAutoReset(false); 4115 progress.setAutoReset(false);
4218 4116
4219 // Declare a list of file names which failed to verify.
4220 std::vector<std::string> failed;
4221
4222 // Declare progress callback. 4117 // Declare progress callback.
4223 auto QtProgressCallback = [&](size_t nca_processed, size_t nca_total) { 4118 auto QtProgressCallback = [&](size_t total_size, size_t processed_size) {
4224 if (progress.wasCanceled()) { 4119 progress.setValue(static_cast<int>((processed_size * 100) / total_size));
4225 return false; 4120 return progress.wasCanceled();
4226 }
4227 progress.setValue(static_cast<int>(((processed_size + nca_processed) * 100) / total_size));
4228 return true;
4229 }; 4121 };
4230 4122
4231 // Get content registries. 4123 const std::vector<std::string> result =
4232 auto bis_contents = system->GetFileSystemController().GetSystemNANDContents(); 4124 ContentManager::VerifyInstalledContents(system.get(), provider.get(), QtProgressCallback);
4233 auto user_contents = system->GetFileSystemController().GetUserNANDContents();
4234
4235 std::vector<FileSys::RegisteredCache*> content_providers;
4236 if (bis_contents) {
4237 content_providers.push_back(bis_contents);
4238 }
4239 if (user_contents) {
4240 content_providers.push_back(user_contents);
4241 }
4242
4243 // Get associated NCA files.
4244 std::vector<FileSys::VirtualFile> nca_files;
4245
4246 // Get all installed IDs.
4247 for (auto nca_provider : content_providers) {
4248 const auto entries = nca_provider->ListEntriesFilter();
4249
4250 for (const auto& entry : entries) {
4251 auto nca_file = nca_provider->GetEntryRaw(entry.title_id, entry.type);
4252 if (!nca_file) {
4253 continue;
4254 }
4255
4256 total_size += nca_file->GetSize();
4257 nca_files.push_back(std::move(nca_file));
4258 }
4259 }
4260
4261 // Using the NCA loader, determine if all NCAs are valid.
4262 for (auto& nca_file : nca_files) {
4263 Loader::AppLoader_NCA nca_loader(nca_file);
4264
4265 auto status = nca_loader.VerifyIntegrity(QtProgressCallback);
4266 if (progress.wasCanceled()) {
4267 break;
4268 }
4269 if (status != Loader::ResultStatus::Success) {
4270 FileSys::NCA nca(nca_file);
4271 const auto title_id = nca.GetTitleId();
4272 std::string title_name = "unknown";
4273
4274 const auto control = provider->GetEntry(FileSys::GetBaseTitleID(title_id),
4275 FileSys::ContentRecordType::Control);
4276 if (control && control->GetStatus() == Loader::ResultStatus::Success) {
4277 const FileSys::PatchManager pm{title_id, system->GetFileSystemController(),
4278 *provider};
4279 const auto [nacp, logo] = pm.ParseControlNCA(*control);
4280 if (nacp) {
4281 title_name = nacp->GetApplicationName();
4282 }
4283 }
4284
4285 if (title_id > 0) {
4286 failed.push_back(
4287 fmt::format("{} ({:016X}) ({})", nca_file->GetName(), title_id, title_name));
4288 } else {
4289 failed.push_back(fmt::format("{} (unknown)", nca_file->GetName()));
4290 }
4291 }
4292
4293 processed_size += nca_file->GetSize();
4294 }
4295
4296 progress.close(); 4125 progress.close();
4297 4126
4298 if (failed.size() > 0) { 4127 if (result.empty()) {
4299 auto failed_names = QString::fromStdString(fmt::format("{}", fmt::join(failed, "\n"))); 4128 QMessageBox::information(this, tr("Integrity verification succeeded!"),
4129 tr("The operation completed successfully."));
4130 } else {
4131 const auto failed_names =
4132 QString::fromStdString(fmt::format("{}", fmt::join(result, "\n")));
4300 QMessageBox::critical( 4133 QMessageBox::critical(
4301 this, tr("Integrity verification failed!"), 4134 this, tr("Integrity verification failed!"),
4302 tr("Verification failed for the following files:\n\n%1").arg(failed_names)); 4135 tr("Verification failed for the following files:\n\n%1").arg(failed_names));
4303 } else {
4304 QMessageBox::information(this, tr("Integrity verification succeeded!"),
4305 tr("The operation completed successfully."));
4306 } 4136 }
4307} 4137}
4308 4138
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 366e806d5..280fae5c3 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -16,6 +16,7 @@
16#include "common/announce_multiplayer_room.h" 16#include "common/announce_multiplayer_room.h"
17#include "common/common_types.h" 17#include "common/common_types.h"
18#include "configuration/qt_config.h" 18#include "configuration/qt_config.h"
19#include "frontend_common/content_manager.h"
19#include "input_common/drivers/tas_input.h" 20#include "input_common/drivers/tas_input.h"
20#include "yuzu/compatibility_list.h" 21#include "yuzu/compatibility_list.h"
21#include "yuzu/hotkeys.h" 22#include "yuzu/hotkeys.h"
@@ -124,13 +125,6 @@ enum class EmulatedDirectoryTarget {
124 SDMC, 125 SDMC,
125}; 126};
126 127
127enum class InstallResult {
128 Success,
129 Overwrite,
130 Failure,
131 BaseInstallAttempted,
132};
133
134enum class ReinitializeKeyBehavior { 128enum class ReinitializeKeyBehavior {
135 NoWarning, 129 NoWarning,
136 Warning, 130 Warning,
@@ -427,8 +421,7 @@ private:
427 void RemoveCacheStorage(u64 program_id); 421 void RemoveCacheStorage(u64 program_id);
428 bool SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id, 422 bool SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id,
429 u64* selected_title_id, u8* selected_content_record_type); 423 u64* selected_title_id, u8* selected_content_record_type);
430 InstallResult InstallNSP(const QString& filename); 424 ContentManager::InstallResult InstallNCA(const QString& filename);
431 InstallResult InstallNCA(const QString& filename);
432 void MigrateConfigFiles(); 425 void MigrateConfigFiles();
433 void UpdateWindowTitle(std::string_view title_name = {}, std::string_view title_version = {}, 426 void UpdateWindowTitle(std::string_view title_name = {}, std::string_view title_version = {},
434 std::string_view gpu_vendor = {}); 427 std::string_view gpu_vendor = {});
@@ -523,6 +516,8 @@ private:
523 std::unique_ptr<EmuThread> emu_thread; 516 std::unique_ptr<EmuThread> emu_thread;
524 // The path to the game currently running 517 // The path to the game currently running
525 QString current_game_path; 518 QString current_game_path;
519 // Whether a user was set on the command line (skips UserSelector if it's forced to show up)
520 bool user_flag_cmd_line = false;
526 521
527 bool auto_paused = false; 522 bool auto_paused = false;
528 bool auto_muted = false; 523 bool auto_muted = false;