diff options
Diffstat (limited to 'src')
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 | |||
| 21 | import org.yuzu.yuzu_emu.utils.FileUtil | 21 | import org.yuzu.yuzu_emu.utils.FileUtil |
| 22 | import org.yuzu.yuzu_emu.utils.Log | 22 | import org.yuzu.yuzu_emu.utils.Log |
| 23 | import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable | 23 | import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable |
| 24 | import org.yuzu.yuzu_emu.model.InstallResult | ||
| 25 | import org.yuzu.yuzu_emu.model.Patch | ||
| 26 | import 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 | |||
| 6 | import android.view.LayoutInflater | 6 | import android.view.LayoutInflater |
| 7 | import android.view.ViewGroup | 7 | import android.view.ViewGroup |
| 8 | import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding | 8 | import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding |
| 9 | import org.yuzu.yuzu_emu.model.Addon | 9 | import org.yuzu.yuzu_emu.model.Patch |
| 10 | import org.yuzu.yuzu_emu.model.AddonViewModel | ||
| 10 | import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder | 11 | import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder |
| 11 | 12 | ||
| 12 | class AddonAdapter : AbstractDiffAdapter<Addon, AddonAdapter.AddonViewHolder>() { | 13 | class 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 | ||
| 4 | package org.yuzu.yuzu_emu.adapters | 4 | package org.yuzu.yuzu_emu.adapters |
| 5 | 5 | ||
| 6 | import android.content.Intent | ||
| 7 | import android.graphics.Bitmap | ||
| 8 | import android.graphics.drawable.LayerDrawable | ||
| 9 | import android.net.Uri | 6 | import android.net.Uri |
| 10 | import android.text.TextUtils | 7 | import android.text.TextUtils |
| 11 | import android.view.LayoutInflater | 8 | import android.view.LayoutInflater |
| @@ -15,10 +12,6 @@ import android.widget.Toast | |||
| 15 | import androidx.appcompat.app.AppCompatActivity | 12 | import androidx.appcompat.app.AppCompatActivity |
| 16 | import androidx.core.content.pm.ShortcutInfoCompat | 13 | import androidx.core.content.pm.ShortcutInfoCompat |
| 17 | import androidx.core.content.pm.ShortcutManagerCompat | 14 | import androidx.core.content.pm.ShortcutManagerCompat |
| 18 | import androidx.core.content.res.ResourcesCompat | ||
| 19 | import androidx.core.graphics.drawable.IconCompat | ||
| 20 | import androidx.core.graphics.drawable.toBitmap | ||
| 21 | import androidx.core.graphics.drawable.toDrawable | ||
| 22 | import androidx.documentfile.provider.DocumentFile | 15 | import androidx.documentfile.provider.DocumentFile |
| 23 | import androidx.lifecycle.ViewModelProvider | 16 | import androidx.lifecycle.ViewModelProvider |
| 24 | import androidx.lifecycle.lifecycleScope | 17 | import androidx.lifecycle.lifecycleScope |
| @@ -30,7 +23,6 @@ import kotlinx.coroutines.withContext | |||
| 30 | import org.yuzu.yuzu_emu.HomeNavigationDirections | 23 | import org.yuzu.yuzu_emu.HomeNavigationDirections |
| 31 | import org.yuzu.yuzu_emu.R | 24 | import org.yuzu.yuzu_emu.R |
| 32 | import org.yuzu.yuzu_emu.YuzuApplication | 25 | import org.yuzu.yuzu_emu.YuzuApplication |
| 33 | import org.yuzu.yuzu_emu.activities.EmulationActivity | ||
| 34 | import org.yuzu.yuzu_emu.databinding.CardGameBinding | 26 | import org.yuzu.yuzu_emu.databinding.CardGameBinding |
| 35 | import org.yuzu.yuzu_emu.model.Game | 27 | import org.yuzu.yuzu_emu.model.Game |
| 36 | import org.yuzu.yuzu_emu.model.GamesViewModel | 28 | import 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 | |||
| 21 | import androidx.navigation.findNavController | 21 | import androidx.navigation.findNavController |
| 22 | import androidx.navigation.fragment.navArgs | 22 | import androidx.navigation.fragment.navArgs |
| 23 | import com.google.android.material.transition.MaterialSharedAxis | 23 | import com.google.android.material.transition.MaterialSharedAxis |
| 24 | import org.yuzu.yuzu_emu.NativeLibrary | ||
| 24 | import org.yuzu.yuzu_emu.R | 25 | import org.yuzu.yuzu_emu.R |
| 25 | import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding | 26 | import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding |
| 27 | import org.yuzu.yuzu_emu.model.GameVerificationResult | ||
| 26 | import org.yuzu.yuzu_emu.model.HomeViewModel | 28 | import org.yuzu.yuzu_emu.model.HomeViewModel |
| 27 | import org.yuzu.yuzu_emu.utils.GameMetadata | 29 | import 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 @@ | |||
| 4 | package org.yuzu.yuzu_emu.fragments | 4 | package org.yuzu.yuzu_emu.fragments |
| 5 | 5 | ||
| 6 | import android.annotation.SuppressLint | 6 | import android.annotation.SuppressLint |
| 7 | import android.content.pm.ShortcutInfo | ||
| 8 | import android.content.pm.ShortcutManager | ||
| 7 | import android.os.Bundle | 9 | import android.os.Bundle |
| 8 | import android.text.TextUtils | 10 | import android.text.TextUtils |
| 9 | import android.view.LayoutInflater | 11 | import android.view.LayoutInflater |
| @@ -44,7 +46,6 @@ import org.yuzu.yuzu_emu.utils.FileUtil | |||
| 44 | import org.yuzu.yuzu_emu.utils.GameIconUtils | 46 | import org.yuzu.yuzu_emu.utils.GameIconUtils |
| 45 | import org.yuzu.yuzu_emu.utils.GpuDriverHelper | 47 | import org.yuzu.yuzu_emu.utils.GpuDriverHelper |
| 46 | import org.yuzu.yuzu_emu.utils.MemoryUtil | 48 | import org.yuzu.yuzu_emu.utils.MemoryUtil |
| 47 | import java.io.BufferedInputStream | ||
| 48 | import java.io.BufferedOutputStream | 49 | import java.io.BufferedOutputStream |
| 49 | import java.io.File | 50 | import 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 | |||
| 32 | import org.yuzu.yuzu_emu.HomeNavigationDirections | 32 | import org.yuzu.yuzu_emu.HomeNavigationDirections |
| 33 | import org.yuzu.yuzu_emu.NativeLibrary | 33 | import org.yuzu.yuzu_emu.NativeLibrary |
| 34 | import org.yuzu.yuzu_emu.R | 34 | import org.yuzu.yuzu_emu.R |
| 35 | import org.yuzu.yuzu_emu.YuzuApplication | ||
| 35 | import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter | 36 | import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter |
| 36 | import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding | 37 | import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding |
| 37 | import org.yuzu.yuzu_emu.features.DocumentProvider | 38 | import 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 | |||
| 34 | import org.yuzu.yuzu_emu.ui.main.MainActivity | 34 | import org.yuzu.yuzu_emu.ui.main.MainActivity |
| 35 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization | 35 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization |
| 36 | import org.yuzu.yuzu_emu.utils.FileUtil | 36 | import org.yuzu.yuzu_emu.utils.FileUtil |
| 37 | import java.io.BufferedInputStream | ||
| 38 | import java.io.BufferedOutputStream | 37 | import java.io.BufferedOutputStream |
| 39 | import java.io.File | 38 | import java.io.File |
| 40 | import java.math.BigInteger | 39 | import 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 | |||
| 23 | import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding | 23 | import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding |
| 24 | import org.yuzu.yuzu_emu.model.TaskViewModel | 24 | import org.yuzu.yuzu_emu.model.TaskViewModel |
| 25 | 25 | ||
| 26 | class IndeterminateProgressDialogFragment : DialogFragment() { | 26 | class 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 | |||
| 4 | package org.yuzu.yuzu_emu.model | ||
| 5 | |||
| 6 | data 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 | |||
| 15 | import java.util.concurrent.atomic.AtomicBoolean | 15 | import java.util.concurrent.atomic.AtomicBoolean |
| 16 | 16 | ||
| 17 | class AddonViewModel : ViewModel() { | 17 | class 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 | ||
| 4 | package org.yuzu.yuzu_emu.model | 4 | package org.yuzu.yuzu_emu.model |
| 5 | 5 | ||
| 6 | import android.content.Intent | ||
| 6 | import android.net.Uri | 7 | import android.net.Uri |
| 7 | import android.os.Parcelable | 8 | import android.os.Parcelable |
| 8 | import java.util.HashSet | 9 | import java.util.HashSet |
| @@ -11,6 +12,7 @@ import kotlinx.serialization.Serializable | |||
| 11 | import org.yuzu.yuzu_emu.NativeLibrary | 12 | import org.yuzu.yuzu_emu.NativeLibrary |
| 12 | import org.yuzu.yuzu_emu.R | 13 | import org.yuzu.yuzu_emu.R |
| 13 | import org.yuzu.yuzu_emu.YuzuApplication | 14 | import org.yuzu.yuzu_emu.YuzuApplication |
| 15 | import org.yuzu.yuzu_emu.activities.EmulationActivity | ||
| 14 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization | 16 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization |
| 15 | import org.yuzu.yuzu_emu.utils.FileUtil | 17 | import org.yuzu.yuzu_emu.utils.FileUtil |
| 16 | import java.time.LocalDateTime | 18 | import 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 | |||
| 4 | package org.yuzu.yuzu_emu.model | ||
| 5 | |||
| 6 | enum 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 | |||
| 4 | package org.yuzu.yuzu_emu.model | ||
| 5 | |||
| 6 | enum 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 | |||
| 4 | package org.yuzu.yuzu_emu.model | ||
| 5 | |||
| 6 | import androidx.annotation.Keep | ||
| 7 | |||
| 8 | @Keep | ||
| 9 | data 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 | |||
| 4 | package org.yuzu.yuzu_emu.model | ||
| 5 | |||
| 6 | enum 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 | |||
| 8 | import kotlinx.coroutines.Dispatchers | 8 | import kotlinx.coroutines.Dispatchers |
| 9 | import kotlinx.coroutines.flow.MutableStateFlow | 9 | import kotlinx.coroutines.flow.MutableStateFlow |
| 10 | import kotlinx.coroutines.flow.StateFlow | 10 | import kotlinx.coroutines.flow.StateFlow |
| 11 | import kotlinx.coroutines.flow.asStateFlow | ||
| 11 | import kotlinx.coroutines.launch | 12 | import kotlinx.coroutines.launch |
| 12 | 13 | ||
| 13 | class TaskViewModel : ViewModel() { | 14 | class 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 | |||
| 38 | import org.yuzu.yuzu_emu.databinding.ActivityMainBinding | 38 | import org.yuzu.yuzu_emu.databinding.ActivityMainBinding |
| 39 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 39 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 40 | import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment | 40 | import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment |
| 41 | import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment | 41 | import org.yuzu.yuzu_emu.fragments.ProgressDialogFragment |
| 42 | import org.yuzu.yuzu_emu.fragments.MessageDialogFragment | 42 | import org.yuzu.yuzu_emu.fragments.MessageDialogFragment |
| 43 | import org.yuzu.yuzu_emu.model.AddonViewModel | 43 | import org.yuzu.yuzu_emu.model.AddonViewModel |
| 44 | import org.yuzu.yuzu_emu.model.DriverViewModel | 44 | import org.yuzu.yuzu_emu.model.DriverViewModel |
| 45 | import org.yuzu.yuzu_emu.model.GamesViewModel | 45 | import org.yuzu.yuzu_emu.model.GamesViewModel |
| 46 | import org.yuzu.yuzu_emu.model.HomeViewModel | 46 | import org.yuzu.yuzu_emu.model.HomeViewModel |
| 47 | import org.yuzu.yuzu_emu.model.InstallResult | ||
| 47 | import org.yuzu.yuzu_emu.model.TaskState | 48 | import org.yuzu.yuzu_emu.model.TaskState |
| 48 | import org.yuzu.yuzu_emu.model.TaskViewModel | 49 | import org.yuzu.yuzu_emu.model.TaskViewModel |
| 49 | import org.yuzu.yuzu_emu.utils.* | 50 | import 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 | |||
| 7 | import android.net.Uri | 7 | import android.net.Uri |
| 8 | import android.provider.DocumentsContract | 8 | import android.provider.DocumentsContract |
| 9 | import androidx.documentfile.provider.DocumentFile | 9 | import androidx.documentfile.provider.DocumentFile |
| 10 | import kotlinx.coroutines.flow.StateFlow | ||
| 11 | import java.io.BufferedInputStream | 10 | import java.io.BufferedInputStream |
| 12 | import java.io.File | 11 | import java.io.File |
| 13 | import java.io.IOException | 12 | import java.io.IOException |
| @@ -19,6 +18,7 @@ import org.yuzu.yuzu_emu.YuzuApplication | |||
| 19 | import org.yuzu.yuzu_emu.model.MinimalDocumentFile | 18 | import org.yuzu.yuzu_emu.model.MinimalDocumentFile |
| 20 | import org.yuzu.yuzu_emu.model.TaskState | 19 | import org.yuzu.yuzu_emu.model.TaskState |
| 21 | import java.io.BufferedOutputStream | 20 | import java.io.BufferedOutputStream |
| 21 | import java.io.OutputStream | ||
| 22 | import java.lang.NullPointerException | 22 | import java.lang.NullPointerException |
| 23 | import java.nio.charset.StandardCharsets | 23 | import java.nio.charset.StandardCharsets |
| 24 | import java.util.zip.Deflater | 24 | import 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 | ||
| 6 | import android.graphics.Bitmap | 6 | import android.graphics.Bitmap |
| 7 | import android.graphics.BitmapFactory | 7 | import android.graphics.BitmapFactory |
| 8 | import android.graphics.drawable.LayerDrawable | ||
| 8 | import android.widget.ImageView | 9 | import android.widget.ImageView |
| 10 | import androidx.core.content.res.ResourcesCompat | ||
| 11 | import androidx.core.graphics.drawable.IconCompat | ||
| 9 | import androidx.core.graphics.drawable.toBitmap | 12 | import androidx.core.graphics.drawable.toBitmap |
| 10 | import androidx.core.graphics.drawable.toDrawable | 13 | import androidx.core.graphics.drawable.toDrawable |
| 11 | import androidx.lifecycle.LifecycleOwner | 14 | import 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 | ||
| 6 | import android.net.Uri | 6 | import android.net.Uri |
| 7 | import android.os.Build | 7 | import android.os.Build |
| 8 | import java.io.BufferedInputStream | ||
| 9 | import java.io.File | 8 | import java.io.File |
| 10 | import java.io.IOException | 9 | import java.io.IOException |
| 11 | import org.yuzu.yuzu_emu.NativeLibrary | 10 | import 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) { | |||
| 42 | jobject ToJDouble(JNIEnv* env, double value) { | 42 | jobject 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 | |||
| 46 | s32 GetJInteger(JNIEnv* env, jobject jinteger) { | ||
| 47 | return env->GetIntField(jinteger, IDCache::GetIntegerValueField()); | ||
| 48 | } | ||
| 49 | |||
| 50 | jobject ToJInteger(JNIEnv* env, s32 value) { | ||
| 51 | return env->NewObject(IDCache::GetIntegerClass(), IDCache::GetIntegerConstructor(), value); | ||
| 52 | } | ||
| 53 | |||
| 54 | bool GetJBoolean(JNIEnv* env, jobject jboolean) { | ||
| 55 | return env->GetBooleanField(jboolean, IDCache::GetBooleanValueField()); | ||
| 56 | } | ||
| 57 | |||
| 58 | jobject 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 | ||
| 10 | std::string GetJString(JNIEnv* env, jstring jstr); | 11 | std::string GetJString(JNIEnv* env, jstring jstr); |
| 11 | jstring ToJString(JNIEnv* env, std::string_view str); | 12 | jstring ToJString(JNIEnv* env, std::string_view str); |
| @@ -13,3 +14,9 @@ jstring ToJString(JNIEnv* env, std::u16string_view str); | |||
| 13 | 14 | ||
| 14 | double GetJDouble(JNIEnv* env, jobject jdouble); | 15 | double GetJDouble(JNIEnv* env, jobject jdouble); |
| 15 | jobject ToJDouble(JNIEnv* env, double value); | 16 | jobject ToJDouble(JNIEnv* env, double value); |
| 17 | |||
| 18 | s32 GetJInteger(JNIEnv* env, jobject jinteger); | ||
| 19 | jobject ToJInteger(JNIEnv* env, s32 value); | ||
| 20 | |||
| 21 | bool GetJBoolean(JNIEnv* env, jobject jboolean); | ||
| 22 | jobject 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 | ||
| 68 | extern Values values; | 69 | extern 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; | |||
| 43 | static jfieldID s_overlay_control_data_portrait_position_field; | 43 | static jfieldID s_overlay_control_data_portrait_position_field; |
| 44 | static jfieldID s_overlay_control_data_foldable_position_field; | 44 | static jfieldID s_overlay_control_data_foldable_position_field; |
| 45 | 45 | ||
| 46 | static jclass s_patch_class; | ||
| 47 | static jmethodID s_patch_constructor; | ||
| 48 | static jfieldID s_patch_enabled_field; | ||
| 49 | static jfieldID s_patch_name_field; | ||
| 50 | static jfieldID s_patch_version_field; | ||
| 51 | static jfieldID s_patch_type_field; | ||
| 52 | static jfieldID s_patch_program_id_field; | ||
| 53 | static jfieldID s_patch_title_id_field; | ||
| 54 | |||
| 46 | static jclass s_double_class; | 55 | static jclass s_double_class; |
| 47 | static jmethodID s_double_constructor; | 56 | static jmethodID s_double_constructor; |
| 48 | static jfieldID s_double_value_field; | 57 | static jfieldID s_double_value_field; |
| 49 | 58 | ||
| 59 | static jclass s_integer_class; | ||
| 60 | static jmethodID s_integer_constructor; | ||
| 61 | static jfieldID s_integer_value_field; | ||
| 62 | |||
| 63 | static jclass s_boolean_class; | ||
| 64 | static jmethodID s_boolean_constructor; | ||
| 65 | static jfieldID s_boolean_value_field; | ||
| 66 | |||
| 50 | static constexpr jint JNI_VERSION = JNI_VERSION_1_6; | 67 | static constexpr jint JNI_VERSION = JNI_VERSION_1_6; |
| 51 | 68 | ||
| 52 | namespace IDCache { | 69 | namespace 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 | ||
| 206 | jclass GetPatchClass() { | ||
| 207 | return s_patch_class; | ||
| 208 | } | ||
| 209 | |||
| 210 | jmethodID GetPatchConstructor() { | ||
| 211 | return s_patch_constructor; | ||
| 212 | } | ||
| 213 | |||
| 214 | jfieldID GetPatchEnabledField() { | ||
| 215 | return s_patch_enabled_field; | ||
| 216 | } | ||
| 217 | |||
| 218 | jfieldID GetPatchNameField() { | ||
| 219 | return s_patch_name_field; | ||
| 220 | } | ||
| 221 | |||
| 222 | jfieldID GetPatchVersionField() { | ||
| 223 | return s_patch_version_field; | ||
| 224 | } | ||
| 225 | |||
| 226 | jfieldID GetPatchTypeField() { | ||
| 227 | return s_patch_type_field; | ||
| 228 | } | ||
| 229 | |||
| 230 | jfieldID GetPatchProgramIdField() { | ||
| 231 | return s_patch_program_id_field; | ||
| 232 | } | ||
| 233 | |||
| 234 | jfieldID GetPatchTitleIdField() { | ||
| 235 | return s_patch_title_id_field; | ||
| 236 | } | ||
| 237 | |||
| 189 | jclass GetDoubleClass() { | 238 | jclass 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 | ||
| 250 | jclass GetIntegerClass() { | ||
| 251 | return s_integer_class; | ||
| 252 | } | ||
| 253 | |||
| 254 | jmethodID GetIntegerConstructor() { | ||
| 255 | return s_integer_constructor; | ||
| 256 | } | ||
| 257 | |||
| 258 | jfieldID GetIntegerValueField() { | ||
| 259 | return s_integer_value_field; | ||
| 260 | } | ||
| 261 | |||
| 262 | jclass GetBooleanClass() { | ||
| 263 | return s_boolean_class; | ||
| 264 | } | ||
| 265 | |||
| 266 | jmethodID GetBooleanConstructor() { | ||
| 267 | return s_boolean_constructor; | ||
| 268 | } | ||
| 269 | |||
| 270 | jfieldID 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(); | |||
| 43 | jfieldID GetOverlayControlDataPortraitPositionField(); | 43 | jfieldID GetOverlayControlDataPortraitPositionField(); |
| 44 | jfieldID GetOverlayControlDataFoldablePositionField(); | 44 | jfieldID GetOverlayControlDataFoldablePositionField(); |
| 45 | 45 | ||
| 46 | jclass GetPatchClass(); | ||
| 47 | jmethodID GetPatchConstructor(); | ||
| 48 | jfieldID GetPatchEnabledField(); | ||
| 49 | jfieldID GetPatchNameField(); | ||
| 50 | jfieldID GetPatchVersionField(); | ||
| 51 | jfieldID GetPatchTypeField(); | ||
| 52 | jfieldID GetPatchProgramIdField(); | ||
| 53 | jfieldID GetPatchTitleIdField(); | ||
| 54 | |||
| 46 | jclass GetDoubleClass(); | 55 | jclass GetDoubleClass(); |
| 47 | jmethodID GetDoubleConstructor(); | 56 | jmethodID GetDoubleConstructor(); |
| 48 | jfieldID GetDoubleValueField(); | 57 | jfieldID GetDoubleValueField(); |
| 49 | 58 | ||
| 59 | jclass GetIntegerClass(); | ||
| 60 | jmethodID GetIntegerConstructor(); | ||
| 61 | jfieldID GetIntegerValueField(); | ||
| 62 | |||
| 63 | jclass GetBooleanClass(); | ||
| 64 | jmethodID GetBooleanConstructor(); | ||
| 65 | jfieldID 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 | ||
| 103 | int 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 | |||
| 164 | void EmulationSession::InitializeGpuDriver(const std::string& hook_lib_dir, | 104 | void 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 | ||
| 514 | int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, | 454 | int 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 | ||
| 521 | jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, | 471 | jboolean 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 | ||
| 827 | jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAddonsForFile(JNIEnv* env, jobject jobj, | 777 | jobjectArray 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 | |||
| 812 | void 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 | |||
| 819 | void 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 | |||
| 825 | void 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 | |||
| 832 | jobject 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 | |||
| 854 | jint 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 | ||
| 862 | jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, | 869 | jstring 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">اختر مل٠<b>prod.keys</b> من الزر ادناه</string> | 16 | <string name="keys_description">اختر مل٠<b>prod.keys</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">اختر مجلد <b>العابك</b> من الزر ادناه.</string> | 19 | <string name="games_description">ØØ¯Ø¯ مجلد <b>العابك</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.<br /><br />Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string> | 4 | <string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string> |
| 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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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) <b>Games</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 <b>prod.keys</b> con il pulsante in basso.</string> | 17 | <string name="keys_description">Seleziona il tuo file <b>prod.keys</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 <b>Games</b> con il pulsante in basso.</string> | 20 | <string name="games_description">Seleziona la cartella dei <b>giochi</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. <br /><br />Antes de começar, por favor localize o arquivo <![CDATA[1 prod.keys 1]]> no armazenamento de seu dispositivo.<br /><br /><![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.<br /><br />Antes de começar, por favor localize o arquivo <![CDATA[<b> prod.keys </b>]]> no armazenamento de seu dispositivo.<br /><br /><![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 <b>prod.keys</b> com o botão abaixo.</string> | 17 | <string name="keys_description">Selecione seu arquivo <b>prod.keys</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 <b>Jogos</b> com o botão abaixo.</string> | 20 | <string name="games_description">Selecione sua pasta <b>Jogos</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, | |||
| 37 | template <typename FileStream, typename Path> | 37 | template <typename FileStream, typename Path> |
| 38 | void OpenFileStream(FileStream& file_stream, const Path& path, std::ios_base::openmode open_mode) { | 38 | void 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 | ||
| 469 | PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile update_raw) const { | 469 | std::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; | |||
| 26 | class NCA; | 26 | class NCA; |
| 27 | class NACP; | 27 | class NACP; |
| 28 | 28 | ||
| 29 | enum class PatchType { Update, DLC, Mod }; | ||
| 30 | |||
| 31 | struct 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. |
| 30 | class PatchManager { | 41 | class PatchManager { |
| 31 | public: | 42 | public: |
| 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 | ||
| 16 | namespace Service::Account { | 17 | namespace 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) | ||
| 169 | std::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:* |
| 168 | bool ProfileManager::GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const { | 185 | bool 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 | ||
| 32 | namespace Service::HID { | 36 | namespace 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 | ||
| 48 | private: | 52 | private: |
| 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) { | |||
| 1492 | void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) { | 1523 | void 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 | ||
| 1600 | void IHidServer::CreateActiveVibrationDeviceList(HLERequestContext& ctx) { | 1603 | void 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 | ||
| 1622 | void IHidServer::IsVibrationPermitted(HLERequestContext& ctx) { | 1625 | void 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 | ||
| 1633 | void IHidServer::SendVibrationValues(HLERequestContext& ctx) { | 1638 | void 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 | ||
| 1657 | void IHidServer::SendVibrationGcErmCommand(HLERequestContext& ctx) { | 1671 | void 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 | ||
| 1718 | void IHidServer::GetActualVibrationGcErmCommand(HLERequestContext& ctx) { | 1710 | void 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 | ||
| 1772 | void IHidServer::EndPermitVibrationSession(HLERequestContext& ctx) { | 1764 | void 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 | ||
| 1781 | void IHidServer::IsVibrationDeviceMounted(HLERequestContext& ctx) { | 1774 | void 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 | |||
| 1808 | void 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 | ||
| 1804 | void IHidServer::ActivateConsoleSixAxisSensor(HLERequestContext& ctx) { | 1848 | void 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 | |||
| 542 | void 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 | ||
| 626 | void 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 | |||
| 640 | void 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 | |||
| 653 | void 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 | |||
| 667 | void 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 | |||
| 604 | void IHidSystemServer::IsJoyConAttachedOnAllRail(HLERequestContext& ctx) { | 677 | void 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 | ||
| 825 | void 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 | |||
| 752 | void IHidSystemServer::IsUsingCustomButtonConfig(HLERequestContext& ctx) { | 838 | void 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 | ||
| 179 | void Nvnflinger::OpenLayer(u64 layer_id) { | 177 | bool 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 | ||
| 189 | void Nvnflinger::CloseLayer(u64 layer_id) { | 189 | bool 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 | ||
| 199 | void Nvnflinger::DestroyLayer(u64 layer_id) { | 201 | void 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 | |||
| 14 | namespace Service::Set { | ||
| 15 | |||
| 16 | /// This is nn::settings::system::InitialLaunchFlag | ||
| 17 | struct 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 | }; | ||
| 26 | static_assert(sizeof(InitialLaunchFlag) == 4, "InitialLaunchFlag is an invalid size"); | ||
| 27 | |||
| 28 | /// This is nn::settings::system::InitialLaunchSettings | ||
| 29 | struct InitialLaunchSettings { | ||
| 30 | InitialLaunchFlag flags; | ||
| 31 | INSERT_PADDING_BYTES(0x4); | ||
| 32 | Service::Time::Clock::SteadyClockTimePoint timestamp; | ||
| 33 | }; | ||
| 34 | static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size"); | ||
| 35 | |||
| 36 | #pragma pack(push, 4) | ||
| 37 | struct InitialLaunchSettingsPacked { | ||
| 38 | InitialLaunchFlag flags; | ||
| 39 | Service::Time::Clock::SteadyClockTimePoint timestamp; | ||
| 40 | }; | ||
| 41 | #pragma pack(pop) | ||
| 42 | static_assert(sizeof(InitialLaunchSettingsPacked) == 0x1C, | ||
| 43 | "InitialLaunchSettingsPacked is incorrect size"); | ||
| 44 | |||
| 45 | struct 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 | }; | ||
| 64 | static_assert(offsetof(PrivateSettings, initial_launch_settings) == 0x10); | ||
| 65 | static_assert(offsetof(PrivateSettings, external_clock_source_id) == 0x50); | ||
| 66 | static_assert(offsetof(PrivateSettings, reserved_70) == 0x70); | ||
| 67 | static_assert(offsetof(PrivateSettings, platform_region) == 0xD0); | ||
| 68 | static_assert(sizeof(PrivateSettings) == 0xD8, "PrivateSettings has the wrong size!"); | ||
| 69 | |||
| 70 | PrivateSettings 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 | ||
| 6 | namespace Service::Set { | 6 | namespace Service::Set { |
| 7 | 7 | ||
| 8 | ApplnSettings DefaultApplnSettings() { | 8 | ApplnSettings 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 | ||
| 11 | namespace Service::Set { | 13 | namespace Service::Set { |
| 12 | struct ApplnSettings { | 14 | struct 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 | }; |
| 29 | static_assert(offsetof(ApplnSettings, mii_author_id) == 0x10); | 28 | static_assert(offsetof(ApplnSettings, mii_author_id) == 0x10); |
| 30 | static_assert(offsetof(ApplnSettings, service_discovery_control_settings) == 0x50); | 29 | static_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 | ||
| 6 | namespace Service::Set { | 6 | namespace 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 | ||
| 11 | namespace Service::Set { | 13 | namespace Service::Set { |
| 12 | struct DeviceSettings { | 14 | struct 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 | ||
| 6 | namespace Service::Set { | 6 | namespace 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 | |||
| 13 | namespace Service::Set { | ||
| 14 | |||
| 15 | struct 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 | }; | ||
| 30 | static_assert(offsetof(PrivateSettings, initial_launch_settings) == 0x10); | ||
| 31 | static_assert(offsetof(PrivateSettings, external_clock_source_id) == 0x50); | ||
| 32 | static_assert(offsetof(PrivateSettings, shutdown_rtc_value) == 0x60); | ||
| 33 | static_assert(offsetof(PrivateSettings, external_steady_clock_internal_offset) == 0x68); | ||
| 34 | static_assert(offsetof(PrivateSettings, platform_region) == 0xD0); | ||
| 35 | static_assert(sizeof(PrivateSettings) == 0xD8, "PrivateSettings has the wrong size!"); | ||
| 36 | |||
| 37 | PrivateSettings 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 | ||
| 6 | namespace Service::Set { | 6 | namespace 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 | ||
| 14 | namespace Service::Set { | 17 | namespace Service::Set { |
| 15 | 18 | ||
| 16 | /// This is "nn::settings::LanguageCode", which is a NUL-terminated string stored in a u64. | ||
| 17 | enum 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 | ||
| 39 | enum class ErrorReportSharePermission : u32 { | ||
| 40 | NotConfirmed, | ||
| 41 | Granted, | ||
| 42 | Denied, | ||
| 43 | }; | ||
| 44 | |||
| 45 | /// This is nn::settings::system::ChineseTraditionalInputMethod | ||
| 46 | enum class ChineseTraditionalInputMethod : u32 { | ||
| 47 | Unknown0 = 0, | ||
| 48 | Unknown1 = 1, | ||
| 49 | Unknown2 = 2, | ||
| 50 | }; | ||
| 51 | |||
| 52 | /// This is nn::settings::system::HomeMenuScheme | ||
| 53 | struct HomeMenuScheme { | ||
| 54 | u32 main; | ||
| 55 | u32 back; | ||
| 56 | u32 sub; | ||
| 57 | u32 bezel; | ||
| 58 | u32 extra; | ||
| 59 | }; | ||
| 60 | static_assert(sizeof(HomeMenuScheme) == 0x14, "HomeMenuScheme is incorrect size"); | ||
| 61 | |||
| 62 | /// Indicates the current theme set by the system settings | ||
| 63 | enum class ColorSet : u32 { | ||
| 64 | BasicWhite = 0, | ||
| 65 | BasicBlack = 1, | ||
| 66 | }; | ||
| 67 | |||
| 68 | /// Indicates the current console is a retail or kiosk unit | ||
| 69 | enum class QuestFlag : u8 { | ||
| 70 | Retail = 0, | ||
| 71 | Kiosk = 1, | ||
| 72 | }; | ||
| 73 | |||
| 74 | /// This is nn::settings::system::RegionCode | ||
| 75 | enum class RegionCode : u32 { | ||
| 76 | Japan, | ||
| 77 | Usa, | ||
| 78 | Europe, | ||
| 79 | Australia, | ||
| 80 | HongKongTaiwanKorea, | ||
| 81 | China, | ||
| 82 | }; | ||
| 83 | |||
| 84 | /// This is nn::settings::system::AccountSettings | ||
| 85 | struct AccountSettings { | ||
| 86 | u32 flags; | ||
| 87 | }; | ||
| 88 | static_assert(sizeof(AccountSettings) == 4, "AccountSettings is an invalid size"); | ||
| 89 | |||
| 90 | /// This is nn::settings::system::NotificationVolume | ||
| 91 | enum class NotificationVolume : u32 { | ||
| 92 | Mute, | ||
| 93 | Low, | ||
| 94 | High, | ||
| 95 | }; | ||
| 96 | |||
| 97 | /// This is nn::settings::system::NotificationFlag | ||
| 98 | struct 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 | }; | ||
| 108 | static_assert(sizeof(NotificationFlag) == 4, "NotificationFlag is an invalid size"); | ||
| 109 | |||
| 110 | /// This is nn::settings::system::NotificationTime | ||
| 111 | struct NotificationTime { | ||
| 112 | u32 hour; | ||
| 113 | u32 minute; | ||
| 114 | }; | ||
| 115 | static_assert(sizeof(NotificationTime) == 0x8, "NotificationTime is an invalid size"); | ||
| 116 | |||
| 117 | /// This is nn::settings::system::NotificationSettings | ||
| 118 | struct NotificationSettings { | ||
| 119 | NotificationFlag flags; | ||
| 120 | NotificationVolume volume; | ||
| 121 | NotificationTime start_time; | ||
| 122 | NotificationTime stop_time; | ||
| 123 | }; | ||
| 124 | static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size"); | ||
| 125 | |||
| 126 | /// This is nn::settings::system::AccountNotificationFlag | ||
| 127 | struct 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 | }; | ||
| 136 | static_assert(sizeof(AccountNotificationFlag) == 4, "AccountNotificationFlag is an invalid size"); | ||
| 137 | |||
| 138 | /// This is nn::settings::system::FriendPresenceOverlayPermission | ||
| 139 | enum class FriendPresenceOverlayPermission : u8 { | ||
| 140 | NotConfirmed, | ||
| 141 | NoDisplay, | ||
| 142 | FavoriteFriends, | ||
| 143 | Friends, | ||
| 144 | }; | ||
| 145 | |||
| 146 | /// This is nn::settings::system::AccountNotificationSettings | ||
| 147 | struct AccountNotificationSettings { | ||
| 148 | Common::UUID uid; | ||
| 149 | AccountNotificationFlag flags; | ||
| 150 | FriendPresenceOverlayPermission friend_presence_permission; | ||
| 151 | FriendPresenceOverlayPermission friend_invitation_permission; | ||
| 152 | INSERT_PADDING_BYTES(0x2); | ||
| 153 | }; | ||
| 154 | static_assert(sizeof(AccountNotificationSettings) == 0x18, | ||
| 155 | "AccountNotificationSettings is an invalid size"); | ||
| 156 | |||
| 157 | /// This is nn::settings::system::TvFlag | ||
| 158 | struct 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 | }; | ||
| 168 | static_assert(sizeof(TvFlag) == 4, "TvFlag is an invalid size"); | ||
| 169 | |||
| 170 | /// This is nn::settings::system::TvResolution | ||
| 171 | enum class TvResolution : u32 { | ||
| 172 | Auto, | ||
| 173 | Resolution1080p, | ||
| 174 | Resolution720p, | ||
| 175 | Resolution480p, | ||
| 176 | }; | ||
| 177 | |||
| 178 | /// This is nn::settings::system::HdmiContentType | ||
| 179 | enum class HdmiContentType : u32 { | ||
| 180 | None, | ||
| 181 | Graphics, | ||
| 182 | Cinema, | ||
| 183 | Photo, | ||
| 184 | Game, | ||
| 185 | }; | ||
| 186 | |||
| 187 | /// This is nn::settings::system::RgbRange | ||
| 188 | enum class RgbRange : u32 { | ||
| 189 | Auto, | ||
| 190 | Full, | ||
| 191 | Limited, | ||
| 192 | }; | ||
| 193 | |||
| 194 | /// This is nn::settings::system::CmuMode | ||
| 195 | enum class CmuMode : u32 { | ||
| 196 | None, | ||
| 197 | ColorInvert, | ||
| 198 | HighContrast, | ||
| 199 | GrayScale, | ||
| 200 | }; | ||
| 201 | |||
| 202 | /// This is nn::settings::system::TvSettings | ||
| 203 | struct 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 | }; | ||
| 213 | static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size"); | ||
| 214 | |||
| 215 | /// This is nn::settings::system::PrimaryAlbumStorage | ||
| 216 | enum class PrimaryAlbumStorage : u32 { | ||
| 217 | Nand, | ||
| 218 | SdCard, | ||
| 219 | }; | ||
| 220 | |||
| 221 | /// This is nn::settings::system::HandheldSleepPlan | ||
| 222 | enum class HandheldSleepPlan : u32 { | ||
| 223 | Sleep1Min, | ||
| 224 | Sleep3Min, | ||
| 225 | Sleep5Min, | ||
| 226 | Sleep10Min, | ||
| 227 | Sleep30Min, | ||
| 228 | Never, | ||
| 229 | }; | ||
| 230 | |||
| 231 | /// This is nn::settings::system::ConsoleSleepPlan | ||
| 232 | enum class ConsoleSleepPlan : u32 { | ||
| 233 | Sleep1Hour, | ||
| 234 | Sleep2Hour, | ||
| 235 | Sleep3Hour, | ||
| 236 | Sleep6Hour, | ||
| 237 | Sleep12Hour, | ||
| 238 | Never, | ||
| 239 | }; | ||
| 240 | |||
| 241 | /// This is nn::settings::system::SleepFlag | ||
| 242 | struct SleepFlag { | ||
| 243 | union { | ||
| 244 | u32 raw{}; | ||
| 245 | |||
| 246 | BitField<0, 1, u32> SleepsWhilePlayingMedia; | ||
| 247 | BitField<1, 1, u32> WakesAtPowerStateChange; | ||
| 248 | }; | ||
| 249 | }; | ||
| 250 | static_assert(sizeof(SleepFlag) == 4, "TvFlag is an invalid size"); | ||
| 251 | |||
| 252 | /// This is nn::settings::system::SleepSettings | ||
| 253 | struct SleepSettings { | ||
| 254 | SleepFlag flags; | ||
| 255 | HandheldSleepPlan handheld_sleep_plan; | ||
| 256 | ConsoleSleepPlan console_sleep_plan; | ||
| 257 | }; | ||
| 258 | static_assert(sizeof(SleepSettings) == 0xc, "SleepSettings is incorrect size"); | ||
| 259 | |||
| 260 | /// This is nn::settings::system::EulaVersionClockType | ||
| 261 | enum class EulaVersionClockType : u32 { | ||
| 262 | NetworkSystemClock, | ||
| 263 | SteadyClock, | ||
| 264 | }; | ||
| 265 | |||
| 266 | /// This is nn::settings::system::EulaVersion | ||
| 267 | struct 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 | }; | ||
| 275 | static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size"); | ||
| 276 | |||
| 277 | struct SystemSettings { | 19 | struct 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 | ||
| 9 | namespace Core { | 9 | namespace Core { |
| 10 | class System; | 10 | class System; |
| 11 | } | 11 | } |
| 12 | 12 | ||
| 13 | namespace Service::Set { | 13 | namespace Service::Set { |
| 14 | enum 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 | |||
| 32 | constexpr 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 | |||
| 53 | static 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 | ||
| 74 | LanguageCode GetLanguageCodeFromIndex(std::size_t idx); | 15 | LanguageCode 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 | |||
| 14 | namespace Service::Set { | ||
| 15 | |||
| 16 | /// This is nn::settings::system::AudioOutputMode | ||
| 17 | enum 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 | ||
| 25 | enum class AudioOutputModeTarget : u32 { | ||
| 26 | Hdmi, | ||
| 27 | Speaker, | ||
| 28 | Headphone, | ||
| 29 | }; | ||
| 30 | |||
| 31 | /// This is nn::settings::system::AudioVolumeTarget | ||
| 32 | enum class AudioVolumeTarget : u32 { | ||
| 33 | Speaker, | ||
| 34 | Headphone, | ||
| 35 | }; | ||
| 36 | |||
| 37 | /// This is nn::settings::system::ClockSourceId | ||
| 38 | enum class ClockSourceId : u32 { | ||
| 39 | NetworkSystemClock, | ||
| 40 | SteadyClock, | ||
| 41 | }; | ||
| 42 | |||
| 43 | /// This is nn::settings::system::CmuMode | ||
| 44 | enum class CmuMode : u32 { | ||
| 45 | None, | ||
| 46 | ColorInvert, | ||
| 47 | HighContrast, | ||
| 48 | GrayScale, | ||
| 49 | }; | ||
| 50 | |||
| 51 | /// This is nn::settings::system::ChineseTraditionalInputMethod | ||
| 52 | enum class ChineseTraditionalInputMethod : u32 { | ||
| 53 | Unknown0 = 0, | ||
| 54 | Unknown1 = 1, | ||
| 55 | Unknown2 = 2, | ||
| 56 | }; | ||
| 57 | |||
| 58 | /// Indicates the current theme set by the system settings | ||
| 59 | enum class ColorSet : u32 { | ||
| 60 | BasicWhite = 0, | ||
| 61 | BasicBlack = 1, | ||
| 62 | }; | ||
| 63 | |||
| 64 | /// This is nn::settings::system::ConsoleSleepPlan | ||
| 65 | enum class ConsoleSleepPlan : u32 { | ||
| 66 | Sleep1Hour, | ||
| 67 | Sleep2Hour, | ||
| 68 | Sleep3Hour, | ||
| 69 | Sleep6Hour, | ||
| 70 | Sleep12Hour, | ||
| 71 | Never, | ||
| 72 | }; | ||
| 73 | |||
| 74 | /// This is nn::settings::system::ErrorReportSharePermission | ||
| 75 | enum class ErrorReportSharePermission : u32 { | ||
| 76 | NotConfirmed, | ||
| 77 | Granted, | ||
| 78 | Denied, | ||
| 79 | }; | ||
| 80 | |||
| 81 | /// This is nn::settings::system::EulaVersionClockType | ||
| 82 | enum class EulaVersionClockType : u32 { | ||
| 83 | NetworkSystemClock, | ||
| 84 | SteadyClock, | ||
| 85 | }; | ||
| 86 | |||
| 87 | /// This is nn::settings::factory::RegionCode | ||
| 88 | enum 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 | ||
| 99 | enum class FriendPresenceOverlayPermission : u8 { | ||
| 100 | NotConfirmed, | ||
| 101 | NoDisplay, | ||
| 102 | FavoriteFriends, | ||
| 103 | Friends, | ||
| 104 | }; | ||
| 105 | |||
| 106 | enum class GetFirmwareVersionType { | ||
| 107 | Version1, | ||
| 108 | Version2, | ||
| 109 | }; | ||
| 110 | |||
| 111 | /// This is nn::settings::system::HandheldSleepPlan | ||
| 112 | enum class HandheldSleepPlan : u32 { | ||
| 113 | Sleep1Min, | ||
| 114 | Sleep3Min, | ||
| 115 | Sleep5Min, | ||
| 116 | Sleep10Min, | ||
| 117 | Sleep30Min, | ||
| 118 | Never, | ||
| 119 | }; | ||
| 120 | |||
| 121 | /// This is nn::settings::system::HdmiContentType | ||
| 122 | enum class HdmiContentType : u32 { | ||
| 123 | None, | ||
| 124 | Graphics, | ||
| 125 | Cinema, | ||
| 126 | Photo, | ||
| 127 | Game, | ||
| 128 | }; | ||
| 129 | |||
| 130 | enum 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. | ||
| 149 | enum 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 | ||
| 171 | enum class NotificationVolume : u32 { | ||
| 172 | Mute, | ||
| 173 | Low, | ||
| 174 | High, | ||
| 175 | }; | ||
| 176 | |||
| 177 | /// This is nn::settings::system::PrimaryAlbumStorage | ||
| 178 | enum class PrimaryAlbumStorage : u32 { | ||
| 179 | Nand, | ||
| 180 | SdCard, | ||
| 181 | }; | ||
| 182 | |||
| 183 | /// Indicates the current console is a retail or kiosk unit | ||
| 184 | enum class QuestFlag : u8 { | ||
| 185 | Retail = 0, | ||
| 186 | Kiosk = 1, | ||
| 187 | }; | ||
| 188 | |||
| 189 | /// This is nn::settings::system::RgbRange | ||
| 190 | enum class RgbRange : u32 { | ||
| 191 | Auto, | ||
| 192 | Full, | ||
| 193 | Limited, | ||
| 194 | }; | ||
| 195 | |||
| 196 | /// This is nn::settings::system::RegionCode | ||
| 197 | enum class SystemRegionCode : u32 { | ||
| 198 | Japan, | ||
| 199 | Usa, | ||
| 200 | Europe, | ||
| 201 | Australia, | ||
| 202 | HongKongTaiwanKorea, | ||
| 203 | China, | ||
| 204 | }; | ||
| 205 | |||
| 206 | /// This is nn::settings::system::TouchScreenMode | ||
| 207 | enum class TouchScreenMode : u32 { | ||
| 208 | Stylus, | ||
| 209 | Standard, | ||
| 210 | }; | ||
| 211 | |||
| 212 | /// This is nn::settings::system::TvResolution | ||
| 213 | enum class TvResolution : u32 { | ||
| 214 | Auto, | ||
| 215 | Resolution1080p, | ||
| 216 | Resolution720p, | ||
| 217 | Resolution480p, | ||
| 218 | }; | ||
| 219 | |||
| 220 | constexpr 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 | |||
| 241 | static 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 | ||
| 263 | struct 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 | }; | ||
| 272 | static_assert(sizeof(AccountNotificationFlag) == 4, "AccountNotificationFlag is an invalid size"); | ||
| 273 | |||
| 274 | /// This is nn::settings::system::AccountSettings | ||
| 275 | struct AccountSettings { | ||
| 276 | u32 flags; | ||
| 277 | }; | ||
| 278 | static_assert(sizeof(AccountSettings) == 4, "AccountSettings is an invalid size"); | ||
| 279 | |||
| 280 | /// This is nn::settings::system::DataDeletionFlag | ||
| 281 | struct DataDeletionFlag { | ||
| 282 | union { | ||
| 283 | u32 raw{}; | ||
| 284 | |||
| 285 | BitField<0, 1, u32> AutomaticDeletionFlag; | ||
| 286 | }; | ||
| 287 | }; | ||
| 288 | static_assert(sizeof(DataDeletionFlag) == 4, "DataDeletionFlag is an invalid size"); | ||
| 289 | |||
| 290 | /// This is nn::settings::system::InitialLaunchFlag | ||
| 291 | struct 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 | }; | ||
| 300 | static_assert(sizeof(InitialLaunchFlag) == 4, "InitialLaunchFlag is an invalid size"); | ||
| 301 | |||
| 302 | /// This is nn::settings::system::SleepFlag | ||
| 303 | struct SleepFlag { | ||
| 304 | union { | ||
| 305 | u32 raw{}; | ||
| 306 | |||
| 307 | BitField<0, 1, u32> SleepsWhilePlayingMedia; | ||
| 308 | BitField<1, 1, u32> WakesAtPowerStateChange; | ||
| 309 | }; | ||
| 310 | }; | ||
| 311 | static_assert(sizeof(SleepFlag) == 4, "TvFlag is an invalid size"); | ||
| 312 | |||
| 313 | /// This is nn::settings::system::NotificationFlag | ||
| 314 | struct 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 | }; | ||
| 324 | static_assert(sizeof(NotificationFlag) == 4, "NotificationFlag is an invalid size"); | ||
| 325 | |||
| 326 | /// This is nn::settings::system::TvFlag | ||
| 327 | struct 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 | }; | ||
| 337 | static_assert(sizeof(TvFlag) == 4, "TvFlag is an invalid size"); | ||
| 338 | |||
| 339 | /// This is nn::settings::system::UserSelectorFlag | ||
| 340 | struct UserSelectorFlag { | ||
| 341 | union { | ||
| 342 | u32 raw{}; | ||
| 343 | |||
| 344 | BitField<0, 1, u32> SkipIfSingleUser; | ||
| 345 | BitField<31, 1, u32> Unknown; | ||
| 346 | }; | ||
| 347 | }; | ||
| 348 | static_assert(sizeof(UserSelectorFlag) == 4, "UserSelectorFlag is an invalid size"); | ||
| 349 | |||
| 350 | /// This is nn::settings::system::AccountNotificationSettings | ||
| 351 | struct AccountNotificationSettings { | ||
| 352 | Common::UUID uid; | ||
| 353 | AccountNotificationFlag flags; | ||
| 354 | FriendPresenceOverlayPermission friend_presence_permission; | ||
| 355 | FriendPresenceOverlayPermission friend_invitation_permission; | ||
| 356 | INSERT_PADDING_BYTES(0x2); | ||
| 357 | }; | ||
| 358 | static_assert(sizeof(AccountNotificationSettings) == 0x18, | ||
| 359 | "AccountNotificationSettings is an invalid size"); | ||
| 360 | |||
| 361 | /// This is nn::settings::system::EulaVersion | ||
| 362 | struct 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 | }; | ||
| 370 | static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size"); | ||
| 371 | |||
| 372 | struct 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 | }; | ||
| 385 | static_assert(sizeof(FirmwareVersionFormat) == 0x100, "FirmwareVersionFormat is an invalid size"); | ||
| 386 | |||
| 387 | /// This is nn::settings::system::HomeMenuScheme | ||
| 388 | struct HomeMenuScheme { | ||
| 389 | u32 main; | ||
| 390 | u32 back; | ||
| 391 | u32 sub; | ||
| 392 | u32 bezel; | ||
| 393 | u32 extra; | ||
| 394 | }; | ||
| 395 | static_assert(sizeof(HomeMenuScheme) == 0x14, "HomeMenuScheme is incorrect size"); | ||
| 396 | |||
| 397 | /// This is nn::settings::system::InitialLaunchSettings | ||
| 398 | struct InitialLaunchSettings { | ||
| 399 | InitialLaunchFlag flags; | ||
| 400 | INSERT_PADDING_BYTES(0x4); | ||
| 401 | Service::Time::Clock::SteadyClockTimePoint timestamp; | ||
| 402 | }; | ||
| 403 | static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size"); | ||
| 404 | |||
| 405 | #pragma pack(push, 4) | ||
| 406 | struct InitialLaunchSettingsPacked { | ||
| 407 | InitialLaunchFlag flags; | ||
| 408 | Service::Time::Clock::SteadyClockTimePoint timestamp; | ||
| 409 | }; | ||
| 410 | #pragma pack(pop) | ||
| 411 | static_assert(sizeof(InitialLaunchSettingsPacked) == 0x1C, | ||
| 412 | "InitialLaunchSettingsPacked is incorrect size"); | ||
| 413 | |||
| 414 | /// This is nn::settings::system::NotificationTime | ||
| 415 | struct NotificationTime { | ||
| 416 | u32 hour; | ||
| 417 | u32 minute; | ||
| 418 | }; | ||
| 419 | static_assert(sizeof(NotificationTime) == 0x8, "NotificationTime is an invalid size"); | ||
| 420 | |||
| 421 | /// This is nn::settings::system::NotificationSettings | ||
| 422 | struct NotificationSettings { | ||
| 423 | NotificationFlag flags; | ||
| 424 | NotificationVolume volume; | ||
| 425 | NotificationTime start_time; | ||
| 426 | NotificationTime stop_time; | ||
| 427 | }; | ||
| 428 | static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size"); | ||
| 429 | |||
| 430 | /// This is nn::settings::system::SleepSettings | ||
| 431 | struct SleepSettings { | ||
| 432 | SleepFlag flags; | ||
| 433 | HandheldSleepPlan handheld_sleep_plan; | ||
| 434 | ConsoleSleepPlan console_sleep_plan; | ||
| 435 | }; | ||
| 436 | static_assert(sizeof(SleepSettings) == 0xc, "SleepSettings is incorrect size"); | ||
| 437 | |||
| 438 | /// This is nn::settings::system::TvSettings | ||
| 439 | struct 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 | }; | ||
| 449 | static_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 | ||
| 513 | void 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 | |||
| 521 | void 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 | |||
| 513 | void ISystemSettingsServer::GetAccountSettings(HLERequestContext& ctx) { | 532 | void 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 | ||
| 533 | void ISystemSettingsServer::GetEulaVersions(HLERequestContext& ctx) { | 552 | void 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 | ||
| 559 | void ISystemSettingsServer::GetColorSetId(HLERequestContext& ctx) { | 578 | void 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 | ||
| 578 | void ISystemSettingsServer::GetNotificationSettings(HLERequestContext& ctx) { | 597 | void 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 | ||
| 603 | void ISystemSettingsServer::GetAccountNotificationSettings(HLERequestContext& ctx) { | 628 | void 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 = | |||
| 645 | static Settings GetSettings() { | 671 | static 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 | ||
| 710 | void ISystemSettingsServer::GetTvSettings(HLERequestContext& ctx) { | 755 | void 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 | ||
| 737 | void ISystemSettingsServer::GetDebugModeFlag(HLERequestContext& ctx) { | 790 | void 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 | ||
| 745 | void ISystemSettingsServer::GetQuestFlag(HLERequestContext& ctx) { | 801 | void 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 | ||
| 753 | void ISystemSettingsServer::GetDeviceTimeZoneLocationName(HLERequestContext& ctx) { | 809 | void 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 | ||
| 764 | void ISystemSettingsServer::SetDeviceTimeZoneLocationName(HLERequestContext& ctx) { | 820 | void 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 | ||
| 776 | void ISystemSettingsServer::SetRegionCode(HLERequestContext& ctx) { | 832 | void 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 | ||
| 834 | void ISystemSettingsServer::GetPrimaryAlbumStorage(HLERequestContext& ctx) { | 890 | void 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 | |||
| 899 | void 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 | |||
| 907 | void 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 | ||
| 842 | void ISystemSettingsServer::GetSleepSettings(HLERequestContext& ctx) { | 918 | void 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 | ||
| 943 | void 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 | |||
| 952 | void 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 | |||
| 864 | void ISystemSettingsServer::GetInitialLaunchSettings(HLERequestContext& ctx) { | 964 | void 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 | ||
| 1019 | void 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 | |||
| 1028 | void 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 | |||
| 916 | void ISystemSettingsServer::GetMiiAuthorId(HLERequestContext& ctx) { | 1040 | void 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 | ||
| 926 | void ISystemSettingsServer::GetAutoUpdateEnableFlag(HLERequestContext& ctx) { | 1054 | void 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 | ||
| 936 | void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) { | 1062 | void 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 | ||
| 947 | void ISystemSettingsServer::SetExternalSteadyClockInternalOffset(HLERequestContext& ctx) { | 1071 | void ISystemSettingsServer::SetExternalSteadyClockInternalOffset(HLERequestContext& ctx) { |
| @@ -968,11 +1092,12 @@ void ISystemSettingsServer::GetExternalSteadyClockInternalOffset(HLERequestConte | |||
| 968 | } | 1092 | } |
| 969 | 1093 | ||
| 970 | void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx) { | 1094 | void 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 | ||
| 978 | void ISystemSettingsServer::GetAppletLaunchFlags(HLERequestContext& ctx) { | 1103 | void ISystemSettingsServer::GetAppletLaunchFlags(HLERequestContext& ctx) { |
| @@ -1014,7 +1139,7 @@ void ISystemSettingsServer::GetKeyboardLayout(HLERequestContext& ctx) { | |||
| 1014 | } | 1139 | } |
| 1015 | 1140 | ||
| 1016 | void ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) { | 1141 | void 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 | ||
| 1027 | void ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) { | 1152 | void 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 | ||
| 1039 | void ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime( | 1164 | void 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 | ||
| 1051 | void ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime( | 1176 | void 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 | ||
| 1064 | void ISystemSettingsServer::GetChineseTraditionalInputMethod(HLERequestContext& ctx) { | 1189 | void 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 | ||
| 1072 | void ISystemSettingsServer::GetHomeMenuScheme(HLERequestContext& ctx) { | 1198 | void ISystemSettingsServer::GetHomeMenuScheme(HLERequestContext& ctx) { |
| @@ -1094,11 +1220,11 @@ void ISystemSettingsServer::GetHomeMenuSchemeModel(HLERequestContext& ctx) { | |||
| 1094 | } | 1220 | } |
| 1095 | 1221 | ||
| 1096 | void ISystemSettingsServer::GetFieldTestingFlag(HLERequestContext& ctx) { | 1222 | void 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 | ||
| 1104 | void ISystemSettingsServer::SetupSettings() { | 1230 | void 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 | ||
| 26 | namespace Service::Set { | 27 | namespace Service::Set { |
| 27 | enum class GetFirmwareVersionType { | ||
| 28 | Version1, | ||
| 29 | Version2, | ||
| 30 | }; | ||
| 31 | |||
| 32 | struct 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 | }; | ||
| 45 | static_assert(sizeof(FirmwareVersionFormat) == 0x100, "FirmwareVersionFormat is an invalid size"); | ||
| 46 | 28 | ||
| 47 | Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System& system, | 29 | Result 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 | ||
| 110 | void Display::Abandon() { | ||
| 111 | for (auto& layer : layers) { | ||
| 112 | layer->GetConsumer().Abandon(); | ||
| 113 | } | ||
| 114 | is_abandoned = true; | ||
| 115 | } | ||
| 116 | |||
| 106 | Layer* Display::FindLayer(u64 layer_id) { | 117 | Layer* 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 | ||
| 86 | private: | 87 | private: |
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 @@ | |||
| 4 | add_library(frontend_common STATIC | 4 | add_library(frontend_common STATIC |
| 5 | config.cpp | 5 | config.cpp |
| 6 | config.h | 6 | config.h |
| 7 | content_manager.h | ||
| 7 | ) | 8 | ) |
| 8 | 9 | ||
| 9 | create_target_directory_groups(frontend_common) | 10 | create_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 | |||
| 21 | namespace ContentManager { | ||
| 22 | |||
| 23 | enum class InstallResult { | ||
| 24 | Success, | ||
| 25 | Overwrite, | ||
| 26 | Failure, | ||
| 27 | BaseInstallAttempted, | ||
| 28 | }; | ||
| 29 | |||
| 30 | enum 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 | */ | ||
| 42 | inline 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 | */ | ||
| 54 | inline 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 | */ | ||
| 81 | inline 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 | */ | ||
| 94 | inline 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 | */ | ||
| 108 | inline 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 | */ | ||
| 135 | inline 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 | */ | ||
| 200 | inline 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 | */ | ||
| 255 | inline 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 | */ | ||
| 345 | inline 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 | ||
| 145 | void EmulatedController::LoadDevices() { | 146 | void 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 | ||
| 1211 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { | 1212 | bool 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 | |||
| 1222 | bool 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 | |||
| 1232 | bool 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 | |||
| 1274 | VibrationValue EmulatedController::GetActualVibrationValue(DeviceIndex device_index) const { | ||
| 1275 | return last_vibration_value; | ||
| 1244 | } | 1276 | } |
| 1245 | 1277 | ||
| 1246 | bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { | 1278 | bool 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 | ||
| 31 | namespace Service::HID { | 36 | namespace 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 | ||
| 266 | NpadVibrationBase* ResourceManager::GetVibrationDevice( | ||
| 267 | const Core::HID::VibrationDeviceHandle& handle) { | ||
| 268 | return npad->GetVibrationDevice(handle); | ||
| 269 | } | ||
| 270 | |||
| 271 | NpadN64VibrationDevice* ResourceManager::GetN64VibrationDevice( | ||
| 272 | const Core::HID::VibrationDeviceHandle& handle) { | ||
| 273 | return npad->GetN64VibrationDevice(handle); | ||
| 274 | } | ||
| 275 | |||
| 276 | NpadVibrationDevice* ResourceManager::GetNSVibrationDevice( | ||
| 277 | const Core::HID::VibrationDeviceHandle& handle) { | ||
| 278 | return npad->GetNSVibrationDevice(handle); | ||
| 279 | } | ||
| 280 | |||
| 281 | NpadGcVibrationDevice* ResourceManager::GetGcVibrationDevice( | ||
| 282 | const Core::HID::VibrationDeviceHandle& handle) { | ||
| 283 | return npad->GetGcVibrationDevice(handle); | ||
| 284 | } | ||
| 285 | |||
| 286 | Result 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 | |||
| 305 | void ResourceManager::SetForceHandheldStyleVibration(bool is_forced) { | ||
| 306 | handheld_config->is_force_handheld_style_vibration = is_forced; | ||
| 307 | } | ||
| 308 | |||
| 309 | Result 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 | |||
| 315 | Result 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 | |||
| 362 | Result 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 | |||
| 260 | void ResourceManager::UpdateControllers(std::chrono::nanoseconds ns_late) { | 381 | void 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 { | |||
| 10 | class System; | 10 | class System; |
| 11 | } | 11 | } |
| 12 | 12 | ||
| 13 | namespace Core::HID { | ||
| 14 | struct VibrationDeviceHandle; | ||
| 15 | struct VibrationValue; | ||
| 16 | struct VibrationDeviceInfo; | ||
| 17 | } // namespace Core::HID | ||
| 18 | |||
| 13 | namespace Core::Timing { | 19 | namespace Core::Timing { |
| 14 | struct EventType; | 20 | struct EventType; |
| 15 | } | 21 | } |
| @@ -37,6 +43,11 @@ class SixAxis; | |||
| 37 | class SleepButton; | 43 | class SleepButton; |
| 38 | class TouchScreen; | 44 | class TouchScreen; |
| 39 | class UniquePad; | 45 | class UniquePad; |
| 46 | class NpadVibrationBase; | ||
| 47 | class NpadN64VibrationDevice; | ||
| 48 | class NpadGcVibrationDevice; | ||
| 49 | class NpadVibrationDevice; | ||
| 50 | struct HandheldConfig; | ||
| 40 | 51 | ||
| 41 | class ResourceManager { | 52 | class 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 | ||
| 10 | namespace Core::HID { | ||
| 11 | class EmulatedController; | ||
| 12 | } | ||
| 13 | |||
| 10 | namespace Kernel { | 14 | namespace Kernel { |
| 11 | class KEvent; | 15 | class KEvent; |
| 12 | class KReadableEvent; | 16 | class 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 | ||
| 242 | void AbstractPad::GetLeftRightVibrationDevice(std::vector<NpadVibrationDevice*> list) { | ||
| 243 | list.emplace_back(&vibration_left); | ||
| 244 | list.emplace_back(&vibration_right); | ||
| 245 | } | ||
| 246 | |||
| 247 | NpadGcVibrationDevice* AbstractPad::GetGCVibrationDevice() { | 244 | NpadGcVibrationDevice* 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; | |||
| 32 | class SixAxisResource; | 32 | class SixAxisResource; |
| 33 | class PalmaResource; | 33 | class PalmaResource; |
| 34 | class NPadResource; | 34 | class NPadResource; |
| 35 | class AbstractPad; | ||
| 36 | class NpadLastActiveHandler; | 35 | class NpadLastActiveHandler; |
| 37 | class NpadIrNfcHandler; | 36 | class NpadIrNfcHandler; |
| 38 | class UniquePads; | 37 | class UniquePads; |
| @@ -44,7 +43,6 @@ class NpadGcVibration; | |||
| 44 | 43 | ||
| 45 | class CaptureButtonResource; | 44 | class CaptureButtonResource; |
| 46 | class HomeButtonResource; | 45 | class HomeButtonResource; |
| 47 | class VibrationHandler; | ||
| 48 | 46 | ||
| 49 | struct HandheldConfig; | 47 | struct 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 | ||
| 35 | void NpadAbstractVibrationHandler::SetVibrationHandler(NpadVibration* handler) { | ||
| 36 | vibration_handler = handler; | ||
| 37 | } | ||
| 38 | |||
| 39 | void NpadAbstractVibrationHandler::SetHidCore(Core::HID::HIDCore* core) { | ||
| 40 | hid_core = core; | ||
| 41 | } | ||
| 42 | |||
| 33 | void NpadAbstractVibrationHandler::SetN64Vibration(NpadN64VibrationDevice* n64_device) { | 43 | void NpadAbstractVibrationHandler::SetN64Vibration(NpadN64VibrationDevice* n64_device) { |
| 34 | n64_vibration_device = n64_device; | 44 | n64_vibration_device = n64_device; |
| 35 | } | 45 | } |
| 36 | 46 | ||
| 37 | void NpadAbstractVibrationHandler::SetVibration(std::span<NpadVibrationDevice*> device) { | 47 | void 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 | ||
| 43 | void NpadAbstractVibrationHandler::SetGcVibration(NpadGcVibrationDevice* gc_device) { | 53 | void 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 | ||
| 12 | namespace Core::HID { | ||
| 13 | class HIDCore; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace Service::HID { | 16 | namespace Service::HID { |
| 13 | struct AppletResourceHolder; | 17 | struct AppletResourceHolder; |
| 14 | class NpadAbstractedPadHolder; | 18 | class 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 | ||
| 203 | bool 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 | |||
| 203 | void AppletResource::EnableSixAxisSensor(u64 aruid, bool is_enabled) { | 222 | void 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 | ||
| 6 | namespace Service::HID { | 8 | namespace Service::HID { |
| 7 | 9 | ||
| 8 | HidFirmwareSettings::HidFirmwareSettings() { | 10 | HidFirmwareSettings::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 | ||
| 8 | namespace Core { | ||
| 9 | class System; | ||
| 10 | } | ||
| 11 | |||
| 12 | namespace Service::Set { | ||
| 13 | class ISystemSettingsServer; | ||
| 14 | } | ||
| 15 | |||
| 8 | namespace Service::HID { | 16 | namespace 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 | ||
| 26 | namespace Service::HID { | 27 | namespace 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 | ||
| 48 | NPad::~NPad() { | 49 | NPad::~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 | ||
| 364 | void NPad::WriteEmptyEntry(NpadInternalState* npad) { | 366 | void 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 | ||
| 743 | bool 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 | |||
| 789 | void 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 | |||
| 836 | void 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 | |||
| 853 | Core::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 | |||
| 864 | void 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 | |||
| 881 | void 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 | |||
| 893 | void NPad::SetPermitVibrationSession(bool permit_vibration_session) { | ||
| 894 | permit_vibration_session_enabled = permit_vibration_session; | ||
| 895 | } | ||
| 896 | |||
| 897 | bool 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 | |||
| 908 | Result NPad::AcquireNpadStyleSetUpdateEventHandle(u64 aruid, Kernel::KReadableEvent** out_event, | 749 | Result 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 | ||
| 1234 | void NPad::UnregisterAppletResourceUserId(u64 aruid) { | 1070 | void 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 | ||
| 1238 | void NPad::SetNpadExternals(std::shared_ptr<AppletResource> resource, | 1081 | void 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 | |||
| 1245 | NPad::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 | ||
| 1251 | const 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 | ||
| 1257 | NPad::NpadControllerData& NPad::GetControllerFromHandle( | 1095 | NPad::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 | ||
| 1230 | NpadVibration* NPad::GetVibrationHandler() { | ||
| 1231 | return &vibration_handler; | ||
| 1232 | } | ||
| 1233 | |||
| 1234 | std::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 | |||
| 1260 | NpadVibrationBase* 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 | |||
| 1276 | NpadN64VibrationDevice* 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 | |||
| 1290 | NpadVibrationDevice* 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 | |||
| 1305 | NpadGcVibrationDevice* 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 | |||
| 1318 | void NPad::UpdateHandheldAbstractState() { | ||
| 1319 | std::scoped_lock lock{mutex}; | ||
| 1320 | abstracted_pads[NpadIdTypeToIndex(Core::HID::NpadIdType::Handheld)].Update(); | ||
| 1321 | } | ||
| 1322 | |||
| 1323 | void 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 | ||
| 17 | namespace Core::HID { | 23 | namespace Core::HID { |
| 18 | class EmulatedController; | 24 | class EmulatedController; |
| @@ -32,6 +38,7 @@ union Result; | |||
| 32 | 38 | ||
| 33 | namespace Service::HID { | 39 | namespace Service::HID { |
| 34 | class AppletResource; | 40 | class AppletResource; |
| 41 | struct HandheldConfig; | ||
| 35 | struct NpadInternalState; | 42 | struct NpadInternalState; |
| 36 | struct NpadSixAxisSensorLifo; | 43 | struct NpadSixAxisSensorLifo; |
| 37 | struct NpadSharedMemoryFormat; | 44 | struct 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 | ||
| 164 | private: | 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 | ||
| 158 | private: | ||
| 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 | ||
| 11 | namespace Core::HID { | ||
| 12 | class EmulatedController; | ||
| 13 | } | ||
| 14 | |||
| 11 | namespace Service::HID { | 15 | namespace Service::HID { |
| 12 | static constexpr std::size_t MaxSupportedNpadIdTypes = 10; | 16 | static constexpr std::size_t MaxSupportedNpadIdTypes = 10; |
| 13 | static constexpr std::size_t StyleIndexCount = 7; | 17 | static 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 | ||
| 80 | u64 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 | |||
| 28 | private: | 30 | private: |
| 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 | ||
| 11 | NpadGcVibrationDevice::NpadGcVibrationDevice() {} | 12 | NpadGcVibrationDevice::NpadGcVibrationDevice() {} |
| 12 | 13 | ||
| 13 | Result NpadGcVibrationDevice::IncrementRefCounter() { | 14 | Result 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 | ||
| 25 | Result NpadGcVibrationDevice::DecrementRefCounter() { | 27 | Result 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 | ||
| 43 | Result 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 | |||
| 69 | Result 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 | |||
| 41 | Result NpadGcVibrationDevice::SendVibrationGcErmCommand(Core::HID::VibrationGcErmCommand command) { | 85 | Result 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 { | |||
| 20 | public: | 20 | public: |
| 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 | |||
| 34 | private: | ||
| 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 | ||
| 11 | NpadN64VibrationDevice::NpadN64VibrationDevice() {} | 12 | NpadN64VibrationDevice::NpadN64VibrationDevice() {} |
| 12 | 13 | ||
| 13 | Result NpadN64VibrationDevice::IncrementRefCounter() { | 14 | Result 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 | ||
| 26 | Result NpadN64VibrationDevice::DecrementRefCounter() { | 27 | Result 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 | ||
| 43 | Result 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 | |||
| 64 | Result 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 | |||
| 49 | Result NpadN64VibrationDevice::SendValueInBool(bool is_vibrating) { | 80 | Result 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 | ||
| 15 | namespace Service::HID { | 15 | namespace Service::HID { |
| 16 | class NpadVibration; | 16 | class NpadVibration; |
| 17 | struct IAbstractedPad; | ||
| 17 | 18 | ||
| 18 | /// Handles Npad request from HID interfaces | 19 | /// Handles Npad request from HID interfaces |
| 19 | class NpadN64VibrationDevice final : public NpadVibrationBase { | 20 | class NpadN64VibrationDevice final : public NpadVibrationBase { |
| 20 | public: | 21 | public: |
| 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 | ||
| 11 | NpadVibrationBase::NpadVibrationBase() {} | 11 | NpadVibrationBase::NpadVibrationBase() {} |
| 12 | 12 | ||
| 13 | Result NpadVibrationBase::IncrementRefCounter() { | 13 | Result NpadVibrationBase::Activate() { |
| 14 | ref_counter++; | 14 | ref_counter++; |
| 15 | return ResultSuccess; | 15 | return ResultSuccess; |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | Result NpadVibrationBase::DecrementRefCounter() { | 18 | Result 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 | ||
| 9 | namespace Core::HID { | ||
| 10 | class EmulatedController; | ||
| 11 | } | ||
| 12 | |||
| 9 | namespace Service::HID { | 13 | namespace Service::HID { |
| 10 | class NpadVibration; | 14 | class NpadVibration; |
| 11 | 15 | ||
| @@ -14,13 +18,13 @@ class NpadVibrationBase { | |||
| 14 | public: | 18 | public: |
| 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 | ||
| 22 | protected: | 26 | protected: |
| 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 | ||
| 11 | NpadVibrationDevice::NpadVibrationDevice() {} | 12 | NpadVibrationDevice::NpadVibrationDevice() {} |
| 12 | 13 | ||
| 13 | Result NpadVibrationDevice::IncrementRefCounter() { | 14 | Result 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 | ||
| 18 | Result NpadVibrationDevice::DecrementRefCounter() { | 28 | Result 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 | ||
| 45 | Result 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 | |||
| 68 | Result 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 | |||
| 26 | Result NpadVibrationDevice::SendVibrationValue(const Core::HID::VibrationValue& value) { | 84 | Result 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 | ||
| 70 | Result NpadVibrationDevice::GetActualVibrationValue(Core::HID::VibrationValue& out_value) { | 128 | Result 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 | ||
| 15 | namespace Core::HID { | ||
| 16 | enum class DeviceIndex : u8; | ||
| 17 | } | ||
| 18 | |||
| 15 | namespace Service::HID { | 19 | namespace Service::HID { |
| 16 | class NpadVibration; | 20 | class NpadVibration; |
| 17 | 21 | ||
| @@ -20,16 +24,20 @@ class NpadVibrationDevice final : public NpadVibrationBase { | |||
| 20 | public: | 24 | public: |
| 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 | ||
| 31 | private: | 39 | private: |
| 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 { | |||
| 12 | namespace { | 12 | namespace { |
| 13 | class ImageOperands { | 13 | class ImageOperands { |
| 14 | public: | 14 | public: |
| 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 | ||
| 134 | private: | 132 | private: |
| 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 | |||
| 315 | void 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 | ||
| 316 | Id EmitBindlessImageSampleImplicitLod(EmitContext&) { | 347 | Id EmitBindlessImageSampleImplicitLod(EmitContext&) { |
| @@ -496,6 +527,7 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, | |||
| 496 | Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, | 527 | Id 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 | ||
| 550 | Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, | 582 | Id 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); |
| 544 | Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords); | 544 | Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords); |
| 545 | Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, | 545 | Id 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); |
| 547 | Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords); | 547 | Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords); |
| 548 | void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color); | 548 | void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color); |
| 549 | Id EmitIsTextureScaled(EmitContext& ctx, const IR::Value& index); | 549 | Id 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 | |||
| 127 | void ConfigureVibration::StopVibrations() { | 127 | void 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 | ||
| 2462 | void GMainWindow::RemoveBaseContent(u64 program_id, InstalledEntryType type) { | 2479 | void 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 | ||
| 2477 | void GMainWindow::RemoveUpdateContent(u64 program_id, InstalledEntryType type) { | 2492 | void 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 | ||
| 2492 | void GMainWindow::RemoveAddOnContent(u64 program_id, InstalledEntryType type) { | 2503 | void 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 | ||
| 2836 | void GMainWindow::OnGameListCopyTID(u64 program_id) { | 2818 | void 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 | ||
| 3341 | InstallResult GMainWindow::InstallNSP(const QString& filename) { | 3332 | ContentManager::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 | |||
| 3395 | InstallResult 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 | ||
| 3476 | void GMainWindow::OnMenuRecentFile() { | 3378 | void GMainWindow::OnMenuRecentFile() { |
| @@ -4205,10 +4107,6 @@ void GMainWindow::OnOpenYuzuFolder() { | |||
| 4205 | } | 4107 | } |
| 4206 | 4108 | ||
| 4207 | void GMainWindow::OnVerifyInstalledContents() { | 4109 | void 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 | ||
| 127 | enum class InstallResult { | ||
| 128 | Success, | ||
| 129 | Overwrite, | ||
| 130 | Failure, | ||
| 131 | BaseInstallAttempted, | ||
| 132 | }; | ||
| 133 | |||
| 134 | enum class ReinitializeKeyBehavior { | 128 | enum 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; |