summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/android/app/build.gradle.kts41
-rw-r--r--src/android/app/src/main/AndroidManifest.xml2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt15
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt12
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt21
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt11
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt26
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt66
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt4
-rw-r--r--src/android/app/src/main/jni/native.cpp120
-rw-r--r--src/android/app/src/main/res/drawable/ic_system_update_alt.xml9
-rw-r--r--src/android/app/src/main/res/values-de/strings.xml335
-rw-r--r--src/android/app/src/main/res/values-es/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-fr/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-it/strings.xml344
-rw-r--r--src/android/app/src/main/res/values-ja/strings.xml343
-rw-r--r--src/android/app/src/main/res/values-ko/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-nb/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-pl/strings.xml344
-rw-r--r--src/android/app/src/main/res/values-pt-rBR/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-pt-rPT/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-ru/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-uk/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-zh-rCN/strings.xml345
-rw-r--r--src/android/app/src/main/res/values-zh-rTW/strings.xml345
-rw-r--r--src/android/app/src/main/res/values/strings.xml16
-rw-r--r--src/audio_core/audio_core.cpp8
-rw-r--r--src/audio_core/audio_core.h14
-rw-r--r--src/common/fs/fs_paths.h1
-rw-r--r--src/common/fs/path_util.cpp1
-rw-r--r--src/common/fs/path_util.h1
-rw-r--r--src/common/settings.cpp1
-rw-r--r--src/common/settings.h1
-rw-r--r--src/common/uuid.cpp2
-rw-r--r--src/core/core.cpp18
-rw-r--r--src/core/core.h3
-rw-r--r--src/core/file_sys/submission_package.h1
-rw-r--r--src/core/hle/service/nfc/common/device.cpp160
-rw-r--r--src/core/hle/service/nfc/common/device.h10
-rw-r--r--src/core/hle/service/nfc/common/device_manager.cpp14
-rw-r--r--src/core/hle/service/nfc/nfc_interface.cpp8
-rw-r--r--src/core/hle/service/nfc/nfc_result.h20
-rw-r--r--src/core/hle/service/nfp/nfp_interface.cpp6
-rw-r--r--src/core/hle/service/nfp/nfp_result.h2
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp4
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.cpp4
-rw-r--r--src/core/loader/nro.cpp13
-rw-r--r--src/core/loader/nro.h2
-rw-r--r--src/shader_recompiler/CMakeLists.txt2
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate_program.cpp6
-rw-r--r--src/shader_recompiler/host_translate_info.h3
-rw-r--r--src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp44
-rw-r--r--src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp185
-rw-r--r--src/shader_recompiler/ir_opt/passes.h2
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h82
-rw-r--r--src/video_core/buffer_cache/buffer_cache_base.h11
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.cpp18
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.h4
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp1
-rw-r--r--src/video_core/renderer_opengl/gl_device.h5
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_blit_screen.cpp55
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp54
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h3
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp1
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.cpp5
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp2
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h10
-rw-r--r--src/yuzu/configuration/config.cpp8
-rw-r--r--src/yuzu/configuration/config.h1
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.cpp8
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.h1
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.ui10
-rw-r--r--src/yuzu/main.cpp10
77 files changed, 5796 insertions, 249 deletions
diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts
index 13bb227ff..fe613d339 100644
--- a/src/android/app/build.gradle.kts
+++ b/src/android/app/build.gradle.kts
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later
import android.annotation.SuppressLint
+import org.jetbrains.kotlin.konan.properties.Properties
plugins {
id("com.android.application")
@@ -57,9 +58,22 @@ android {
applicationId = "org.yuzu.yuzu_emu"
minSdk = 30
targetSdk = 33
- versionCode = 1
versionName = getGitVersion()
+ // If you want to use autoVersion for the versionCode, create a property in local.properties
+ // named "autoVersioned" and set it to "true"
+ val properties = Properties()
+ val versionProperty = try {
+ properties.load(project.rootProject.file("local.properties").inputStream())
+ properties.getProperty("autoVersioned") ?: ""
+ } catch (e: Exception) { "" }
+
+ versionCode = if (versionProperty == "true") {
+ autoVersion
+ } else {
+ 1
+ }
+
ndk {
@SuppressLint("ChromeOsAbiSupport")
abiFilters += listOf("arm64-v8a")
@@ -74,16 +88,7 @@ android {
// Signed by release key, allowing for upload to Play Store.
release {
- signingConfig = signingConfigs.getByName("debug")
- isMinifyEnabled = true
- isDebuggable = false
- proguardFiles(
- getDefaultProguardFile("proguard-android.txt"),
- "proguard-rules.pro"
- )
- }
-
- register("relWithVersionCode") {
+ resValue("string", "app_name_suffixed", "yuzu")
signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = true
isDebuggable = false
@@ -96,6 +101,7 @@ android {
// builds a release build that doesn't need signing
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
register("relWithDebInfo") {
+ resValue("string", "app_name_suffixed", "yuzu Debug Release")
signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = true
isDebuggable = true
@@ -103,16 +109,19 @@ android {
getDefaultProguardFile("proguard-android.txt"),
"proguard-rules.pro"
)
- versionNameSuffix = "-debug"
+ versionNameSuffix = "-relWithDebInfo"
+ applicationIdSuffix = ".relWithDebInfo"
isJniDebuggable = true
}
// Signed by debug key disallowing distribution on Play Store.
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
debug {
+ resValue("string", "app_name_suffixed", "yuzu Debug")
isDebuggable = true
isJniDebuggable = true
versionNameSuffix = "-debug"
+ applicationIdSuffix = ".debug"
}
}
@@ -162,19 +171,19 @@ dependencies {
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.recyclerview:recyclerview:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
- implementation("androidx.fragment:fragment-ktx:1.5.7")
+ implementation("androidx.fragment:fragment-ktx:1.6.0")
implementation("androidx.documentfile:documentfile:1.0.1")
implementation("com.google.android.material:material:1.9.0")
implementation("androidx.preference:preference:1.2.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
implementation("io.coil-kt:coil:2.2.2")
implementation("androidx.core:core-splashscreen:1.0.1")
- implementation("androidx.window:window:1.0.0")
+ implementation("androidx.window:window:1.1.0")
implementation("org.ini4j:ini4j:0.5.4")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
- implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
- implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
+ implementation("androidx.navigation:navigation-fragment-ktx:2.6.0")
+ implementation("androidx.navigation:navigation-ui-ktx:2.6.0")
implementation("info.debatty:java-string-similarity:2.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
}
diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml
index eef566042..1e92098ec 100644
--- a/src/android/app/src/main/AndroidManifest.xml
+++ b/src/android/app/src/main/AndroidManifest.xml
@@ -18,7 +18,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<application
android:name="org.yuzu.yuzu_emu.YuzuApplication"
- android:label="@string/app_name"
+ android:label="@string/app_name_suffixed"
android:icon="@drawable/ic_launcher"
android:allowBackup="true"
android:hasFragileUserData="true"
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 c11b6bc16..4be9ade14 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
@@ -223,8 +223,12 @@ object NativeLibrary {
external fun getCompany(filename: String): String
+ external fun isHomebrew(filename: String): Boolean
+
external fun setAppDirectory(directory: String)
+ external fun installFileToNand(filename: String): Int
+
external fun initializeGpuDriver(
hookLibDir: String?,
customDriverDir: String?,
@@ -505,4 +509,15 @@ object NativeLibrary {
const val RELEASED = 0
const val PRESSED = 1
}
+
+ /**
+ * Result from installFileToNand
+ */
+ object InstallFileToNandResult {
+ const val Success = 0
+ const val SuccessFileOverwritten = 1
+ const val Error = 2
+ const val ErrorBaseGame = 3
+ const val ErrorFilenameExtension = 4
+ }
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
index 94d5156cf..20a0394f5 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
@@ -6,15 +6,12 @@ package org.yuzu.yuzu_emu.activities
import android.app.Activity
import android.content.Context
import android.content.Intent
-import android.content.res.Configuration
import android.graphics.Rect
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
-import android.hardware.display.DisplayManager
import android.os.Bundle
-import android.view.Display
import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
@@ -23,7 +20,6 @@ import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.getSystemService
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
@@ -39,7 +35,6 @@ import org.yuzu.yuzu_emu.features.settings.model.SettingsViewModel
import org.yuzu.yuzu_emu.fragments.EmulationFragment
import org.yuzu.yuzu_emu.model.Game
import org.yuzu.yuzu_emu.utils.ControllerMappingHelper
-import org.yuzu.yuzu_emu.utils.EmulationMenuSettings
import org.yuzu.yuzu_emu.utils.ForegroundService
import org.yuzu.yuzu_emu.utils.InputHandler
import org.yuzu.yuzu_emu.utils.NfcReader
@@ -148,11 +143,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
super.onResume()
nfcReader.startScanning()
startMotionSensorListener()
-
- NativeLibrary.notifyOrientationChange(
- EmulationMenuSettings.landscapeScreenLayout,
- getAdjustedRotation()
- )
}
override fun onPause() {
@@ -258,23 +248,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
override fun onAccuracyChanged(sensor: Sensor, i: Int) {}
- private fun getAdjustedRotation():Int {
- val rotation = getSystemService<DisplayManager>()!!.getDisplay(Display.DEFAULT_DISPLAY).rotation
- val config: Configuration = resources.configuration
-
- if ((config.screenLayout and Configuration.SCREENLAYOUT_LONG_YES) != 0 ||
- (config.screenLayout and Configuration.SCREENLAYOUT_LONG_NO) == 0) {
- return rotation
- }
- when (rotation) {
- Surface.ROTATION_0 -> return Surface.ROTATION_90
- Surface.ROTATION_90 -> return Surface.ROTATION_0
- Surface.ROTATION_180 -> return Surface.ROTATION_270
- Surface.ROTATION_270 -> return Surface.ROTATION_180
- }
- return rotation
- }
-
private fun restoreState(savedInstanceState: Bundle) {
game = savedInstanceState.parcelable(EXTRA_SELECTED_GAME)!!
}
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 bdc337501..536163eb6 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
@@ -95,6 +95,11 @@ class HomeSettingsFragment : Fragment() {
R.drawable.ic_nfc
) { mainActivity.getAmiiboKey.launch(arrayOf("*/*")) },
HomeSetting(
+ R.string.install_game_content,
+ R.string.install_game_content_description,
+ R.drawable.ic_system_update_alt
+ ) { mainActivity.installGameUpdate.launch(arrayOf("*/*")) },
+ HomeSetting(
R.string.select_games_folder,
R.string.select_games_folder_description,
R.drawable.ic_add
@@ -103,7 +108,12 @@ class HomeSettingsFragment : Fragment() {
R.string.manage_save_data,
R.string.import_export_saves_description,
R.drawable.ic_save
- ) { ImportExportSavesFragment().show(parentFragmentManager, ImportExportSavesFragment.TAG) },
+ ) {
+ ImportExportSavesFragment().show(
+ parentFragmentManager,
+ ImportExportSavesFragment.TAG
+ )
+ },
HomeSetting(
R.string.install_prod_keys,
R.string.install_prod_keys_description,
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 ebc0f164a..adbe3696b 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
@@ -127,13 +127,7 @@ class SearchFragment : Fragment() {
}
}
- R.id.chip_homebrew -> {
- baseList.filter {
- Log.error("Guh - ${it.path}")
- FileUtil.hasExtension(it.path, "nro")
- || FileUtil.hasExtension(it.path, "nso")
- }
- }
+ R.id.chip_homebrew -> baseList.filter { it.isHomebrew }
R.id.chip_retail -> baseList.filter {
FileUtil.hasExtension(it.path, "xci")
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 2a17653b2..35d8000c5 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
@@ -16,7 +16,8 @@ class Game(
val regions: String,
val path: String,
val gameId: String,
- val company: String
+ val company: String,
+ val isHomebrew: Boolean
) : Parcelable {
val keyAddedToLibraryTime get() = "${gameId}_AddedToLibraryTime"
val keyLastPlayedTime get() = "${gameId}_LastPlayed"
@@ -25,12 +26,18 @@ class Game(
if (other !is Game)
return false
- return title == other.title
- && description == other.description
- && regions == other.regions
- && path == other.path
- && gameId == other.gameId
- && company == other.company
+ return hashCode() == other.hashCode()
+ }
+
+ override fun hashCode(): Int {
+ var result = title.hashCode()
+ result = 31 * result + description.hashCode()
+ result = 31 * result + regions.hashCode()
+ result = 31 * result + path.hashCode()
+ result = 31 * result + gameId.hashCode()
+ result = 31 * result + company.hashCode()
+ result = 31 * result + isHomebrew.hashCode()
+ return result
}
companion object {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt
index 7059856f1..d9b301210 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt
@@ -13,6 +13,8 @@ import androidx.preference.PreferenceManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import kotlinx.serialization.ExperimentalSerializationApi
+import kotlinx.serialization.MissingFieldException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import org.yuzu.yuzu_emu.NativeLibrary
@@ -20,6 +22,7 @@ import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.utils.GameHelper
import java.util.Locale
+@OptIn(ExperimentalSerializationApi::class)
class GamesViewModel : ViewModel() {
private val _games = MutableLiveData<List<Game>>(emptyList())
val games: LiveData<List<Game>> get() = _games
@@ -49,7 +52,13 @@ class GamesViewModel : ViewModel() {
if (storedGames!!.isNotEmpty()) {
val deserializedGames = mutableSetOf<Game>()
storedGames.forEach {
- val game: Game = Json.decodeFromString(it)
+ val game: Game
+ try {
+ game = Json.decodeFromString(it)
+ } catch (e: MissingFieldException) {
+ return@forEach
+ }
+
val gameExists =
DocumentFile.fromSingleUri(YuzuApplication.appContext, Uri.parse(game.path))
?.exists()
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
index c9f5797ac..aa424c768 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
@@ -765,18 +765,20 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
// If we have API access, calculate the safe area to draw the overlay
var cutoutLeft = 0
var cutoutBottom = 0
- val insets = context.windowManager.currentWindowMetrics.windowInsets.displayCutout
- if (insets != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- if (insets.boundingRectTop.bottom != 0 && insets.boundingRectTop.bottom > maxY / 2)
- insets.boundingRectTop.bottom.toFloat() else maxY
- if (insets.boundingRectRight.left != 0 && insets.boundingRectRight.left > maxX / 2)
- insets.boundingRectRight.left.toFloat() else maxX
-
- minX = insets.boundingRectLeft.right - insets.boundingRectLeft.left
- minY = insets.boundingRectBottom.top - insets.boundingRectBottom.bottom
-
- cutoutLeft = insets.boundingRectRight.right - insets.boundingRectRight.left
- cutoutBottom = insets.boundingRectTop.top - insets.boundingRectTop.bottom
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ val insets = context.windowManager.currentWindowMetrics.windowInsets.displayCutout
+ if (insets != null) {
+ if (insets.boundingRectTop.bottom != 0 && insets.boundingRectTop.bottom > maxY / 2)
+ insets.boundingRectTop.bottom.toFloat() else maxY
+ if (insets.boundingRectRight.left != 0 && insets.boundingRectRight.left > maxX / 2)
+ insets.boundingRectRight.left.toFloat() else maxX
+
+ minX = insets.boundingRectLeft.right - insets.boundingRectLeft.left
+ minY = insets.boundingRectBottom.top - insets.boundingRectBottom.bottom
+
+ cutoutLeft = insets.boundingRectRight.right - insets.boundingRectRight.left
+ cutoutBottom = insets.boundingRectTop.top - insets.boundingRectTop.bottom
+ }
}
// This makes sure that if we have an inset on one side of the screen, we mirror it on
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 124f62f08..041d16f3a 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
@@ -284,10 +284,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
if (result == null)
return@registerForActivityResult
- if (!FileUtil.hasExtension(result.toString(), "keys")) {
+ if (!FileUtil.hasExtension(result, "keys")) {
MessageDialogFragment.newInstance(
R.string.reading_keys_failure,
- R.string.install_keys_failure_extension_description
+ R.string.install_prod_keys_failure_extension_description
).show(supportFragmentManager, MessageDialogFragment.TAG)
return@registerForActivityResult
}
@@ -379,10 +379,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
if (result == null)
return@registerForActivityResult
- if (!FileUtil.hasExtension(result.toString(), "bin")) {
+ if (!FileUtil.hasExtension(result, "bin")) {
MessageDialogFragment.newInstance(
R.string.reading_keys_failure,
- R.string.install_keys_failure_extension_description
+ R.string.install_amiibo_keys_failure_extension_description
).show(supportFragmentManager, MessageDialogFragment.TAG)
return@registerForActivityResult
}
@@ -467,4 +467,62 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
}
}
}
+
+ val installGameUpdate =
+ registerForActivityResult(ActivityResultContracts.OpenDocument()) {
+ if (it == null)
+ return@registerForActivityResult
+
+ IndeterminateProgressDialogFragment.newInstance(
+ this@MainActivity,
+ R.string.install_game_content
+ ) {
+ val result = NativeLibrary.installFileToNand(it.toString())
+ lifecycleScope.launch {
+ withContext(Dispatchers.Main) {
+ when (result) {
+ NativeLibrary.InstallFileToNandResult.Success -> {
+ Toast.makeText(
+ applicationContext,
+ R.string.install_game_content_success,
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+
+ NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> {
+ Toast.makeText(
+ applicationContext,
+ R.string.install_game_content_success_overwrite,
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+
+ NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> {
+ MessageDialogFragment.newInstance(
+ R.string.install_game_content_failure,
+ R.string.install_game_content_failure_base
+ ).show(supportFragmentManager, MessageDialogFragment.TAG)
+ }
+
+ NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> {
+ MessageDialogFragment.newInstance(
+ R.string.install_game_content_failure,
+ R.string.install_game_content_failure_file_extension,
+ R.string.install_game_content_help_link
+ ).show(supportFragmentManager, MessageDialogFragment.TAG)
+ }
+
+ else -> {
+ MessageDialogFragment.newInstance(
+ R.string.install_game_content_failure,
+ R.string.install_game_content_failure_description,
+ R.string.install_game_content_help_link
+ ).show(supportFragmentManager, MessageDialogFragment.TAG)
+ }
+ }
+ }
+ }
+ return@newInstance result
+ }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
+ }
}
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 593dad8d3..492b1ad91 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,9 @@ import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.provider.DocumentsContract
+import android.provider.OpenableColumns
import androidx.documentfile.provider.DocumentFile
+import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.model.MinimalDocumentFile
import java.io.BufferedInputStream
import java.io.File
@@ -324,7 +326,25 @@ object FileUtil {
}
}
- fun hasExtension(path: String, extension: String): Boolean {
- return path.substring(path.lastIndexOf(".") + 1).contains(extension)
+ fun hasExtension(path: String, extension: String): Boolean =
+ path.substring(path.lastIndexOf(".") + 1).contains(extension)
+
+ fun hasExtension(uri: Uri, extension: String): Boolean {
+ val fileName: String?
+ val cursor = YuzuApplication.appContext.contentResolver.query(uri, null, null, null, null)
+ val nameIndex = cursor?.getColumnIndex(OpenableColumns.DISPLAY_NAME)
+ cursor?.moveToFirst()
+
+ if (nameIndex == null) {
+ return false
+ }
+
+ fileName = cursor.getString(nameIndex)
+ cursor.close()
+
+ if (fileName == null) {
+ return false
+ }
+ return fileName.substring(fileName.lastIndexOf(".") + 1).contains(extension)
}
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt
index ba6b5783e..42b207618 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt
@@ -6,7 +6,6 @@ package org.yuzu.yuzu_emu.utils
import android.content.SharedPreferences
import android.net.Uri
import androidx.preference.PreferenceManager
-import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.yuzu.yuzu_emu.NativeLibrary
@@ -83,7 +82,8 @@ object GameHelper {
NativeLibrary.getRegions(filePath),
filePath,
gameId,
- NativeLibrary.getCompany(filePath)
+ NativeLibrary.getCompany(filePath),
+ NativeLibrary.isHomebrew(filePath)
)
val addedTime = preferences.getLong(newGame.keyAddedToLibraryTime, 0L)
diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp
index b87e04b3d..4091c23d1 100644
--- a/src/android/app/src/main/jni/native.cpp
+++ b/src/android/app/src/main/jni/native.cpp
@@ -13,6 +13,7 @@
#include <android/api-level.h>
#include <android/native_window_jni.h>
+#include <core/loader/nro.h>
#include "common/detached_tasks.h"
#include "common/dynamic_library.h"
@@ -27,7 +28,10 @@
#include "core/core.h"
#include "core/cpu_manager.h"
#include "core/crypto/key_manager.h"
+#include "core/file_sys/card_image.h"
#include "core/file_sys/registered_cache.h"
+#include "core/file_sys/submission_package.h"
+#include "core/file_sys/vfs.h"
#include "core/file_sys/vfs_real.h"
#include "core/frontend/applets/cabinet.h"
#include "core/frontend/applets/controller.h"
@@ -93,12 +97,72 @@ public:
m_native_window = native_window;
}
- u32 ScreenRotation() const {
- return m_screen_rotation;
- }
+ int InstallFileToNand(std::string filename) {
+ const auto copy_func = [](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest,
+ std::size_t block_size) {
+ if (src == nullptr || dest == nullptr) {
+ return false;
+ }
+ if (!dest->Resize(src->GetSize())) {
+ return false;
+ }
+
+ using namespace Common::Literals;
+ std::vector<u8> buffer(1_MiB);
+
+ for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
+ const auto read = src->Read(buffer.data(), buffer.size(), i);
+ dest->Write(buffer.data(), read, i);
+ }
+ return true;
+ };
+
+ enum InstallResult {
+ Success = 0,
+ SuccessFileOverwritten = 1,
+ InstallError = 2,
+ ErrorBaseGame = 3,
+ ErrorFilenameExtension = 4,
+ };
+
+ m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>());
+ m_system.GetFileSystemController().CreateFactories(*m_vfs);
- void SetScreenRotation(u32 screen_rotation) {
- m_screen_rotation = screen_rotation;
+ std::shared_ptr<FileSys::NSP> nsp;
+ if (filename.ends_with("nsp")) {
+ nsp = std::make_shared<FileSys::NSP>(m_vfs->OpenFile(filename, FileSys::Mode::Read));
+ if (nsp->IsExtractedType()) {
+ return InstallError;
+ }
+ } else if (filename.ends_with("xci")) {
+ const auto xci =
+ std::make_shared<FileSys::XCI>(m_vfs->OpenFile(filename, FileSys::Mode::Read));
+ nsp = xci->GetSecurePartitionNSP();
+ } else {
+ return ErrorFilenameExtension;
+ }
+
+ if (!nsp) {
+ return InstallError;
+ }
+
+ if (nsp->GetStatus() != Loader::ResultStatus::Success) {
+ return InstallError;
+ }
+
+ const auto res = m_system.GetFileSystemController().GetUserNANDContents()->InstallEntry(
+ *nsp, true, copy_func);
+
+ switch (res) {
+ case FileSys::InstallResult::Success:
+ return Success;
+ case FileSys::InstallResult::OverwriteExisting:
+ return SuccessFileOverwritten;
+ case FileSys::InstallResult::ErrorBaseInstall:
+ return ErrorBaseGame;
+ default:
+ return InstallError;
+ }
}
void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir,
@@ -161,14 +225,14 @@ public:
m_window = std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window,
m_vulkan_library);
+ m_system.SetFilesystem(m_vfs);
+
// Initialize system.
auto android_keyboard = std::make_unique<SoftwareKeyboard::AndroidKeyboard>();
m_software_keyboard = android_keyboard.get();
m_system.SetShuttingDown(false);
m_system.ApplySettings();
m_system.HIDCore().ReloadInputDevices();
- m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>());
- m_system.SetFilesystem(std::make_shared<FileSys::RealVfsFilesystem>());
m_system.SetAppletFrontendSet({
nullptr, // Amiibo Settings
nullptr, // Controller Selector
@@ -180,7 +244,8 @@ public:
std::move(android_keyboard), // Software Keyboard
nullptr, // Web Browser
});
- m_system.GetFileSystemController().CreateFactories(*m_system.GetFilesystem());
+ m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>());
+ m_system.GetFileSystemController().CreateFactories(*m_vfs);
// Initialize account manager
m_profile_manager = std::make_unique<Service::Account::ProfileManager>();
@@ -281,6 +346,10 @@ public:
return GetRomMetadata(path).icon;
}
+ bool GetIsHomebrew(const std::string& path) {
+ return GetRomMetadata(path).isHomebrew;
+ }
+
void ResetRomMetadata() {
m_rom_metadata_cache.clear();
}
@@ -348,6 +417,7 @@ private:
struct RomMetadata {
std::string title;
std::vector<u8> icon;
+ bool isHomebrew;
};
RomMetadata GetRomMetadata(const std::string& path) {
@@ -360,11 +430,17 @@ private:
RomMetadata CacheRomMetadata(const std::string& path) {
const auto file = Core::GetGameFileFromPath(m_vfs, path);
- const auto loader = Loader::GetLoader(EmulationSession::GetInstance().System(), file, 0, 0);
+ auto loader = Loader::GetLoader(EmulationSession::GetInstance().System(), file, 0, 0);
RomMetadata entry;
loader->ReadTitle(entry.title);
loader->ReadIcon(entry.icon);
+ if (loader->GetFileType() == Loader::FileType::NRO) {
+ auto loader_nro = dynamic_cast<Loader::AppLoader_NRO*>(loader.get());
+ entry.isHomebrew = loader_nro->IsHomebrew();
+ } else {
+ entry.isHomebrew = false;
+ }
m_rom_metadata_cache[path] = entry;
@@ -388,14 +464,13 @@ private:
// Window management
std::unique_ptr<EmuWindow_Android> m_window;
ANativeWindow* m_native_window{};
- u32 m_screen_rotation{};
// Core emulation
Core::System m_system;
InputCommon::InputSubsystem m_input_subsystem;
Common::DetachedTasks m_detached_tasks;
Core::PerfStatsResults m_perf_stats{};
- std::shared_ptr<FileSys::RealVfsFilesystem> m_vfs;
+ std::shared_ptr<FileSys::VfsFilesystem> m_vfs;
Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized};
bool m_is_running{};
SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
@@ -414,10 +489,6 @@ private:
} // Anonymous namespace
-u32 GetAndroidScreenRotation() {
- return EmulationSession::GetInstance().ScreenRotation();
-}
-
static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
Common::Log::Initialize();
Common::Log::SetColorConsoleBackendEnabled(true);
@@ -461,19 +532,18 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env,
EmulationSession::GetInstance().SurfaceChanged();
}
-void Java_org_yuzu_yuzu_1emu_NativeLibrary_notifyOrientationChange(JNIEnv* env,
- [[maybe_unused]] jclass clazz,
- jint layout_option,
- jint rotation) {
- return EmulationSession::GetInstance().SetScreenRotation(static_cast<u32>(rotation));
-}
-
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env,
[[maybe_unused]] jclass clazz,
jstring j_directory) {
Common::FS::SetAppDirectory(GetJString(env, j_directory));
}
+int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env,
+ [[maybe_unused]] jclass clazz,
+ jstring j_file) {
+ return EmulationSession::GetInstance().InstallFileToNand(GetJString(env, j_file));
+}
+
void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver(
JNIEnv* env, [[maybe_unused]] jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir,
jstring custom_driver_name, jstring file_redirect_dir) {
@@ -662,6 +732,12 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCompany([[maybe_unused]] JNIEnv
return env->NewStringUTF("");
}
+jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHomebrew([[maybe_unused]] JNIEnv* env,
+ [[maybe_unused]] jclass clazz,
+ [[maybe_unused]] jstring j_filename) {
+ return EmulationSession::GetInstance().GetIsHomebrew(GetJString(env, j_filename));
+}
+
void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeEmulation
[[maybe_unused]] (JNIEnv* env, [[maybe_unused]] jclass clazz) {
// Create the default config.ini.
diff --git a/src/android/app/src/main/res/drawable/ic_system_update_alt.xml b/src/android/app/src/main/res/drawable/ic_system_update_alt.xml
new file mode 100644
index 000000000..0f6adfdb8
--- /dev/null
+++ b/src/android/app/src/main/res/drawable/ic_system_update_alt.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M140,800q-24,0 -42,-18t-18,-42v-520q0,-24 18,-42t42,-18h250v60L140,220v520h680v-520L570,220v-60h250q24,0 42,18t18,42v520q0,24 -18,42t-42,18L140,800ZM480,615L280,415l43,-43 127,127v-339h60v339l127,-127 43,43 -200,200Z"/>
+</vector>
diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml
new file mode 100644
index 000000000..795320e3e
--- /dev/null
+++ b/src/android/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,335 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.&lt;br /&gt;&lt;br /&gt;Bevor du beginnst, bitte halte deine <![CDATA[<b> prod.keys </b>]]> auf deinem Gerät bereit. .&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Mehr Infos</a>]]></string>
+ <string name="emulation_notification_channel_name">Emulation ist aktiv</string>
+ <string name="emulation_notification_channel_description">Zeigt eine dauerhafte Benachrichtigung an, wenn die Emulation läuft.</string>
+ <string name="emulation_notification_running">yuzu läuft</string>
+ <string name="notice_notification_channel_name">Hinweise und Fehler</string>
+ <string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
+ <string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht erlaubt!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Willkommen!</string>
+ <string name="welcome_description">Erfahre wie man &lt;b>yuzu&lt;/b> einrichtet und beginne mit der Emulation.</string>
+ <string name="get_started">Erste Schritte</string>
+ <string name="keys">Schlüssel</string>
+ <string name="keys_description">Wähle deine &lt;b>prod.keys&lt;/b> Datei mit dem Button unten aus.</string>
+ <string name="select_keys">Schlüssel auswählen</string>
+ <string name="games">Spiele</string>
+ <string name="games_description">Wähle mit dem Knopf unten den &lt;b>Spiele&lt;/b>-Ordner aus.</string>
+ <string name="done">Fertig</string>
+ <string name="done_description">Wir können loslegen.\nViel Spaß!</string>
+ <string name="text_continue">Fortsetzen</string>
+ <string name="next">Weiter</string>
+ <string name="back">Zurück</string>
+ <string name="add_games">Spiele hinzufügen</string>
+ <string name="add_games_description">Spieleverzeichnis auswählen</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Spiele</string>
+ <string name="home_search">Suche</string>
+ <string name="home_settings">Einstellungen</string>
+ <string name="empty_gamelist">Es wurden keine Dateien gefunden oder es wurde noch kein Spielverzeichnis ausgewählt.</string>
+ <string name="search_and_filter_games">Spiele suchen und filtern</string>
+ <string name="select_games_folder">Spieleverzeichnis auswählen</string>
+ <string name="select_games_folder_description">Erlaubt yuzu die Spieleliste zu füllen</string>
+ <string name="add_games_warning">Auswahl des Spieleverzeichnisses überspringen?</string>
+ <string name="add_games_warning_description">Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Spiele suchen</string>
+ <string name="games_dir_selected">Spieleverzeichnis ausgewählt</string>
+ <string name="install_prod_keys">prod.keys installieren</string>
+ <string name="install_prod_keys_description">Zum Entschlüsseln von Spielen benötigt</string>
+ <string name="install_prod_keys_warning">Hinzufügen der Schlüssel überspringen?</string>
+ <string name="install_prod_keys_warning_description">Für die Emulation von Spielen sind gültige Schlüssel erforderlich. Wenn du fortfährst, funktionieren nur Homebrew-Anwendungen.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Benachrichtigungen</string>
+ <string name="notifications_description">Erteile mit dem Knopf unten die Berechtigung, Benachrichtigungen zu senden.</string>
+ <string name="give_permission">Berechtigung erteilen</string>
+ <string name="notification_warning_description">yuzu wird dich nicht über wichtige Informationen benachrichtigen können.</string>
+ <string name="permission_denied">Zugriff verweigert</string>
+ <string name="permission_denied_description">Du hast diese Berechtigung zu oft verweigert und musst sie nun manuell in den Systemeinstellungen erteilen.</string>
+ <string name="about">Über</string>
+ <string name="about_description">Build-Version, Credits und mehr</string>
+ <string name="warning_help">Hilfe</string>
+ <string name="warning_skip">Überspringen</string>
+ <string name="warning_cancel">Abbrechen</string>
+ <string name="install_amiibo_keys">Amiibo-Schlüssel installieren</string>
+ <string name="install_amiibo_keys_description">Benötigt um Amiibos im Spiel zu verwenden</string>
+ <string name="invalid_keys_file">Ungültige Schlüsseldatei ausgewählt</string>
+ <string name="install_keys_success">Schlüssel erfolgreich installiert</string>
+ <string name="reading_keys_failure">Fehler beim Lesen der Schlüssel</string>
+ <string name="invalid_keys_error">Ungültige Schlüssel</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_gpu_driver">GPU-Treiber installieren</string>
+ <string name="install_gpu_driver_description">Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren</string>
+ <string name="advanced_settings">Erweiterte Einstellungen</string>
+ <string name="settings_description">Emulatoreinstellungen konfigurieren</string>
+ <string name="search_recently_played">Kürzlich gespielt</string>
+ <string name="search_recently_added">Kürzlich hinzugefügt</string>
+ <string name="search_retail">Spiele</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">yuzu-Ordner öffnen</string>
+ <string name="open_user_folder_description">yuzu\'s interne Dateien verwalten</string>
+ <string name="theme_and_color_description">Das Aussehen der App ändern</string>
+ <string name="no_file_manager">Kein Dateimanager gefunden</string>
+ <string name="notification_no_directory_link">yuzu-Verzeichnis konnte nicht geöffnet werden</string>
+ <string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Dateimanagers.</string>
+ <string name="manage_save_data">Speicherdaten verwalten</string>
+ <string name="manage_save_data_description">Speicherdaten gefunden. Bitte wähle unten eine Option aus.</string>
+ <string name="import_export_saves_description">Speicherdaten importieren oder exportieren</string>
+ <string name="import_export_saves_no_profile">Keine Speicherdaten gefunden. Bitte starte ein Spiel und versuche es erneut.</string>
+ <string name="save_file_imported_success">Erfolgreich importiert</string>
+ <string name="save_file_invalid_zip_structure">Ungültige Speicherverzeichnisstruktur</string>
+ <string name="save_file_invalid_zip_structure_description">Der erste Unterordnername muss die Titel-ID des Spiels sein.</string>
+ <string name="import_saves">Importieren</string>
+ <string name="export_saves">Exportieren</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia ist nicht real</string>
+ <string name="copied_to_clipboard">In die Zwischenablage kopiert</string>
+ <string name="about_app_description">Ein quelloffener Switch-Emulator</string>
+ <string name="contributors">Beitragende</string>
+ <string name="contributors_description">Gemacht mit \u2764 vom yuzu Team</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Build</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Early Access</string>
+ <string name="get_early_access">Early Access bekommen</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Neueste Features, frühzeitiger Zugriff auf Updates und mehr</string>
+ <string name="early_access_benefits">Early Access Vorteile</string>
+ <string name="cutting_edge_features">Neueste Features</string>
+ <string name="early_access_updates">Früherer Zugriff auf Updates</string>
+ <string name="no_manual_installation">Keine manuelle Installation</string>
+ <string name="prioritized_support">Priorisierte Unterstützung</string>
+ <string name="our_eternal_gratitude">Unsere ewige Dankbarkeit</string>
+ <string name="are_you_interested">Bist du interessiert?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Geschwindigkeitsbegrenzung aktivieren</string>
+ <string name="frame_limit_enable_description">Wenn aktiviert, wird die Emulationsgeschwindigkeit auf einen Prozentsatz der normalen Geschwindigkeit begrenzt.</string>
+ <string name="frame_limit_slider">Geschwindkeitsbegrenzung in Prozent</string>
+ <string name="frame_limit_slider_description">Legt den Prozentsatz der Bergrenzung der Emulationsgeschwindigkeit fest. Mit dem Standardwert von 100% wird die Emulation auf die normale Geschwindigkeit begrenzt. Höhere oder niedrigere Werte erhöhen oder verringern die Geschwindigkeitsbegrenzung.</string>
+ <string name="cpu_accuracy">CPU-Genauigkeit</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Dock-Modus</string>
+ <string name="use_docked_mode_description">Emuliert im Dock-Modus, was die Auflösung verbessert, aber die Leistung senkt.</string>
+ <string name="emulated_region">Emulierte Region</string>
+ <string name="emulated_language">Emulierte Sprache</string>
+ <string name="select_rtc_date">RTC-Datum auswählen</string>
+ <string name="select_rtc_time">RTC-Zeit auswählen</string>
+ <string name="use_custom_rtc">Benutzerdefinierte RTC aktivieren</string>
+ <string name="use_custom_rtc_description">Mit dieser Einstellung kann eine benutzerdefinierte Echtzeituhr unabhängig von der aktuellen Systemzeit verwendet werden.</string>
+ <string name="set_custom_rtc">Benutzerdefinierte RTC einstellen</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Genauigkeitsstufe</string>
+ <string name="renderer_resolution">Auflösung</string>
+ <string name="renderer_vsync">VSync-Modus</string>
+ <string name="renderer_aspect_ratio">Seitenverhältnis</string>
+ <string name="renderer_scaling_filter">Fensteranpassungsfilter</string>
+ <string name="renderer_anti_aliasing">Kantenglättungs-Methode</string>
+ <string name="renderer_force_max_clock">Maximale Taktfrequenz erzwingen (nur Adreno)</string>
+ <string name="renderer_force_max_clock_description">Erzwingt den Betrieb der GPU mit der maximal möglichen Taktfrequenz (Temperaturbeschränkungen werden weiterhin angewendet).</string>
+ <string name="renderer_asynchronous_shaders">Asynchrone Shader nutzen</string>
+ <string name="renderer_asynchronous_shaders_description">Kompiliert Shader asynchron, was Ruckler reduziert, aber zu Glitches führen kann.</string>
+ <string name="renderer_debug">Grafik-Debugging aktivieren</string>
+ <string name="renderer_debug_description">Wenn aktiviert, schaltet die Grafik-API in einen langsameren Debugging-Modus.</string>
+ <string name="use_disk_shader_cache">Nutze Festplatten-Shader-Cache</string>
+ <string name="use_disk_shader_cache_description">Ruckeln wird durch das Speichern und Laden von generierten Shadern auf der Festplatte reduziert.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Lautstärke</string>
+ <string name="audio_volume_description">Legt die Lautstärke der Audioausgabe fest.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Standard</string>
+ <string name="ini_saved">Einstellungen gespeichert</string>
+ <string name="gameid_saved">Einstellungen für %1$s gespeichert</string>
+ <string name="error_saving">Fehler beim Speichern von %1$s.ini: %2$s</string>
+ <string name="loading">Lädt...</string>
+ <string name="reset_setting_confirmation">Möchtest du diese Einstellung auf den Standardwert zurücksetzen?</string>
+ <string name="reset_to_default">Auf Standard zurücksetzen</string>
+ <string name="reset_all_settings">Alle Einstellungen zurücksetzen?</string>
+ <string name="reset_all_settings_description">Alle erweiterten Einstellungen werden auf ihren Standardwert zurückgesetzt. Dies kann nicht rückgängig gemacht werden.</string>
+ <string name="settings_reset">Einstellungen zurückgesetzt</string>
+ <string name="close">Schließen</string>
+ <string name="learn_more">Mehr erfahren</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">GPU-Treiber auswählen</string>
+ <string name="select_gpu_driver_title">Möchtest du deinen aktuellen GPU-Treiber ersetzen?</string>
+ <string name="select_gpu_driver_install">Installieren</string>
+ <string name="select_gpu_driver_default">Standard</string>
+ <string name="select_gpu_driver_install_success">%s wurde installiert</string>
+ <string name="select_gpu_driver_use_default">Standard GPU-Treiber wird verwendet</string>
+ <string name="select_gpu_driver_error">Ungültiger Treiber ausgewählt, Standard-Treiber wird verwendet!</string>
+ <string name="system_gpu_driver">System GPU-Treiber</string>
+ <string name="installing_driver">Treiber wird installiert...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Erweiterte Einstellungen</string>
+ <string name="preferences_settings">Einstellungen</string>
+ <string name="preferences_general">Allgemein</string>
+ <string name="preferences_system">System</string>
+ <string name="preferences_graphics">Grafik</string>
+ <string name="preferences_audio">Audio</string>
+ <string name="preferences_theme">Theme und Farbe</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">Das ROM ist verschlüsselt</string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[Bitte stelle sicher dass die <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> Datei installiert ist, damit Spiele entschlüsselt werden können.]]></string>
+ <string name="loader_error_video_core">Bei der Initialisierung des Videokerns ist ein Fehler aufgetreten</string>
+ <string name="loader_error_video_core_description">Dies wird normalerweise durch einen inkompatiblen GPU-Treiber verursacht. Die Installation eines passenden GPU-Treibers kann dieses Problem beheben.</string>
+ <string name="loader_error_invalid_format">ROM konnte nicht geladen werden</string>
+ <string name="loader_error_file_not_found">ROM-Datei existiert nicht</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Emulation beenden</string>
+ <string name="emulation_done">Fertig</string>
+ <string name="emulation_fps_counter">FPS Zähler</string>
+ <string name="emulation_toggle_controls">Steuerung umschalten</string>
+ <string name="emulation_rel_stick_center">Relative Stick-Mitte</string>
+ <string name="emulation_dpad_slide">DPad Slide</string>
+ <string name="emulation_haptics">Haptik</string>
+ <string name="emulation_show_overlay">Overlay anzeigen</string>
+ <string name="emulation_toggle_all">Alle umschalten</string>
+ <string name="emulation_control_adjust">Overlay anpassen</string>
+ <string name="emulation_control_scale">Größe</string>
+ <string name="emulation_control_opacity">Transparenz</string>
+ <string name="emulation_touch_overlay_reset">Overlay zurücksetzen</string>
+ <string name="emulation_touch_overlay_edit">Overlay bearbeiten</string>
+ <string name="emulation_pause">Emulation pausieren</string>
+ <string name="emulation_unpause">Emulation fortsetzen</string>
+ <string name="emulation_input_overlay">Overlay-Optionen</string>
+ <string name="emulation_game_loading">Spiel lädt…</string>
+
+ <string name="load_settings">Lädt Einstellungen...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Software-Tastatur</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Abbrechen</string>
+ <string name="continue_button">Fortsetzen</string>
+ <string name="system_archive_not_found">Systemarchiv nicht gefunden</string>
+ <string name="system_archive_general">Ein System-Archiv</string>
+ <string name="save_load_error">Speicher-/Ladefehler</string>
+ <string name="fatal_error">Schwerwiegender Fehler</string>
+ <string name="fatal_error_message">Ein schwerwiegender Fehler ist aufgetreten. Einzelheiten wurden im Log protokolliert.\nDas Fortsetzen der Emulation kann zu Abstürzen und Bugs führen.</string>
+ <string name="performance_warning">Das Deaktivieren dieser Einstellung führt zu erheblichen Leistungsverlusten! Für ein optimales Erlebnis wird empfohlen, sie aktiviert zu lassen.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Automatisch auswählen</string>
+ <string name="region_japan">Japan</string>
+ <string name="region_usa">USA</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Australien</string>
+ <string name="region_china">China</string>
+ <string name="region_korea">Korea</string>
+ <string name="region_taiwan">Taiwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japanisch (日本語)</string>
+ <string name="language_english">Englisch</string>
+ <string name="language_french">Französisch (Français)</string>
+ <string name="langauge_german">Deutsch (German)</string>
+ <string name="language_italian">Italienisch (Italiano)</string>
+ <string name="language_spanish">Spanisch (Español)</string>
+ <string name="language_chinese">Chinesisch (简体中文)</string>
+ <string name="language_korean">Koreanisch (한국어)</string>
+ <string name="language_dutch">Niederländisch (Nederlands)</string>
+ <string name="language_portuguese">Portugiesisch (Português)</string>
+ <string name="language_russian">Russisch (Русский)</string>
+ <string name="language_taiwanese">Taiwanesisch (台湾)</string>
+ <string name="language_british_english">Britisches Englisch</string>
+ <string name="language_canadian_french">Kanadisches Französisch (Français canadien)</string>
+ <string name="language_latin_american_spanish">Lateinamerikanisches Spanisch (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Vereinfachtes Chinesisch (简体中文)</string>
+ <string name="language_traditional_chinese">Traditionelles Chinesisch (正體中文)</string>
+ <string name="language_brazilian_portuguese">Brasilianisches Portugiesisch (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Keiner</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normal</string>
+ <string name="renderer_accuracy_high">Hoch</string>
+ <string name="renderer_accuracy_extreme">Extrem (Langsam)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Langsam)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Langsam)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Langsam)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Direkt (Aus)</string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (An)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Nächste-Nachbarn</string>
+ <string name="scaling_filter_bilinear">Bilinear</string>
+ <string name="scaling_filter_bicubic">Bikubisch</string>
+ <string name="scaling_filter_gaussian">Gaussian</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Keiner</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Standard (16:9)</string>
+ <string name="ratio_force_four_three">4:3 erzwingen</string>
+ <string name="ratio_force_twenty_one_nine">21:9 erzwingen</string>
+ <string name="ratio_force_sixteen_ten">Erzwinge 16:10</string>
+ <string name="ratio_stretch">Auf Fenster anpassen</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Auto</string>
+ <string name="cpu_accuracy_accurate">Akkurat</string>
+ <string name="cpu_accuracy_unsafe">Unsicher</string>
+ <string name="cpu_accuracy_paranoid">Paranoid (Langsam)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">Steuerkreuz</string>
+ <string name="gamepad_left_stick">Linker Analogstick</string>
+ <string name="gamepad_right_stick">Rechter Analogstick</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Screenshot</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Shader werden vorbereitet</string>
+ <string name="building_shaders">Shader werden erstellt</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">App-Theme ändern</string>
+ <string name="theme_default">Standard</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Theme-Modus ändern</string>
+ <string name="theme_mode_follow_system">System folgen</string>
+ <string name="theme_mode_light">Hell</string>
+ <string name="theme_mode_dark">Dunkel</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Schwarze Hintergünde verwenden</string>
+ <string name="use_black_backgrounds_description">Bei Verwendung des dunklen Themes, schwarze Hintergründe verwenden.</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml
new file mode 100644
index 000000000..a7b4ebef4
--- /dev/null
+++ b/src/android/app/src/main/res/values-es/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o keys no vienen incluidos.&lt;br /&gt;&lt;br /&gt;Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string>
+ <string name="emulation_notification_channel_name">Emulación activa</string>
+ <string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string>
+ <string name="emulation_notification_running">yuzu esta ejecutándose</string>
+ <string name="notice_notification_channel_name">Avisos y errores</string>
+ <string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string>
+ <string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">¡Bienvenido!</string>
+ <string name="welcome_description">Aprende cómo configurar &lt;b>yuzu&lt;/b> y avanza a la emulación.</string>
+ <string name="get_started">Empezar</string>
+ <string name="keys">Claves</string>
+ <string name="keys_description">Selecciona el archivo &lt;b>prod.keys&lt;/b> utilizando el botón de abajo.</string>
+ <string name="select_keys">Seleccionar las claves</string>
+ <string name="games">Juegos</string>
+ <string name="games_description">Selecciona la carpeta &lt;b>Games&lt;/b> utilizando el botón de abajo</string>
+ <string name="done">Hecho</string>
+ <string name="done_description">Todo listo.\n¡Disfrute de sus juegos!</string>
+ <string name="text_continue">Continuar</string>
+ <string name="next">Siguiente</string>
+ <string name="back">Atrás</string>
+ <string name="add_games">Añadir Juegos</string>
+ <string name="add_games_description">Selecciona la carpeta de juegos</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Juegos</string>
+ <string name="home_search">Buscar</string>
+ <string name="home_settings">Ajustes</string>
+ <string name="empty_gamelist">No se ha encontrado ningún archivo o aún no se ha seleccionado ningún directorio de juegos.</string>
+ <string name="search_and_filter_games">Busca y filtra juegos</string>
+ <string name="select_games_folder">Seleccionar carpeta de juegos</string>
+ <string name="select_games_folder_description">Permite que yuzu llene la lista de juegos</string>
+ <string name="add_games_warning">¿Omitir la selección de la carpeta de juegos?</string>
+ <string name="add_games_warning_description">No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Buscar Juegos</string>
+ <string name="games_dir_selected">Directorio de juegos seleccionado</string>
+ <string name="install_prod_keys">Instalar prod.keys</string>
+ <string name="install_prod_keys_description">Requerido para descifrar juegos</string>
+ <string name="install_prod_keys_warning">¿Omitir agregar claves?</string>
+ <string name="install_prod_keys_warning_description">Se requieren claves válidas para emular juegos. Solo las aplicaciones homebrew funcionarán si continúas.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Notificaciones</string>
+ <string name="notifications_description">Otorgue el permiso de notificación con el botón de abajo.</string>
+ <string name="give_permission">Conceder permiso</string>
+ <string name="notification_warning">¿Omitir conceder el permiso de notificación?</string>
+ <string name="notification_warning_description">yuzu no podrá notificarte información importante.</string>
+ <string name="permission_denied">Permiso denegado</string>
+ <string name="permission_denied_description">Negó este permiso demasiadas veces y ahora debe otorgarlo manualmente en la configuración del sistema.</string>
+ <string name="about">Acerca de</string>
+ <string name="about_description">Versión, créditos y más</string>
+ <string name="warning_help">Ayuda</string>
+ <string name="warning_skip">Siguiente</string>
+ <string name="warning_cancel">Cancelar</string>
+ <string name="install_amiibo_keys">Instalar clave de Amiiboo</string>
+ <string name="install_amiibo_keys_description">Necesario para usar Amiibo en el juego</string>
+ <string name="invalid_keys_file">Archivo de claves inválido seleccionado</string>
+ <string name="install_keys_success">Claves instaladas correctamente</string>
+ <string name="reading_keys_failure">Error al leer las claves de cifrado</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Verifique que sus claves acaben con la extensión .keys.\n\n
+ 2. Las claves no deben de estar almacenadas en la carpeta Descargas.\n\n
+ Resuelva el/los problema(s) y vuelva a intentarlo.
+ </string>
+ <string name="invalid_keys_error">Claves de cifrado no válidas</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string>
+ <string name="install_gpu_driver">Instalar driver de GPU</string>
+ <string name="install_gpu_driver_description">Instale drivers alternativos para obtener un rendimiento o una precisión potencialmente mejores</string>
+ <string name="advanced_settings">Opciones avanzadas</string>
+ <string name="settings_description">Configurar las opciones del emulador</string>
+ <string name="search_recently_played">Jugado recientemente</string>
+ <string name="search_recently_added">Añadido recientemente</string>
+ <string name="search_retail">Juegos</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Abrir la carpeta de yuzu</string>
+ <string name="open_user_folder_description">Administrar los archivos internos de yuzu</string>
+ <string name="theme_and_color_description">Modificar la apariencia de la aplicación</string>
+ <string name="no_file_manager">Explorador de archivos no encontrado</string>
+ <string name="notification_no_directory_link">No se pudo abrir la carpeta yuzu</string>
+ <string name="notification_no_directory_link_description">Por favor, busque la carpeta user con el panel lateral del explorador de archivos de forma manual.</string>
+ <string name="manage_save_data">Administrar datos de guardado</string>
+ <string name="manage_save_data_description">Guardar los datos encontrados. Por favor, seleccione una opción de abajo.</string>
+ <string name="import_export_saves_description">Importar o exportar archivos de guardado</string>
+ <string name="import_export_saves_no_profile">No se han encontrado datos de guardado. Por favor, ejecute un juego y vuelva a intentarlo.</string>
+ <string name="save_file_imported_success">Importado correctamente</string>
+ <string name="save_file_invalid_zip_structure">Estructura del directorio de guardado no válido</string>
+ <string name="save_file_invalid_zip_structure_description">El nombre de la primera subcarpeta debe ser el Title ID del juego.</string>
+ <string name="import_saves">Importar</string>
+ <string name="export_saves">Exportar</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia no es real</string>
+ <string name="copied_to_clipboard">Copiado al portapapeles</string>
+ <string name="about_app_description">Un emulador de Switch de código abierto</string>
+ <string name="contributors">Contribuidores</string>
+ <string name="contributors_description">Hecho con \u2764 del equipo yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Versión</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Early Access</string>
+ <string name="get_early_access">Conseguir Early Access</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Funciones de vanguardia, acceso anticipado a actualizaciones y más</string>
+ <string name="early_access_benefits">Beneficios Early Access</string>
+ <string name="cutting_edge_features">Características de vanguardia</string>
+ <string name="early_access_updates">Acceso anticipado a las actualizaciones</string>
+ <string name="no_manual_installation">Sin instalación manual</string>
+ <string name="prioritized_support">Soporte prioritario</string>
+ <string name="helping_game_preservation">Ayudarás a la preservación de juegos</string>
+ <string name="our_eternal_gratitude">Nuestra eterna gratitud</string>
+ <string name="are_you_interested">¿Estás interesado?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Activar limite de velocidad</string>
+ <string name="frame_limit_enable_description">Cuando está habilitado, la velocidad de emulación se limitará a un porcentaje específico de la velocidad normal.</string>
+ <string name="frame_limit_slider">Limitar porcentaje de velocidad</string>
+ <string name="frame_limit_slider_description">Especifica el porcentaje para limitar la velocidad de emulación. Con el valor predeterminado del 100 %, la emulación se limitará a la velocidad normal. Valores más altos o más bajos aumentarán o disminuirán el límite de velocidad.</string>
+ <string name="cpu_accuracy">Precisión de CPU</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Modo sobremesa</string>
+ <string name="use_docked_mode_description">Emula en modo sobremesa, lo que aumenta la resolución perjudicando el rendimiento.</string>
+ <string name="emulated_region">Región emulada</string>
+ <string name="emulated_language">Idioma emulado</string>
+ <string name="select_rtc_date">Seleccionar Fecha RTC</string>
+ <string name="select_rtc_time">Seleccionar Tiempo RTC</string>
+ <string name="use_custom_rtc">Habilitar RTC Personalizado</string>
+ <string name="use_custom_rtc_description">Esta configuración le permite configurar un reloj de tiempo real personalizado diferente a la hora actual de su sistema</string>
+ <string name="set_custom_rtc">Establecer RTC Personalizado</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Nivel de precisión</string>
+ <string name="renderer_resolution">Resolución</string>
+ <string name="renderer_vsync">Modo VSync</string>
+ <string name="renderer_aspect_ratio">Relación de aspecto</string>
+ <string name="renderer_scaling_filter">Filtro de adaptación de ventana</string>
+ <string name="renderer_anti_aliasing">Metodo Anti Aliasing</string>
+ <string name="renderer_force_max_clock">Forzar velocidad al máximo (solo Adreno)</string>
+ <string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
+ <string name="renderer_asynchronous_shaders">Usar shaders asíncronos</string>
+ <string name="renderer_asynchronous_shaders_description">Compila shaders de forma asincrónica, lo que reducirá los parones pero puede introducir fallos.</string>
+ <string name="renderer_debug">Habilitar la depuración de gráficos</string>
+ <string name="renderer_debug_description">Cuando esté marcado, la API de gráficos entra en un modo de depuración más lento.</string>
+ <string name="use_disk_shader_cache">Usar caché de shaders en disco</string>
+ <string name="use_disk_shader_cache_description">Reduzca los parones almacenando y cargando shaders generados en el disco.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Volumen</string>
+ <string name="audio_volume_description">Especifica el volumen de la salida de audio.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Predeterminado</string>
+ <string name="ini_saved">Configuración guardada</string>
+ <string name="gameid_saved">Configuración guardada para %1$s</string>
+ <string name="error_saving">Error guardando %1$s.ini: %2$s</string>
+ <string name="loading">Cargando...</string>
+ <string name="reset_setting_confirmation">¿Desea restablecer esta configuración a su valor predeterminado?</string>
+ <string name="reset_to_default">Restablecer a predeterminado</string>
+ <string name="reset_all_settings">¿Restablecer todas las configuraciones?</string>
+ <string name="reset_all_settings_description">Todas las configuraciones avanzadas se restablecerán a su configuración predeterminada. Esto no se puede deshacer.</string>
+ <string name="settings_reset">Reiniciar la configuracion</string>
+ <string name="close">Cerrar</string>
+ <string name="learn_more">Más información</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Seleccionar driver GPU</string>
+ <string name="select_gpu_driver_title">¿Quiere reemplazar el driver de GPU actual?</string>
+ <string name="select_gpu_driver_install">Instalar</string>
+ <string name="select_gpu_driver_default">Predeterminado</string>
+ <string name="select_gpu_driver_install_success">Instalado %s</string>
+ <string name="select_gpu_driver_use_default">Usando el driver de GPU por defecto </string>
+ <string name="select_gpu_driver_error">¡Driver no válido, utilizando el predeterminado del sistema!</string>
+ <string name="system_gpu_driver">Driver GPU del sistema</string>
+ <string name="installing_driver">Instalando driver...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Configuración avanzada</string>
+ <string name="preferences_settings">Ajustes</string>
+ <string name="preferences_general">General</string>
+ <string name="preferences_system">Sistema</string>
+ <string name="preferences_graphics">Gráficos</string>
+ <string name="preferences_audio">Audio</string>
+ <string name="preferences_theme">Tema y color</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">Su ROM está encriptada</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor, siga las guías para redumpear <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">cartuchos de juegos</a> o <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">titulos instalados</a>.]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[Por favor, compruebe que su archivo <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> está instalado, para que los juegos sean descifrados.]]></string>
+ <string name="loader_error_video_core">Ocurrió un error al inicializar el núcleo de video, posiblemente debido a una incompatibilidad con el driver seleccionado</string>
+ <string name="loader_error_video_core_description">Esto suele deberse a un driver de GPU incompatible. La instalación de un controlador de GPU personalizado puede resolver este problema.</string>
+ <string name="loader_error_invalid_format">No se pudo cargar la ROM</string>
+ <string name="loader_error_file_not_found">Archivo ROM no existe</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Salir de la emulación</string>
+ <string name="emulation_done">Hecho</string>
+ <string name="emulation_fps_counter">Contador de FPS</string>
+ <string name="emulation_toggle_controls">Alternar Controles</string>
+ <string name="emulation_rel_stick_center">Centro Relativo del Stick</string>
+ <string name="emulation_dpad_slide">Deslizamiento de la Cruceta</string>
+ <string name="emulation_haptics">Hápticos</string>
+ <string name="emulation_show_overlay">Mostrar pantalla</string>
+ <string name="emulation_toggle_all">Alternar Todo</string>
+ <string name="emulation_control_adjust">Ajustar pantalla</string>
+ <string name="emulation_control_scale">Escala</string>
+ <string name="emulation_control_opacity">Opacidad</string>
+ <string name="emulation_touch_overlay_reset">Reiniciar pantalla</string>
+ <string name="emulation_touch_overlay_edit">Editar pantalla</string>
+ <string name="emulation_pause">Pausar Emulación</string>
+ <string name="emulation_unpause">Reanudar Emulación</string>
+ <string name="emulation_input_overlay">Opciones de pantalla </string>
+ <string name="emulation_game_loading">Cargando juego...</string>
+
+ <string name="load_settings">Cargando configuración...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Software del teclado</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Abortar</string>
+ <string name="continue_button">Continuar</string>
+ <string name="system_archive_not_found">Archivo del sistema no encontrado</string>
+ <string name="system_archive_not_found_message">%s no se ha encontrado. Vacíe los archivos de su sistema.\nContinuar con la emulación puede provocar bloqueos y errores.</string>
+ <string name="system_archive_general">Un archivo del sistema</string>
+ <string name="save_load_error">Error de Guardado/Carga</string>
+ <string name="fatal_error">Error fatal</string>
+ <string name="fatal_error_message">Ocurrió un error fatal. Consulte el registro para obtener más detalles.\nContinuar con la emulación puede provocar bloqueos y errores.</string>
+ <string name="performance_warning">¡Desactivar esta configuración reducirá significativamente el rendimiento de la emulación! Para obtener la mejor experiencia, se recomienda dejar esta configuración habilitada.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Auto seleccionar</string>
+ <string name="region_japan">Japón</string>
+ <string name="region_usa">EEUU</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Australia</string>
+ <string name="region_china">China</string>
+ <string name="region_korea">Corea</string>
+ <string name="region_taiwan">Taiwán</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japonés (日本語)</string>
+ <string name="language_english">Inglés (English)</string>
+ <string name="language_french">Francés (Français)</string>
+ <string name="langauge_german">Alemán (deutsch)</string>
+ <string name="language_italian">Italiano (Italiano)</string>
+ <string name="language_spanish">Español (Español)</string>
+ <string name="language_chinese">Chino (简体中文)</string>
+ <string name="language_korean">Coreano (한국어)</string>
+ <string name="language_dutch">Holandés (nederlands)</string>
+ <string name="language_portuguese">Portugués (Português)</string>
+ <string name="language_russian">Ruso (Русский)</string>
+ <string name="language_taiwanese">Taiwanés (台湾)</string>
+ <string name="language_british_english">Inglés británico</string>
+ <string name="language_canadian_french">Francés Canadiense (Français canadien)</string>
+ <string name="language_latin_american_spanish">Español Latinoamericano (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Chino Simplificado (简体中文)</string>
+ <string name="language_traditional_chinese">Chino tradicional (正體中文)</string>
+ <string name="language_brazilian_portuguese">Portugués Brasileño (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Ninguno</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normal</string>
+ <string name="renderer_accuracy_high">Alto</string>
+ <string name="renderer_accuracy_extreme">Extremo (Lento)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">x1 (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Lento)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Lento)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Lento)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Inmediata (Desactivado)</string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (Activado)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relajado</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Vecino más próximo</string>
+ <string name="scaling_filter_bilinear">Bilineal</string>
+ <string name="scaling_filter_bicubic">Bicúbico</string>
+ <string name="scaling_filter_gaussian">Gaussiano</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolución</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Ninguno</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Predeterminado (16:9)</string>
+ <string name="ratio_force_four_three">Forzar 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Forzar 21:9</string>
+ <string name="ratio_force_sixteen_ten">Forzar 16:10</string>
+ <string name="ratio_stretch">Ajustar a la ventana</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Auto</string>
+ <string name="cpu_accuracy_accurate">Preciso</string>
+ <string name="cpu_accuracy_unsafe">Impreciso</string>
+ <string name="cpu_accuracy_paranoid">Paranoico (Lento)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">Cruceta</string>
+ <string name="gamepad_left_stick">Palanca izquierda</string>
+ <string name="gamepad_right_stick">Palanca derecha</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Captura de pantalla</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Preparando shaders</string>
+ <string name="building_shaders">Construyendo shaders</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Cambiar Tema</string>
+ <string name="theme_default">Predeterminado</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Cambiar modo del tema</string>
+ <string name="theme_mode_follow_system">Igual al sistema</string>
+ <string name="theme_mode_light">Claro</string>
+ <string name="theme_mode_dark">Oscuro</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Usar Fondos Negros</string>
+ <string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 000000000..905ab5c03
--- /dev/null
+++ b/src/android/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.&lt;br /&gt;&lt;br /&gt;Avant de commencer, veuillez localiser votre fichier <![CDATA[<b> prod.keys </b>]]> sur le stockage de votre appareil.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">En savoir plus</a>]]></string>
+ <string name="emulation_notification_channel_name">L\'émulation est active</string>
+ <string name="emulation_notification_channel_description">Affiche une notification persistante lorsque l\'émulation est en cours d\'exécution.</string>
+ <string name="emulation_notification_running">yuzu est en cours d\'exécution</string>
+ <string name="notice_notification_channel_name">Avis et erreurs</string>
+ <string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string>
+ <string name="notification_permission_not_granted">Permission de notification non accordée !</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Bienvenue !</string>
+ <string name="welcome_description">Apprenez à configurer &lt;b>yuzu&lt;/b> et passez à l\'émulation.</string>
+ <string name="get_started">Commencer</string>
+ <string name="keys">Clés</string>
+ <string name="keys_description">Sélectionnez votre fichier &lt;b>prod.keys&lt;/b> avec le bouton ci-dessous.</string>
+ <string name="select_keys">Sélectionner les clés</string>
+ <string name="games">Jeux</string>
+ <string name="games_description">Sélectionnez votre dossier &lt;b>de Jeux&lt;/b> avec le bouton ci-dessous.</string>
+ <string name="done">Terminé</string>
+ <string name="done_description">Vous êtes prêt.\nProfitez de vos jeux !</string>
+ <string name="text_continue">Continuer</string>
+ <string name="next">Suivant</string>
+ <string name="back">Retour</string>
+ <string name="add_games">Ajouter des jeux</string>
+ <string name="add_games_description">Sélectionner votre dossier de jeux</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Jeux</string>
+ <string name="home_search">Rechercher</string>
+ <string name="home_settings">Paramètres</string>
+ <string name="empty_gamelist">Aucun fichier n\'a été trouvé ou aucun répertoire de jeu n\'a encore été sélectionné.</string>
+ <string name="search_and_filter_games">Rechercher et filtrer les jeux</string>
+ <string name="select_games_folder">Sélectionner le dossier de jeux</string>
+ <string name="select_games_folder_description">Permet à yuzu de remplir la liste des jeux</string>
+ <string name="add_games_warning">Ne pas sélectionner le dossier des jeux ?</string>
+ <string name="add_games_warning_description">Les jeux ne seront pas affichés dans la liste des jeux si aucun dossier n\'est sélectionné.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Rechercher des jeux</string>
+ <string name="games_dir_selected">Répertoire de jeux sélectionné</string>
+ <string name="install_prod_keys">Installer prod.keys</string>
+ <string name="install_prod_keys_description">Nécessaire pour décrypter les jeux commerciaux.</string>
+ <string name="install_prod_keys_warning">Sauter l\'ajout des clés ?</string>
+ <string name="install_prod_keys_warning_description">Des clés valides sont nécessaires pour émuler des jeux commerciaux. Seules les applications homebrew fonctionneront si vous continuez.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Notifications</string>
+ <string name="notifications_description">Accordez l\'autorisation de notification avec le bouton ci-dessous.</string>
+ <string name="give_permission">Donner la permission</string>
+ <string name="notification_warning">Ne pas accorder la permission de notification ?</string>
+ <string name="notification_warning_description">yuzu ne pourra pas vous communiquer d\'informations importantes.</string>
+ <string name="permission_denied">Permission refusée</string>
+ <string name="permission_denied_description">Vous avez refusé cette permission trop de fois et vous devez maintenant l\'accorder manuellement dans les paramètres système.</string>
+ <string name="about">À propos</string>
+ <string name="about_description">Numéro de build, crédits et plus encore</string>
+ <string name="warning_help">Aide</string>
+ <string name="warning_skip">Sauter</string>
+ <string name="warning_cancel">Annuler</string>
+ <string name="install_amiibo_keys">Installer les clés Amiibo</string>
+ <string name="install_amiibo_keys_description">Nécessaire pour utiliser les Amiibo en jeu</string>
+ <string name="invalid_keys_file">Fichier de clés sélectionné invalide</string>
+ <string name="install_keys_success">Clés installées avec succès</string>
+ <string name="reading_keys_failure">Erreur lors de la lecture des clés de chiffrement</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Vérifiez que vos clés ont l\'extension .keys.\n\n
+ 2. Les clés ne doivent pas être stockées dans le dossier Téléchargements.\n\n
+ Résolvez le(s) problème(s) et réessayez.
+ </string>
+ <string name="invalid_keys_error">Clés de chiffrement invalides</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string>
+ <string name="install_gpu_driver">Installer le pilote du GPU</string>
+ <string name="install_gpu_driver_description">Installez des pilotes alternatifs pour des performances ou une précision potentiellement meilleures</string>
+ <string name="advanced_settings">Paramètres avancés</string>
+ <string name="settings_description">Configurer les paramètres de l\'émulateur</string>
+ <string name="search_recently_played">Joué récemment</string>
+ <string name="search_recently_added">Ajouté récemment</string>
+ <string name="search_retail">Commercial</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Ouvrir le dossier de yuzu</string>
+ <string name="open_user_folder_description">Gérer les fichiers internes de yuzu</string>
+ <string name="theme_and_color_description">Modifier l\'apparence de l\'application</string>
+ <string name="no_file_manager">Aucun gestionnaire de fichiers trouvé</string>
+ <string name="notification_no_directory_link">Impossible d\'ouvrir le répertoire de yuzu</string>
+ <string name="notification_no_directory_link_description">Veuillez localiser manuellement le dossier utilisateur avec le panneau latéral du gestionnaire de fichiers.</string>
+ <string name="manage_save_data">Gérer les données de sauvegarde</string>
+ <string name="manage_save_data_description">Données de sauvegarde trouvées. Veuillez sélectionner une option ci-dessous.</string>
+ <string name="import_export_saves_description">Importer ou exporter des fichiers de sauvegarde</string>
+ <string name="import_export_saves_no_profile">Aucune données de sauvegarde trouvées. Veuillez lancer un jeu et réessayer.</string>
+ <string name="save_file_imported_success">Importé avec succès</string>
+ <string name="save_file_invalid_zip_structure">Structure de répertoire de sauvegarde non valide</string>
+ <string name="save_file_invalid_zip_structure_description">Le nom du premier sous-dossier doit être l\'identifiant du titre du jeu.</string>
+ <string name="import_saves">Importer</string>
+ <string name="export_saves">Exporter</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia n\'est pas réel</string>
+ <string name="copied_to_clipboard">Copié dans le presse-papier</string>
+ <string name="about_app_description">Un émulateur Switch open source</string>
+ <string name="contributors">Contributeurs</string>
+ <string name="contributors_description">Fait avec \u2764 de l\'équipe yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Build</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Early Access</string>
+ <string name="get_early_access">Obtenir l\'Early Access</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Fonctionnalités de pointe, accès anticipé aux mises à jour, et plus encore</string>
+ <string name="early_access_benefits">Avantages de l\'Early Access</string>
+ <string name="cutting_edge_features">Fonctionnalités de pointe</string>
+ <string name="early_access_updates">Accès anticipé aux mises à jour</string>
+ <string name="no_manual_installation">Pas d\'installation manuelle</string>
+ <string name="prioritized_support">Assistance prioritaire</string>
+ <string name="helping_game_preservation">Contribuer à la préservation des jeux</string>
+ <string name="our_eternal_gratitude">Notre gratitude éternelle</string>
+ <string name="are_you_interested">Es tu intéressé ?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Activer la vitesse limite</string>
+ <string name="frame_limit_enable_description">Lorsqu\'elle est activée, la vitesse d\'émulation sera limitée à un pourcentage spécifié de la vitesse normale.</string>
+ <string name="frame_limit_slider">Limite en pourcentage de vitesse</string>
+ <string name="frame_limit_slider_description">Spécifie le pourcentage pour limiter la vitesse d\'émulation. Avec la valeur par défaut de 100%, l\'émulation sera limitée à la vitesse normale. Des valeurs supérieures ou inférieures augmenteront ou diminueront la limite de vitesse.</string>
+ <string name="cpu_accuracy">Précision du CPU</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Mode TV</string>
+ <string name="use_docked_mode_description">Émuler en mode TV augmente la résolution au détriment des performances.</string>
+ <string name="emulated_region">Région émulée</string>
+ <string name="emulated_language">Langue émulée</string>
+ <string name="select_rtc_date">Sélectionner la date RTC</string>
+ <string name="select_rtc_time">Sélectionner l\'heure RTC</string>
+ <string name="use_custom_rtc">Activer l\'horloge RTC personnalisée</string>
+ <string name="use_custom_rtc_description">Ce paramètre vous permet de définir une horloge en temps réel personnalisée distincte de l\'heure actuelle de votre système.</string>
+ <string name="set_custom_rtc">Définir l\'horloge RTC personnalisée</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Niveau de précision</string>
+ <string name="renderer_resolution">Résolution</string>
+ <string name="renderer_vsync">Mode VSync</string>
+ <string name="renderer_aspect_ratio">Format</string>
+ <string name="renderer_scaling_filter">Filtre de fenêtre adaptatif</string>
+ <string name="renderer_anti_aliasing">Méthode d\'anticrénelage :</string>
+ <string name="renderer_force_max_clock">Forcer la fréquence d\'horloge maximale (Adreno uniquement)</string>
+ <string name="renderer_force_max_clock_description">Force le GPU à fonctionner au maximum d\'horloges possibles (les contraintes thermiques seront toujours appliquées).</string>
+ <string name="renderer_asynchronous_shaders">Utiliser les shaders asynchrones</string>
+ <string name="renderer_asynchronous_shaders_description">Compile les shaders de manière asynchrone, ce qui réduira les saccades mais peut entraîner des problèmes visuels.</string>
+ <string name="renderer_debug">Activer le débogage des graphismes</string>
+ <string name="renderer_debug_description">Lorsque cette case est cochée, l\'API graphique entre dans un mode de débogage plus lent.</string>
+ <string name="use_disk_shader_cache">Utiliser les shader cache de disque</string>
+ <string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant les shaders générés sur le disque.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Volume</string>
+ <string name="audio_volume_description">Spécifie le volume de la sortie audio.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Défaut</string>
+ <string name="ini_saved">Paramètres enregistrés</string>
+ <string name="gameid_saved">Paramètres enregistrés pour %1$s</string>
+ <string name="error_saving">Erreur lors de l\'enregistrement de %1$s.ini: %2$s</string>
+ <string name="loading">Chargement...</string>
+ <string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string>
+ <string name="reset_to_default">Réinitialiser par défaut</string>
+ <string name="reset_all_settings">Réinitialiser tous les réglages ?</string>
+ <string name="reset_all_settings_description">Tous les paramètres avancés seront réinitialisés à leur configuration par défaut. Ça ne peut pas être annulé.</string>
+ <string name="settings_reset">Paramètres réinitialisés</string>
+ <string name="close">Fermer</string>
+ <string name="learn_more">Plus d\'informations</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Sélectionner le pilote du GPU</string>
+ <string name="select_gpu_driver_title">Souhaitez vous remplacer votre pilote actuel ?</string>
+ <string name="select_gpu_driver_install">Installer</string>
+ <string name="select_gpu_driver_default">Défaut</string>
+ <string name="select_gpu_driver_install_success">%s Installé</string>
+ <string name="select_gpu_driver_use_default">Utilisation du pilote de GPU par défaut</string>
+ <string name="select_gpu_driver_error">Pilote non valide sélectionné, utilisation du paramètre par défaut du système !</string>
+ <string name="system_gpu_driver">Pilote du GPU du système</string>
+ <string name="installing_driver">Installation du pilote...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Paramètres avancés</string>
+ <string name="preferences_settings">Paramètres</string>
+ <string name="preferences_general">Général</string>
+ <string name="preferences_system">Système</string>
+ <string name="preferences_graphics">Vidéo</string>
+ <string name="preferences_audio">Audio</string>
+ <string name="preferences_theme">Thème et couleur</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">Votre ROM est cryptée</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Veuillez suivre les guides pour redumper vos <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">cartouches de jeu</a> ou <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">titres installés</a>.]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[Veuillez vous assurer que votre fichier <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> est installé pour que les jeux puissent être déchiffrés.]]></string>
+ <string name="loader_error_video_core">Une erreur s\'est produite lors de l\'initialisation du noyau vidéo</string>
+ <string name="loader_error_video_core_description">Cela est généralement dû à un pilote du GPU incompatible. L\'installation d\'un pilote du GPU personnalisé peut résoudre ce problème.</string>
+ <string name="loader_error_invalid_format">Impossible de charger la ROM</string>
+ <string name="loader_error_file_not_found">Le fichier ROM n\'existe pas</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Quitter l\'émulation</string>
+ <string name="emulation_done">Terminé</string>
+ <string name="emulation_fps_counter">Compteur FPS</string>
+ <string name="emulation_toggle_controls">Activer/Désactiver les contrôles</string>
+ <string name="emulation_rel_stick_center">Centre du stick relatif</string>
+ <string name="emulation_dpad_slide">Glissement du DPad</string>
+ <string name="emulation_haptics">Haptique</string>
+ <string name="emulation_show_overlay">Afficher l\'overlay</string>
+ <string name="emulation_toggle_all">Tout basculer</string>
+ <string name="emulation_control_adjust">Ajuster l\'overlay</string>
+ <string name="emulation_control_scale">Échelle</string>
+ <string name="emulation_control_opacity">Opacité</string>
+ <string name="emulation_touch_overlay_reset">Réinitialiser l\'overlay</string>
+ <string name="emulation_touch_overlay_edit">Modifier l\'overlay</string>
+ <string name="emulation_pause">Mettre en pause l\'émulation</string>
+ <string name="emulation_unpause">Reprendre l\'émulation</string>
+ <string name="emulation_input_overlay">Options de l\'overlay</string>
+ <string name="emulation_game_loading">Chargement du jeu...</string>
+
+ <string name="load_settings">Chargement des paramètres…</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Clavier virtuel</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Abandonner</string>
+ <string name="continue_button">Continuer</string>
+ <string name="system_archive_not_found">Archive système introuvable</string>
+ <string name="system_archive_not_found_message">%s est manquant. Veuillez dumper vos archives système.\nContinuer peut entraîner des plantages et des bogues.</string>
+ <string name="system_archive_general">Une archive système</string>
+ <string name="save_load_error">Erreur de sauvegarde/chargement</string>
+ <string name="fatal_error">Erreur fatale</string>
+ <string name="fatal_error_message">Une erreur fatale s\'est produite. Consultez les logs pour plus de détails.\nContinuer l\'émulation peut entraîner des plantages et des bogues.</string>
+ <string name="performance_warning">La désactivation de ce paramètre réduira considérablement les performances d\'émulation ! Pour une expérience optimale, il est recommandé de laisser ce paramètre activé.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Sélection automatique</string>
+ <string name="region_japan">Japon</string>
+ <string name="region_usa">É.-U.A.</string>
+ <string name="region_europe">Europe</string>
+ <string name="region_australia">Australie</string>
+ <string name="region_china">Chine</string>
+ <string name="region_korea">Corée</string>
+ <string name="region_taiwan">Taïwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japonais (日本語)</string>
+ <string name="language_english">Anglais</string>
+ <string name="language_french">Français (Français)</string>
+ <string name="langauge_german">Allemand (Deutsch)</string>
+ <string name="language_italian">Italien (Italiano)</string>
+ <string name="language_spanish">Espagnol (Español)</string>
+ <string name="language_chinese">Chinois (简体中文)</string>
+ <string name="language_korean">Coréen (한국어)</string>
+ <string name="language_dutch">Néerlandais (Nederlands)</string>
+ <string name="language_portuguese">Portugais (Português)</string>
+ <string name="language_russian">Russe (Русский)</string>
+ <string name="language_taiwanese">Taïwanais (台湾)</string>
+ <string name="language_british_english">Anglais Britannique</string>
+ <string name="language_canadian_french">Français canadien (Français canadien)</string>
+ <string name="language_latin_american_spanish">Espagnol latino-américain (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Chinois simplifié (简体中文)</string>
+ <string name="language_traditional_chinese">Chinois Traditionnel (正體中文)</string>
+ <string name="language_brazilian_portuguese">Portugais brésilien (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Aucune</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normal</string>
+ <string name="renderer_accuracy_high">Haut</string>
+ <string name="renderer_accuracy_extreme">Extrême (Lent)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Lent)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Lent)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Lent)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Immédiat (Désactivé)</string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (Activé)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO souple</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Plus proche voisin</string>
+ <string name="scaling_filter_bilinear">Bilinéaire</string>
+ <string name="scaling_filter_bicubic">Bicubique</string>
+ <string name="scaling_filter_gaussian">Gaussien</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Aucune</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Par défaut (16:9)</string>
+ <string name="ratio_force_four_three">Forcer le 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Forcer le 21:9</string>
+ <string name="ratio_force_sixteen_ten">Forcer le 16:10</string>
+ <string name="ratio_stretch">Étirer à la fenêtre</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Auto</string>
+ <string name="cpu_accuracy_accurate">Précis</string>
+ <string name="cpu_accuracy_unsafe">Risqué</string>
+ <string name="cpu_accuracy_paranoid">Paranoïaque (Lent)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">Pavé directionnel</string>
+ <string name="gamepad_left_stick">Stick Gauche</string>
+ <string name="gamepad_right_stick">Stick Droit</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Capture d\'écran</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Préparation des shaders</string>
+ <string name="building_shaders">Compilation des shaders</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Changer le thème de l\'application</string>
+ <string name="theme_default">Défaut</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Changer le mode de thème</string>
+ <string name="theme_mode_follow_system">Automatique</string>
+ <string name="theme_mode_light">Lumineux</string>
+ <string name="theme_mode_dark">Sombre</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Utiliser des arrière-plans noirs</string>
+ <string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer des arrière-plans noirs.</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml
new file mode 100644
index 000000000..fede49650
--- /dev/null
+++ b/src/android/app/src/main/res/values-it/strings.xml
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.&lt;br /&gt;&lt;br /&gt;Prima di iniziare, perfavore individua il file <![CDATA[<b>prod.keys </b>]]> nella memoria del tuo dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Scopri di più</a>]]></string>
+ <string name="emulation_notification_channel_name">L\'emulatore è attivo</string>
+ <string name="emulation_notification_channel_description">Mostra una notifica persistente quando l\'emulatore è in esecuzione.</string>
+ <string name="emulation_notification_running">yuzu è in esecuzione</string>
+ <string name="notice_notification_channel_name">Avvisi ed errori</string>
+ <string name="notice_notification_channel_description">Mostra le notifiche quando qualcosa va storto.</string>
+ <string name="notification_permission_not_granted">Autorizzazione di notifica non concessa!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Benvenuto!</string>
+ <string name="welcome_description">Scopri come configurare &lt;b>yuzu&lt;/b> e passare all\'emulazione.</string>
+ <string name="get_started">Iniziare</string>
+ <string name="keys">Pulsanti</string>
+ <string name="keys_description">Seleziona il tuo file &lt;b>prod.keys&lt;/b> con il pulsante in basso.</string>
+ <string name="select_keys">Selezione Pulsanti</string>
+ <string name="games">Giochi</string>
+ <string name="games_description">Seleziona la cartella &lt;b>Games&lt;/b> con il pulsante in basso.</string>
+ <string name="done">Fatto</string>
+ <string name="done_description">È tutto pronto.\nDivertiti a giocare!</string>
+ <string name="text_continue">Continua</string>
+ <string name="next">Successivo</string>
+ <string name="back">Indietro</string>
+ <string name="add_games">Aggiungi giochi</string>
+ <string name="add_games_description">Seleziona la cartella dei giochi</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Giochi</string>
+ <string name="home_search">Cerca</string>
+ <string name="home_settings">Impostazioni</string>
+ <string name="empty_gamelist">Non sono stati trovati file o non è stata ancora selezionata alcuna directory di gioco.</string>
+ <string name="search_and_filter_games">Cerca e filtra i giochi</string>
+ <string name="select_games_folder">Seleziona la cartella di gioco</string>
+ <string name="select_games_folder_description">Consente a yuzu di popolare l\'elenco dei giochi</string>
+ <string name="add_games_warning">Saltare la selezione della cartella dei giochi?</string>
+ <string name="add_games_warning_description">I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Cerca giochi</string>
+ <string name="games_dir_selected">Cartella dei giochi selezionata</string>
+ <string name="install_prod_keys">Installa prod.keys</string>
+ <string name="install_prod_keys_description">Necessario per decrittografare i giochi</string>
+ <string name="install_prod_keys_warning">Saltare l\'aggiunta delle chiavi?</string>
+ <string name="install_prod_keys_warning_description">Sono necessarie delle chiavi valide per emulare i giochi. Se continui, funzioneranno solo le app homebrew.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Notifiche</string>
+ <string name="notifications_description">Concedi l\'autorizzazione alle notifiche con il pulsante in basso.</string>
+ <string name="give_permission">Concedere l\'autorizzazione</string>
+ <string name="notification_warning">Saltare la concessione dell\'autorizzazione alle notifiche?</string>
+ <string name="notification_warning_description">yuzu non sarà in grado di notificarti informazioni importanti.</string>
+ <string name="permission_denied">Permesso negato</string>
+ <string name="permission_denied_description">Hai negato l\'autorizzazione troppe volte ed ora devi concederla manualmente nelle impostazioni di sistema.</string>
+ <string name="about">Informazioni</string>
+ <string name="about_description">Versione build, crediti ed altro</string>
+ <string name="warning_help">Aiuto</string>
+ <string name="warning_skip">Salta</string>
+ <string name="warning_cancel">Annulla</string>
+ <string name="install_amiibo_keys">Installa le chiavi degli Amiibo</string>
+ <string name="install_amiibo_keys_description">Necessario per usare gli Amiibo in gioco</string>
+ <string name="invalid_keys_file">Selezionate chiavi non valide</string>
+ <string name="install_keys_success">Chiavi installate correttamente</string>
+ <string name="reading_keys_failure">Errore durante la lettura delle chiavi di crittografia</string>
+ <string name="install_keys_failure_extension_description">
+1. Verifica che le tue chiavi abbiano l\'estensione .keys.\n\n
+2. Le chiavi non devono essere archiviate nella cartella Download.\n\n
+Risolvi i problemi e riprova.</string>
+ <string name="invalid_keys_error">Chiavi di crittografia non valide</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string>
+ <string name="install_gpu_driver">Installa i driver GPU</string>
+ <string name="install_gpu_driver_description">Installa driver alternativi per potenziali prestazioni migliori o accuratezza.</string>
+ <string name="advanced_settings">Impostazioni avanzate</string>
+ <string name="settings_description">Configura le impostazioni dell\'emulatore</string>
+ <string name="search_recently_played">Giocato recentemente</string>
+ <string name="search_recently_added">Aggiunto recentemente</string>
+ <string name="search_retail">Rivenditore</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Apri la cartella di yuzu</string>
+ <string name="open_user_folder_description">Gestisci i file interni di yuzu</string>
+ <string name="theme_and_color_description">Modifica l\'aspetto dell\'app</string>
+ <string name="no_file_manager">Nessun file manager trovato</string>
+ <string name="notification_no_directory_link">Impossibile aprire la cartella di yuzu</string>
+ <string name="notification_no_directory_link_description">Per favore individua la cartella dell\'utente manualmente con il pannello laterale del file manager.</string>
+ <string name="manage_save_data">Gestisci i salvataggi</string>
+ <string name="manage_save_data_description">Salvataggio non trovato. Seleziona un\'opzione di seguito.</string>
+ <string name="import_export_saves_description">Importa o esporta i salvataggi</string>
+ <string name="import_export_saves_no_profile">Nessun salvataggio trovato. Avvia un gioco e riprova.</string>
+ <string name="save_file_imported_success">Importato con successo</string>
+ <string name="save_file_invalid_zip_structure">La struttura della cartella dei salvataggi è invalida</string>
+ <string name="save_file_invalid_zip_structure_description">La prima sotto cartella <b>deve</b> chiamarsi come l\'ID del titolo del gioco.</string>
+ <string name="import_saves">Importa</string>
+ <string name="export_saves">Esporta</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia non è reale</string>
+ <string name="copied_to_clipboard">Copiato negli appunti</string>
+ <string name="about_app_description">Un emulatore della Switch open-source.</string>
+ <string name="contributors">Collaboratori</string>
+ <string name="contributors_description">Realizzato con \u2764 dal team yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Compilazione</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Accesso Anticipato</string>
+ <string name="get_early_access">Ottieni l\'accesso anticipato</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Funzionalità all\'avanguardia, aggiornamenti in anticipo e altro</string>
+ <string name="early_access_benefits">Vantaggi dell\'accesso anticipato</string>
+ <string name="cutting_edge_features">Funzionalità all\'avanguardia</string>
+ <string name="early_access_updates">Accesso anticipato agli aggiornamenti</string>
+ <string name="no_manual_installation">Non installare manualmente.</string>
+ <string name="prioritized_support">Supporto prioritario</string>
+ <string name="helping_game_preservation">Aiuta a preservare il gioco</string>
+ <string name="our_eternal_gratitude">La nostra gratitudine eterna</string>
+ <string name="are_you_interested">Sei interessato?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Abilita il limite di velocità</string>
+ <string name="frame_limit_enable_description">Quando abilitato, la velocità di emulazione verrà limitata a una specifica percentuale della velocità normale.</string>
+ <string name="frame_limit_slider">Limite velocità percentuale</string>
+ <string name="frame_limit_slider_description">Specifica la percentuale del limite della velocità di emulazione. Con quella preimpostata al 100% l\'emulazione verrà limitata alla velocità normale. Valori più alti o bassi aumenteranno o diminuiranno il limite di velocità.</string>
+ <string name="cpu_accuracy">Accuratezza della CPU</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Modalità docked</string>
+ <string name="use_docked_mode_description">Emula in modalità docked, questo aumenta la risoluzione a spese delle performance.</string>
+ <string name="emulated_region">Regione emulata</string>
+ <string name="emulated_language">Lingua emulata</string>
+ <string name="select_rtc_date">Seleziona la data dall\'orologio in tempo reale</string>
+ <string name="select_rtc_time">Seleziona il tempo dall\'orologio in tempo reale</string>
+ <string name="use_custom_rtc">Abilità l\'orologio in tempo reale personalizzato</string>
+ <string name="use_custom_rtc_description">Questa impostazione ti permette di impostare un orologio in tempo reale personalizzato separato da quello del tuo sistema corrente.</string>
+ <string name="set_custom_rtc">Imposta l\'orologio in tempo reale personalizzato</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Livello di accuratezza</string>
+ <string name="renderer_resolution">Risoluzione</string>
+ <string name="renderer_vsync">Modalità VSync</string>
+ <string name="renderer_aspect_ratio">Rapporto d\'aspetto</string>
+ <string name="renderer_scaling_filter">Filtro di adattamento alla finestra</string>
+ <string name="renderer_anti_aliasing">Metodo di anti-aliasing</string>
+ <string name="renderer_force_max_clock">Forza clock massimi (solo Adreno)</string>
+ <string name="renderer_force_max_clock_description">Forza la GPU a girare col massimo clock possibile (i vincoli alla temperatura saranno comunque applicati)</string>
+ <string name="renderer_asynchronous_shaders">Usa shaders asincrone</string>
+ <string name="renderer_asynchronous_shaders_description">Compila le shaders asincronamente, questo riduce lo shutter ma potrebbe introdurre dei glitch. </string>
+ <string name="renderer_debug">Abilità il debug grafico</string>
+ <string name="renderer_debug_description">Quando l\'opzione è selezionata, l\'API grafica entra in una modalità di debug più lenta</string>
+ <string name="use_disk_shader_cache">Usa cache shader su disco</string>
+ <string name="use_disk_shader_cache_description">Riduce lo stuttering salvando e caricando le shader generate sul disco.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Volume</string>
+ <string name="audio_volume_description">Specifica il volume dell\'audio in uscita.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Predefinito</string>
+ <string name="ini_saved">Impostazioni salvate</string>
+ <string name="gameid_saved">Impostazioni salvate per %1$s</string>
+ <string name="error_saving">Errore nel salvare %1$s.ini %2$s</string>
+ <string name="loading">Caricamento…</string>
+ <string name="reset_setting_confirmation">Vuoi ripristinare queste impostazioni al loro valore originale?</string>
+ <string name="reset_to_default">Riportare alle impostazioni originali</string>
+ <string name="reset_all_settings">Resettare tutte le impostazioni?</string>
+ <string name="reset_all_settings_description">Tutte le Impostazioni Avanzate saranno ripristinate a quelle originali. Questa operazione non è reversibile</string>
+ <string name="settings_reset">Reimposta le impostazioni</string>
+ <string name="close">Chiudi</string>
+ <string name="learn_more">Per saperne di più</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Seleziona il driver della GPU</string>
+ <string name="select_gpu_driver_title">Vuoi sostituire il driver della tua GPU attuale?</string>
+ <string name="select_gpu_driver_install">Installa</string>
+ <string name="select_gpu_driver_default">Predefinito</string>
+ <string name="select_gpu_driver_install_success">Installato%s</string>
+ <string name="select_gpu_driver_use_default">Utilizza il driver predefinito della GPU.</string>
+ <string name="select_gpu_driver_error">Il driver selezionato è invalido, è in utilizzo quello predefinito di sistema!</string>
+ <string name="system_gpu_driver">Driver GPU del sistema</string>
+ <string name="installing_driver">Installando i driver...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Impostazioni Avanzate</string>
+ <string name="preferences_settings">Impostazioni</string>
+ <string name="preferences_general">Generali</string>
+ <string name="preferences_system">Sistema</string>
+ <string name="preferences_graphics">Grafica</string>
+ <string name="preferences_audio">Audio</string>
+ <string name="preferences_theme">Tema e colori</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">La tua ROM è criptata</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Per favore segui la guida per eseguire il dump della <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">cartuccia di gioco</a> o i <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">titoli installati</a>.]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[Per favore assicurati che il file <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> sia installato in modo che i giochi possano essere decrittati.]]></string>
+ <string name="loader_error_video_core">È stato riscontrato un errore nell\'inizializzazione del core video</string>
+ <string name="loader_error_video_core_description">Questo è causato solitamente dal driver incompatibile di una GPU. L\'installazione di driver GPU personalizzati potrebbe risolvere questo problema.</string>
+ <string name="loader_error_invalid_format">Impossibile caricare la ROM</string>
+ <string name="loader_error_file_not_found">Il file della ROM non esiste</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Uscire dall\'emulazione</string>
+ <string name="emulation_done">Fatto</string>
+ <string name="emulation_fps_counter">Contatore degli FPS</string>
+ <string name="emulation_toggle_controls">Controlli a interruttore</string>
+ <string name="emulation_rel_stick_center">Centro relativo degli Stick</string>
+ <string name="emulation_dpad_slide">Slittamento del Pad Direzionale</string>
+ <string name="emulation_haptics">Aptico</string>
+ <string name="emulation_show_overlay">Mostra Overlay</string>
+ <string name="emulation_toggle_all">Attiva/disattiva tutto</string>
+ <string name="emulation_control_adjust">Aggiusta Overlay</string>
+ <string name="emulation_control_scale">Scala</string>
+ <string name="emulation_control_opacity">Opacità</string>
+ <string name="emulation_touch_overlay_reset">Reimposta Overlay</string>
+ <string name="emulation_touch_overlay_edit">Modifica Overlay</string>
+ <string name="emulation_pause">Metti in pausa l\'emulazione</string>
+ <string name="emulation_unpause">Riprendi Emulazione</string>
+ <string name="emulation_input_overlay">Impostazioni Overlay</string>
+ <string name="emulation_game_loading">Caricamento del gioco...</string>
+
+ <string name="load_settings">Caricamento delle impostazioni...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Tastiera software</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Interrompi</string>
+ <string name="continue_button">Continua</string>
+ <string name="system_archive_not_found">Archivio di sistema non trovato</string>
+ <string name="system_archive_not_found_message">%s è mancante. Per favore esegui il dump degli archivi del tuo sistema.\nContinuare ad emulare potrebbe portare bug o causare crash.</string>
+ <string name="system_archive_general">Un archivio di sistema</string>
+ <string name="save_load_error">Errore di salvataggio/caricamento</string>
+ <string name="fatal_error">Errore Fatale</string>
+ <string name="fatal_error_message">Un errore fatale è accaduto. Controlla i log per i dettagli.\nContinuare ad emulare potrebbe portare bug o causare crash.</string>
+ <string name="performance_warning">Disattivare questa impostazione può ridurre significativamente le performance di emulazione! Per una migliore esperienza, è consigliato lasciare questa impostazione attivata.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Selezione automatica</string>
+ <string name="region_japan">Giappone</string>
+ <string name="region_usa">USA</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Australia</string>
+ <string name="region_china">Cina</string>
+ <string name="region_korea">Corea</string>
+ <string name="region_taiwan">Taiwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Giapponese (日本語)</string>
+ <string name="language_english">Inglese (English)</string>
+ <string name="language_french">Francese (Français)</string>
+ <string name="langauge_german">Tedesco (Deutsch)</string>
+ <string name="language_italian">Italiano (Italiano)</string>
+ <string name="language_spanish">Spagnolo (Español)</string>
+ <string name="language_chinese">Cinese (简体中文)</string>
+ <string name="language_korean">Coreano (한국어)</string>
+ <string name="language_dutch">Olandese (Nederlands)</string>
+ <string name="language_portuguese">Portoghese (Português)</string>
+ <string name="language_russian">Russo (Русский)</string>
+ <string name="language_taiwanese">Taiwanese (台湾)</string>
+ <string name="language_british_english">Inglese britannico</string>
+ <string name="language_canadian_french">Francese Canadese (Français canadien)</string>
+ <string name="language_latin_american_spanish">Spagnolo Latino Americano (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Cinese Semplificato (简体中文)</string>
+ <string name="language_traditional_chinese">Cinese tradizionale (正體中文)</string>
+ <string name="language_brazilian_portuguese">Portoghese (Português)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Nessuna</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normale</string>
+ <string name="renderer_accuracy_high">Alta</string>
+ <string name="renderer_accuracy_extreme">Estrema (Lenta)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Slow)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Slow)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Slow)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Immediato (Off)</string>
+ <string name="renderer_vsync_mailbox">Cassella postale</string>
+ <string name="renderer_vsync_fifo">FIFO (On)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Rilassato</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Nearest neighbor</string>
+ <string name="scaling_filter_bilinear">Bilineare</string>
+ <string name="scaling_filter_bicubic">Bicubico</string>
+ <string name="scaling_filter_gaussian">Gaussiano</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™️ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Nessuna</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Predefinito (16:9)</string>
+ <string name="ratio_force_four_three">Forza 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Forza 21:9</string>
+ <string name="ratio_force_sixteen_ten">Forza 16:10</string>
+ <string name="ratio_stretch">Allunga a finestra</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Automatico</string>
+ <string name="cpu_accuracy_accurate">Accurata</string>
+ <string name="cpu_accuracy_unsafe">Non sicura</string>
+ <string name="cpu_accuracy_paranoid">Paranoico (Lento)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">D-Pad</string>
+ <string name="gamepad_left_stick">Levetta sinistra</string>
+ <string name="gamepad_right_stick">Levetta destra</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Screenshot</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Preparazione degli shaders</string>
+ <string name="building_shaders">Costruendo gli shaders</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Cambia il tema dell\'app</string>
+ <string name="theme_default">Predefinito</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Cambia la modalità del tema</string>
+ <string name="theme_mode_follow_system">Segue il Sistema</string>
+ <string name="theme_mode_light">Chiaro</string>
+ <string name="theme_mode_dark">Scuro</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Usa sfondi neri</string>
+ <string name="use_black_backgrounds_description">Quando utilizzi il tema scuro, applica sfondi neri.</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 000000000..4a649778e
--- /dev/null
+++ b/src/android/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">このソフトウェアは、Nintendo Switch用のゲームを実行します。 ゲームソフトやキーは含まれません。&lt;br /&gt;&lt;br /&gt;事前に、 <![CDATA[<b> prod.keys </b>]]> ファイルをデバイスのストレージに配置しておいてください。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">詳細</a>]]></string>
+ <string name="emulation_notification_channel_name">エミュレーションが有効です</string>
+ <string name="emulation_notification_channel_description">エミュレーションの実行中に常設通知を表示します。</string>
+ <string name="emulation_notification_running">yuzu は実行中です</string>
+ <string name="notice_notification_channel_description">問題が発生したときに通知を表示します。</string>
+ <string name="notification_permission_not_granted">通知が許可されていません!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">ようこそ!</string>
+ <string name="welcome_description">&lt;b>yuzu&lt;/b> のセットアップ方法を学び、エミュレーションに飛び込みましょう。</string>
+ <string name="get_started">はじめる</string>
+ <string name="keys">キー</string>
+ <string name="keys_description">下のボタンから &lt;b>prod.keys&lt;/b> ファイルを選択してください。</string>
+ <string name="select_keys">キーを選択</string>
+ <string name="games">ゲーム</string>
+ <string name="games_description">下のボタンから&lt;b>ゲーム&lt;/b>があるフォルダを選択してください。</string>
+ <string name="done">完了</string>
+ <string name="done_description">準備が完了しました。\nゲームをお楽しみください!</string>
+ <string name="text_continue">続行</string>
+ <string name="next">次へ</string>
+ <string name="back">戻る</string>
+ <string name="add_games">ゲームを追加</string>
+ <string name="add_games_description">ゲームフォルダを選択</string>
+
+ <!-- Home strings -->
+ <string name="home_games">ゲーム</string>
+ <string name="home_search">検索</string>
+ <string name="home_settings">設定</string>
+ <string name="empty_gamelist">ファイルが見つからないか、ゲームディレクトリがまだ選択されていません。</string>
+ <string name="search_and_filter_games">ゲームの検索と絞り込み</string>
+ <string name="select_games_folder">ゲームフォルダを選択</string>
+ <string name="select_games_folder_description">yuzu がゲームリストに追加できるようにします</string>
+ <string name="add_games_warning">ゲームフォルダの選択をスキップしますか?</string>
+ <string name="add_games_warning_description">フォルダを選択しない場合、ゲームはゲームリストに表示されません。</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">ゲームを検索</string>
+ <string name="games_dir_selected">ゲームディレクトリが選択されました</string>
+ <string name="install_prod_keys">prod.keys をインストール</string>
+ <string name="install_prod_keys_description">ゲームの復号化に必要</string>
+ <string name="install_prod_keys_warning">キーの追加をスキップしますか?</string>
+ <string name="install_prod_keys_warning_description">製品版ゲームのエミュレーションには、有効なキーが必要です。続行すると自作アプリしか機能しません。</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">通知</string>
+ <string name="notifications_description">下のボタンで通知の権限を許可してください。</string>
+ <string name="give_permission">許可</string>
+ <string name="notification_warning">通知の許可をスキップしますか?</string>
+ <string name="notification_warning_description">yuzuは重要なお知らせを通知できません。</string>
+ <string name="permission_denied">権限が拒否されました</string>
+ <string name="permission_denied_description">この権限を複数回拒否したため、システム設定で手動で許可する必要があります。</string>
+ <string name="about">情報</string>
+ <string name="about_description">ビルドバージョン、クレジットなど</string>
+ <string name="warning_help">ヘルプ</string>
+ <string name="warning_skip">スキップ</string>
+ <string name="warning_cancel">キャンセル</string>
+ <string name="install_amiibo_keys">Amiibo キーをインストール</string>
+ <string name="install_amiibo_keys_description">ゲーム内での Amiibo の使用に必要</string>
+ <string name="invalid_keys_file">無効なキーファイルが選択されました</string>
+ <string name="install_keys_success">正常にインストールされました</string>
+ <string name="reading_keys_failure">暗号化キーの読み取りエラー</string>
+ <string name="install_keys_failure_extension_description">
+ 1. キーの拡張子が .keys であることを確認します。\n\n
+ 2. キーはダウンロードフォルダに保存しないでください。\n\n
+ 問題を解決して、再度お試しください。
+ </string>
+ <string name="invalid_keys_error">暗号化キーが無効です</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">選択されたファイルが不正または破損しています。キーを再ダンプしてください。</string>
+ <string name="install_gpu_driver">GPUドライバーをインストール</string>
+ <string name="install_gpu_driver_description">代替ドライバーをインストールしてパフォーマンスや精度を向上させます</string>
+ <string name="advanced_settings">高度な設定</string>
+ <string name="settings_description">エミュレーターの設定を構成します</string>
+ <string name="search_recently_played">最近プレイした</string>
+ <string name="search_recently_added">最近追加された</string>
+ <string name="search_retail">製品版</string>
+ <string name="search_homebrew">自作</string>
+ <string name="open_user_folder">yuzu フォルダを開く</string>
+ <string name="open_user_folder_description">yuzu内部のファイルを管理します</string>
+ <string name="theme_and_color_description">アプリの見た目を変更</string>
+ <string name="no_file_manager">ファイルマネージャーが見つかりませんでした</string>
+ <string name="notification_no_directory_link">yuzuのディレクトリを開けません</string>
+ <string name="notification_no_directory_link_description">ファイルマネージャのサイドパネルでユーザーフォルダを手動で探してください。</string>
+ <string name="manage_save_data">セーブデータを管理</string>
+ <string name="manage_save_data_description">セーブデータが見つかりました。以下のオプションから選択してください。</string>
+ <string name="import_export_saves_description">セーブファイルをインポート/エクスポート</string>
+ <string name="import_export_saves_no_profile">セーブデータがありません。ゲームを起動してから再度お試しください。</string>
+ <string name="save_file_imported_success">インポートが完了しました</string>
+ <string name="save_file_invalid_zip_structure">セーブデータのディレクトリ構造が無効です</string>
+ <string name="save_file_invalid_zip_structure_description">最初のサブフォルダ名は、ゲームのタイトルIDである必要があります。</string>
+ <string name="import_saves">インポート</string>
+ <string name="export_saves">エクスポート</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">ガイアは実在しない</string>
+ <string name="copied_to_clipboard">クリップボードにコピーしました</string>
+ <string name="about_app_description">オープンソースのSwitchエミュレータ</string>
+ <string name="contributors">貢献者</string>
+ <string name="contributors_description">yuzuチームの\u2764で作られた</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">ビルド</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">早期アクセス</string>
+ <string name="get_early_access">早期アクセスを手に入れる</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">最先端の機能、アップデートの早期アクセスなど</string>
+ <string name="early_access_benefits">早期アクセスのメリット</string>
+ <string name="cutting_edge_features">最先端の機能</string>
+ <string name="early_access_updates">アップデートの早期アクセス</string>
+ <string name="no_manual_installation">手動インストールが不要</string>
+ <string name="prioritized_support">優先的なサポート</string>
+ <string name="helping_game_preservation">ゲームの保存に貢献</string>
+ <string name="our_eternal_gratitude">私たちの永遠の感謝</string>
+ <string name="are_you_interested">興味がありますか?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">速度制限を有効化</string>
+ <string name="frame_limit_enable_description">有効にすると、エミュレーション速度が任意の割合に制限されます。</string>
+ <string name="frame_limit_slider">エミュレーション速度の制限</string>
+ <string name="frame_limit_slider_description">エミュレーション速度を制限する割合を指定します。デフォルトの100%では、エミュレーションは通常の速度に制限されます。値が高いまたは低いほど、速度制限が増加または減少します。</string>
+ <string name="cpu_accuracy">CPU精度</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">TVモード</string>
+ <string name="use_docked_mode_description">TVモードでエミュレートします。パフォーマンスが犠牲になりますが、解像度が向上します。</string>
+ <string name="emulated_region">地域</string>
+ <string name="emulated_language">言語</string>
+ <string name="select_rtc_date">RTCの日付を選択</string>
+ <string name="select_rtc_time">RTCの時刻を選択</string>
+ <string name="use_custom_rtc">カスタムRTC</string>
+ <string name="use_custom_rtc_description">現在のシステム時間とは別にカスタムのリアルタイムクロックを設定できます。</string>
+ <string name="set_custom_rtc">カスタムRTCを設定</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">精度</string>
+ <string name="renderer_resolution">解像度</string>
+ <string name="renderer_vsync">垂直同期モード</string>
+ <string name="renderer_aspect_ratio">アスペクト比</string>
+ <string name="renderer_scaling_filter">ウィンドウ適応フィルター</string>
+ <string name="renderer_anti_aliasing">アンチエイリアス方式</string>
+ <string name="renderer_force_max_clock">最大クロックを強制 (Adrenoのみ)</string>
+ <string name="renderer_force_max_clock_description">GPUを可能な限り最大クロックで動作させます (過熱制限は引き続き適用されます)。</string>
+ <string name="renderer_asynchronous_shaders">非同期シェーダー</string>
+ <string name="renderer_asynchronous_shaders_description">シェーダーを非同期でコンパイルします。コマ落ちが軽減されますが、不具合が発生する可能性があります。</string>
+ <string name="renderer_debug">グラフィックデバッグ</string>
+ <string name="renderer_debug_description">オンにすると、グラフィックAPI は低速のデバッグモードに入ります。</string>
+ <string name="use_disk_shader_cache">シェーダーキャッシュを使用</string>
+ <string name="use_disk_shader_cache_description">生成したシェーダーをディスクに保存して読み込むことで、コマ落ちを軽減します。</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">音量</string>
+ <string name="audio_volume_description">オーディオ出力の音量を指定します</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">デフォルト</string>
+ <string name="ini_saved">設定を保存しました</string>
+ <string name="gameid_saved">%1$sの設定を保存しました</string>
+ <string name="error_saving">%1$s.ini の保存エラー: %2$s</string>
+ <string name="loading">読み込み中…</string>
+ <string name="reset_setting_confirmation">この設定を初期値にリセットしますか?</string>
+ <string name="reset_to_default">初期設定に戻す</string>
+ <string name="reset_all_settings">すべての設定をリセットしますか?</string>
+ <string name="reset_all_settings_description">すべての詳細設定が初期設定に戻されます。この操作は元に戻せません。</string>
+ <string name="settings_reset">設定をリセットしました</string>
+ <string name="close">閉じる</string>
+ <string name="learn_more">詳細情報</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">GPUドライバを選択</string>
+ <string name="select_gpu_driver_title">現在のGPUドライバーを置き換えますか?</string>
+ <string name="select_gpu_driver_install">インストール</string>
+ <string name="select_gpu_driver_default">デフォルト</string>
+ <string name="select_gpu_driver_install_success">%s をインストールしました</string>
+ <string name="select_gpu_driver_use_default">デフォルトのGPUドライバーを使用します</string>
+ <string name="select_gpu_driver_error">選択されたドライバが無効なため、システムのデフォルトを使用します!</string>
+ <string name="system_gpu_driver">システムのGPUドライバ</string>
+ <string name="installing_driver">インストール中…</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">詳細設定</string>
+ <string name="preferences_settings">設定</string>
+ <string name="preferences_general">全般</string>
+ <string name="preferences_system">システム</string>
+ <string name="preferences_graphics">グラフィック</string>
+ <string name="preferences_audio">サウンド</string>
+ <string name="preferences_theme">テーマと色</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">ROMが暗号化されています</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">ゲームカートリッジ</a>や<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">インストール済みのタイトル</a>を再度ダンプするためのガイドに従ってください。]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[ゲームを復号化するために <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> ファイルがインストールされていることを確認してください。]]></string>
+ <string name="loader_error_video_core">ビデオコアの初期化中にエラーが発生しました</string>
+ <string name="loader_error_video_core_description">これは通常、互換性のないGPUドライバーが原因で発生します。 カスタムGPUドライバーをインストールすると、問題が解決する可能性があります。</string>
+ <string name="loader_error_invalid_format">ROMの読み込みに失敗しました</string>
+ <string name="loader_error_file_not_found">ROMファイルが存在しません</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">エミュレーションを終了</string>
+ <string name="emulation_done">完了</string>
+ <string name="emulation_fps_counter">FPSカウンター</string>
+ <string name="emulation_toggle_controls">コントロールを切り替え</string>
+ <string name="emulation_dpad_slide">十字キーのスライド操作</string>
+ <string name="emulation_haptics">振動</string>
+ <string name="emulation_show_overlay">オーバーレイを表示</string>
+ <string name="emulation_toggle_all">すべて選択</string>
+ <string name="emulation_control_adjust">オーバーレイを調整</string>
+ <string name="emulation_control_scale">大きさ</string>
+ <string name="emulation_control_opacity">不透明度</string>
+ <string name="emulation_touch_overlay_reset">リセット</string>
+ <string name="emulation_touch_overlay_edit">オーバーレイを編集</string>
+ <string name="emulation_pause">エミュレーションを一時停止</string>
+ <string name="emulation_unpause">エミュレーションを再開</string>
+ <string name="emulation_input_overlay">オーバーレイオプション</string>
+ <string name="emulation_game_loading">ロード中…</string>
+
+ <string name="load_settings">設定をロード中…</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">ソフトウェアキーボード</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">中断</string>
+ <string name="continue_button">続行</string>
+ <string name="system_archive_not_found">システムアーカイブが見つかりません</string>
+ <string name="system_archive_not_found_message">%s が見つかりません。システムアーカイブをダンプしてください。\nエミュレーションを続行すると、クラッシュやバグが発生する可能性があります。</string>
+ <string name="system_archive_general">システムアーカイブ</string>
+ <string name="save_load_error">セーブ/ロード エラー</string>
+ <string name="fatal_error">致命的なエラー</string>
+ <string name="fatal_error_message">致命的なエラーが発生しました。詳細はログを確認してください。\nエミュレーションを続行するとクラッシュやバグが発生する可能性があります。</string>
+ <string name="performance_warning">この設定をオフにすると、エミュレーションのパフォーマンスが著しく低下します!最高の体験を得るためには、この設定を有効にしておくことをお勧めします。</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">自動選択</string>
+ <string name="region_japan">日本</string>
+ <string name="region_usa">アメリカ</string>
+ <string name="region_europe">ヨーロッパ</string>
+ <string name="region_australia">オーストラリア</string>
+ <string name="region_china">中国</string>
+ <string name="region_korea">韓国</string>
+ <string name="region_taiwan">台湾</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">日本語</string>
+ <string name="language_english">英語</string>
+ <string name="language_french">フランス語 (Français)</string>
+ <string name="langauge_german">ドイツ語 (Deutsch)</string>
+ <string name="language_italian">イタリア語 (Italiano)</string>
+ <string name="language_spanish">スペイン語 (Español)</string>
+ <string name="language_chinese">中国語 (简体中文)</string>
+ <string name="language_korean">韓国語 (한국어)</string>
+ <string name="language_dutch">オランダ語 (Nederlands)</string>
+ <string name="language_portuguese">ポルトガル語 (Português)</string>
+ <string name="language_russian">ロシア語 (Русский)</string>
+ <string name="language_taiwanese">台湾語 (台湾)</string>
+ <string name="language_british_english">イギリス英語</string>
+ <string name="language_canadian_french">フランス語(カナダ) (Français canadien)</string>
+ <string name="language_latin_american_spanish">スペイン語(ラテンアメリカ) (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">中国語 (简体中文)</string>
+ <string name="language_traditional_chinese">繁体字中国語 (正體中文)</string>
+ <string name="language_brazilian_portuguese">ポルトガル語(ブラジル) (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">なし</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">標準</string>
+ <string name="renderer_accuracy_high">高い</string>
+ <string name="renderer_accuracy_extreme">最高 (低速)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (低速)</string>
+ <string name="resolution_three">3X (2160p/3240p) (低速)</string>
+ <string name="resolution_four">4X (2880p/4320p) (低速)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Immediate (オフ)</string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (オン)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Nearest Neighbor</string>
+ <string name="scaling_filter_bilinear">Bilinear</string>
+ <string name="scaling_filter_bicubic">Bicubic</string>
+ <string name="scaling_filter_gaussian">Gaussian</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">なし</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">デフォルト (16:9)</string>
+ <string name="ratio_force_four_three">強制 4:3</string>
+ <string name="ratio_force_twenty_one_nine">強制 21:9</string>
+ <string name="ratio_force_sixteen_ten">強制 16:10</string>
+ <string name="ratio_stretch">ウィンドウに合わせる</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">自動</string>
+ <string name="cpu_accuracy_accurate">正確</string>
+ <string name="cpu_accuracy_unsafe">不安定</string>
+ <string name="cpu_accuracy_paranoid">パラノイド (低速)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">方向ボタン</string>
+ <string name="gamepad_left_stick">Lスティック</string>
+ <string name="gamepad_right_stick">Rスティック</string>
+ <string name="gamepad_home">HOMEボタン</string>
+ <string name="gamepad_screenshot">スクリーンショット</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">シェーダーを準備しています</string>
+ <string name="building_shaders">シェーダーを構築しています</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">アプリのテーマ</string>
+ <string name="theme_default">デフォルト</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">テーマモード</string>
+ <string name="theme_mode_follow_system">システムに従う</string>
+ <string name="theme_mode_light">ライト</string>
+ <string name="theme_mode_dark">ダーク</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">黒色の背景を使用</string>
+ <string name="use_black_backgrounds_description">ダークテーマの使用時は、黒色の背景を有効にしてください。</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 000000000..43b00ebc4
--- /dev/null
+++ b/src/android/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">이 소프트웨어는 닌텐도 스위치 게임 콘솔용 게임을 실행합니다. 게임 타이틀이나 keys는 포함되어 있지 않습니다.&lt;br /&gt;&lt;br /&gt;시작하기 전에 장치 저장소에서 <![CDATA[<b> prod.keys </b>]]> 파일을 찾아주세요.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">자세히 알아보기</a>]]></string>
+ <string name="emulation_notification_channel_name">에뮬레이션이 활성화됨</string>
+ <string name="emulation_notification_channel_description">에뮬레이션이 실행 중일 때 영구 알림을 표시합니다.</string>
+ <string name="emulation_notification_running">yuzu가 실행 중입니다.</string>
+ <string name="notice_notification_channel_name">알림 및 오류</string>
+ <string name="notice_notification_channel_description">문제가 발생하면 알림을 표시합니다.</string>
+ <string name="notification_permission_not_granted">알림 권한이 부여되지 않았습니다!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">환영합니다!</string>
+ <string name="welcome_description">&lt;b>yuzu&lt;/b> 를 설정하고 에뮬레이션으로 이동하는 방법을 알아보세요.</string>
+ <string name="get_started">시작하기</string>
+ <string name="keys">Keys</string>
+ <string name="keys_description">아래 버튼을 사용하여 &lt;b>prod.keys&lt;/b> 파일을 선택합니다.</string>
+ <string name="select_keys">keys 선택</string>
+ <string name="games">게임</string>
+ <string name="games_description">아래 버튼으로 &lt;b>게임&lt;/b> 폴더를 선택합니다.</string>
+ <string name="done">완료</string>
+ <string name="done_description">모든 준비가 완료되었습니다.\n게임을 즐기세요!</string>
+ <string name="text_continue">계속</string>
+ <string name="next">다음</string>
+ <string name="back">뒤로</string>
+ <string name="add_games">게임 추가</string>
+ <string name="add_games_description">게임 폴더 선택</string>
+
+ <!-- Home strings -->
+ <string name="home_games">게임</string>
+ <string name="home_search">검색</string>
+ <string name="home_settings">설정</string>
+ <string name="empty_gamelist">파일을 찾을 수 없거나 아직 게임 디렉토리를 선택하지 않았습니다.</string>
+ <string name="search_and_filter_games">게임 검색 및 필터링</string>
+ <string name="select_games_folder">게임 폴더 선택</string>
+ <string name="select_games_folder_description">yuzu가 게임 목록을 채울 수 있도록 허용</string>
+ <string name="add_games_warning">게임 폴더 선택을 건너뛰겠습니까?</string>
+ <string name="add_games_warning_description">폴더를 선택하지 않으면 게임 목록에 게임이 표시되지 않습니다.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">게임 검색</string>
+ <string name="games_dir_selected">게임 디렉터리 선택</string>
+ <string name="install_prod_keys">prod.keys 설치</string>
+ <string name="install_prod_keys_description">판매용 게임 암호 해독에 요구</string>
+ <string name="install_prod_keys_warning">keys 추가를 건너뛰겠습니까?</string>
+ <string name="install_prod_keys_warning_description">정품 게임을 에뮬레이트하려면 유효한 keys가 필요합니다. 계속하면 자체 제작 앱만 작동합니다.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">알림</string>
+ <string name="notifications_description">아래 버튼으로 알림 권한을 부여합니다.</string>
+ <string name="give_permission">권한 부여</string>
+ <string name="notification_warning">알림 권한 부여를 건너뛰겠습니까?</string>
+ <string name="notification_warning_description">yuzu는 중요한 정보를 알려드리지 않습니다.</string>
+ <string name="permission_denied">권한 거부됨</string>
+ <string name="permission_denied_description">이 권한을 너무 많이 거부했으므로 이제 시스템 설정에서 수동으로 권한을 부여해야 합니다.</string>
+ <string name="about">정보</string>
+ <string name="about_description">빌드 버전, 크레딧 등</string>
+ <string name="warning_help">도움말</string>
+ <string name="warning_skip">건너뛰기</string>
+ <string name="warning_cancel">취소</string>
+ <string name="install_amiibo_keys">Amiibo keys 설치</string>
+ <string name="install_amiibo_keys_description">게임에서 아미보 사용 시 필요</string>
+ <string name="invalid_keys_file">잘못된 keys 파일 선택</string>
+ <string name="install_keys_success">keys가 성공적으로 설치됨</string>
+ <string name="reading_keys_failure">암호화 keys 읽기 오류</string>
+ <string name="install_keys_failure_extension_description">
+1. keys의 확장자가 .keys인지 확인하세요.\n\n
+2. keys는 다운로드 폴더에 저장하면 안 됩니다.\n\n
+문제를 해결하고 다시 시도하세요.
+</string>
+ <string name="invalid_keys_error">잘못된 암호화 keys</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">선택한 파일이 잘못되었거나 손상되었습니다. keys를 다시 덤프하세요.</string>
+ <string name="install_gpu_driver">GPU 드라이버 설치</string>
+ <string name="install_gpu_driver_description">잠재적으로 더 나은 성능 또는 정확성을 위해 대체 드라이버를 설치하세요.</string>
+ <string name="advanced_settings">고급 설정</string>
+ <string name="settings_description">에뮬레이터 설정 구성</string>
+ <string name="search_recently_played">최근 플레이한 게임</string>
+ <string name="search_recently_added">최근 추가한 게임</string>
+ <string name="search_retail">판매용</string>
+ <string name="search_homebrew">홈브류</string>
+ <string name="open_user_folder">yuzu 폴더 열기</string>
+ <string name="open_user_folder_description">yuzu의 내부 파일 관리</string>
+ <string name="theme_and_color_description">앱 모양 수정</string>
+ <string name="no_file_manager">파일 관리자를 찾을 수 없음</string>
+ <string name="notification_no_directory_link">yuzu 디렉토리를 열 수 없음</string>
+ <string name="notification_no_directory_link_description">파일 관리자의 사이드 패널에서 사용자 폴더를 수동으로 찾아주세요.</string>
+ <string name="manage_save_data">저장 데이터 관리</string>
+ <string name="manage_save_data_description">데이터를 저장했습니다. 아래에서 옵션을 선택하세요.</string>
+ <string name="import_export_saves_description">저장 파일 가져오기 또는 내보내기</string>
+ <string name="import_export_saves_no_profile">저장 데이터를 찾을 수 없습니다. 게임을 실행한 후 다시 시도하세요.</string>
+ <string name="save_file_imported_success">가져오기 성공</string>
+ <string name="save_file_invalid_zip_structure">저장 디렉터리 구조가 잘못됨</string>
+ <string name="save_file_invalid_zip_structure_description">첫 번째 하위 폴더 이름은 게임의 타이틀 ID여야 합니다.</string>
+ <string name="import_saves">가져오기</string>
+ <string name="export_saves">내보내기</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">가이아는 진짜가 아님</string>
+ <string name="copied_to_clipboard">클립보드에 복사</string>
+ <string name="about_app_description">오픈 소스 스위치 에뮬레이터</string>
+ <string name="contributors">기여자</string>
+ <string name="contributors_description">yuzu 팀의 \u2764로 제작</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">빌드</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">미리 체험하기</string>
+ <string name="get_early_access">미리 체험하기 신청</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">최첨단 기능, 미리 체험하기 업데이트 등</string>
+ <string name="early_access_benefits">미리 체험하기 혜택</string>
+ <string name="cutting_edge_features">최첨단 기능</string>
+ <string name="early_access_updates">미리 체험하기 업데이트</string>
+ <string name="no_manual_installation">수동 설치 불필요</string>
+ <string name="prioritized_support">우선 지원</string>
+ <string name="helping_game_preservation">게임 보존 도움주기</string>
+ <string name="our_eternal_gratitude">영원한 감사의 마음을 전합니다</string>
+ <string name="are_you_interested">관심 있으세요?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">제한 속도 활성화</string>
+ <string name="frame_limit_enable_description">활성화하면 에뮬레이션 속도가 정상 속도의 지정된 비율로 제한됩니다.</string>
+ <string name="frame_limit_slider">속도 제한 비율</string>
+ <string name="frame_limit_slider_description">에뮬레이션 속도를 제한할 비율을 지정합니다. 기본값인 100%로 설정하면 에뮬레이션이 정상 속도로 제한됩니다. 값이 높거나 낮으면 속도 제한이 증가하거나 감소합니다.</string>
+ <string name="cpu_accuracy">CPU 정확도</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">도킹 모드</string>
+ <string name="use_docked_mode_description">도킹 모드에서 에뮬레이션하면 성능이 저하되는 대신 해상도가 향상됩니다.</string>
+ <string name="emulated_region">에뮬레이트된 지역</string>
+ <string name="emulated_language">에뮬레이트된 언어</string>
+ <string name="select_rtc_date">RTC 날짜 선택</string>
+ <string name="select_rtc_time">RTC 시간 선택</string>
+ <string name="use_custom_rtc">커스텀 RTC 활성화</string>
+ <string name="use_custom_rtc_description">이 설정을 사용하면 현재 시스템 시간과 별도로 사용자 지정 실시간 시계를 설정할 수 있음</string>
+ <string name="set_custom_rtc">커스텀 RTC 설정</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">정확도 수준</string>
+ <string name="renderer_resolution">해상도</string>
+ <string name="renderer_vsync">수직동기화 모드</string>
+ <string name="renderer_aspect_ratio">화면비</string>
+ <string name="renderer_scaling_filter">창 적응 필터</string>
+ <string name="renderer_anti_aliasing">안티-에일리어싱 방법</string>
+ <string name="renderer_force_max_clock">최대 클럭 강제 설정 (아드레노만 해당)</string>
+ <string name="renderer_force_max_clock_description">GPU가 가능한 최대 클럭으로 실행되도록 강제합니다 (열 제약 조건은 여전히 적용됩니다).</string>
+ <string name="renderer_asynchronous_shaders">비동기 셰이더 사용</string>
+ <string name="renderer_asynchronous_shaders_description">셰이더를 비동기식으로 컴파일하므로 끊김 현상이 줄어들지만 글리치가 발생할 수 있습니다.</string>
+ <string name="renderer_debug">그래픽 디버깅 활성화</string>
+ <string name="renderer_debug_description">이 옵션을 선택하면 그래픽 API가 느린 디버깅 모드로 전환됩니다.</string>
+ <string name="use_disk_shader_cache">디스크 셰이더 캐시 사용</string>
+ <string name="use_disk_shader_cache_description">생성된 셰이더를 디스크에 저장하고 불러오기하여 끊김 현상을 줄입니다.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">볼륨</string>
+ <string name="audio_volume_description">오디오 출력의 볼륨을 지정합니다.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">기본값</string>
+ <string name="ini_saved">저장된 설정</string>
+ <string name="gameid_saved">%1$s를 위해 저장된 설정</string>
+ <string name="error_saving">%1$s.ini 저장 중 오류: %2$s</string>
+ <string name="loading">불러오기 중...</string>
+ <string name="reset_setting_confirmation">이 설정을 기본값으로 되돌리겠습니까?</string>
+ <string name="reset_to_default">기본값으로 재설정</string>
+ <string name="reset_all_settings">모든 설정을 초기화하겠습니까?</string>
+ <string name="reset_all_settings_description">모든 고급 설정이 기본 구성으로 재설정됩니다. 이 설정은 되돌릴 수 없습니다.</string>
+ <string name="settings_reset">설정 초기화</string>
+ <string name="close">닫기</string>
+ <string name="learn_more">자세히 알아보기</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">GPU 드라이버 선택</string>
+ <string name="select_gpu_driver_title">현재 사용 중인 GPU 드라이버를 교체하겠습니까?</string>
+ <string name="select_gpu_driver_install">설치</string>
+ <string name="select_gpu_driver_default">기본값</string>
+ <string name="select_gpu_driver_install_success">설치된 %s</string>
+ <string name="select_gpu_driver_use_default">기본 GPU 드라이버 사용</string>
+ <string name="select_gpu_driver_error">시스템 기본값을 사용하여 잘못된 드라이버를 선택했습니다!</string>
+ <string name="system_gpu_driver">시스템 GPU 드라이버</string>
+ <string name="installing_driver">드라이버 설치 중...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">고급 설정</string>
+ <string name="preferences_settings">설정</string>
+ <string name="preferences_general">일반</string>
+ <string name="preferences_system">시스템</string>
+ <string name="preferences_graphics">그래픽</string>
+ <string name="preferences_audio">오디오</string>
+ <string name="preferences_theme">테마 및 색상</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">롬이 암호화되었음</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[가이드에 따라 <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">게임 카트리지</a> 또는 <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">설치된 타이틀</a>를 다시 덤프하세요.]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[P게임을 해독할 수 있도록 <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 파일이 설치되어 있는지 확인하세요.]]></string>
+ <string name="loader_error_video_core">비디오 코어를 초기화하는 동안 오류 발생</string>
+ <string name="loader_error_video_core_description">이 문제는 일반적으로 호환되지 않는 GPU 드라이버로 인해 발생합니다. 사용자 지정 GPU 드라이버를 설치하면 이 문제가 해결될 수 있습니다.</string>
+ <string name="loader_error_invalid_format">롬을 불러올 수 없음</string>
+ <string name="loader_error_file_not_found">롬 파일이 존재하지 않음</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">에뮬레이션 종료</string>
+ <string name="emulation_done">완료</string>
+ <string name="emulation_fps_counter">FPS 카운터</string>
+ <string name="emulation_toggle_controls">토글 제어</string>
+ <string name="emulation_rel_stick_center">상대 스틱 센터</string>
+ <string name="emulation_dpad_slide">십자패드 슬라이드</string>
+ <string name="emulation_haptics">햅틱</string>
+ <string name="emulation_show_overlay">오버레이 표시</string>
+ <string name="emulation_toggle_all">모두 토글</string>
+ <string name="emulation_control_adjust">오버레이 조정</string>
+ <string name="emulation_control_scale">스케일</string>
+ <string name="emulation_control_opacity">불투명도</string>
+ <string name="emulation_touch_overlay_reset">오버레이 재설정</string>
+ <string name="emulation_touch_overlay_edit">오버레이 편집</string>
+ <string name="emulation_pause">에뮬레이션 일시 중지</string>
+ <string name="emulation_unpause">에뮬레이션 일시 중지 해제</string>
+ <string name="emulation_input_overlay">오버레이 옵션</string>
+ <string name="emulation_game_loading">게임 불러오기 중...</string>
+
+ <string name="load_settings">설정 불러오기 중...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">가상 키보드</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">정보</string>
+ <string name="continue_button">계속</string>
+ <string name="system_archive_not_found">시스템 아카이브를 찾을 수 없음</string>
+ <string name="system_archive_not_found_message">%s가 누락되었습니다. 시스템 아카이브를 덤프하세요.\n에뮬레이션을 계속하면 충돌 및 버그가 발생할 수 있습니다.</string>
+ <string name="system_archive_general">시스템 아카이브</string>
+ <string name="save_load_error">저장하기/불러오기 오류</string>
+ <string name="fatal_error">치명적인 오류</string>
+ <string name="fatal_error_message">치명적인 오류가 발생했습니다. 자세한 내용은 로그를 확인하십시오.\n에뮬레이션을 계속하면 충돌 및 버그가 발생할 수 있습니다.</string>
+ <string name="performance_warning">이 설정을 끄면 에뮬레이션 성능이 크게 저하됩니다! 최상의 환경을 위해 이 설정을 활성화된 상태로 두는 것이 좋습니다.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">자동 선택</string>
+ <string name="region_japan">일본</string>
+ <string name="region_usa">미국</string>
+ <string name="region_europe">유럽</string>
+ <string name="region_australia">호주</string>
+ <string name="region_china">중국</string>
+ <string name="region_korea">대한민국</string>
+ <string name="region_taiwan">타이완</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">일본어 (日本語)</string>
+ <string name="language_english">영어 (English)</string>
+ <string name="language_french">프랑스어 (Français)</string>
+ <string name="langauge_german">독일어(Deutsch)</string>
+ <string name="language_italian">이탈리아어 (Italiano)</string>
+ <string name="language_spanish">스페인어 (Español)</string>
+ <string name="language_chinese">중국어 (简体中文)</string>
+ <string name="language_korean">한국어 (Korean)</string>
+ <string name="language_dutch">네덜란드어 (Nederlands)</string>
+ <string name="language_portuguese">포르투갈어 (Português)</string>
+ <string name="language_russian">러시아어 (Русский)</string>
+ <string name="language_taiwanese">대만어 (台湾)</string>
+ <string name="language_british_english">영어 (British English)</string>
+ <string name="language_canadian_french">캐나다 프랑스어 (Français canadien)</string>
+ <string name="language_latin_american_spanish">라틴 아메리카 스페인어 (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">중국어 간체 (简体中文)</string>
+ <string name="language_traditional_chinese">중국어 번체 (正體中文)</string>
+ <string name="language_brazilian_portuguese">브라질 포르투갈어 (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">불칸</string>
+ <string name="renderer_none">없음</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">보통</string>
+ <string name="renderer_accuracy_high">높음</string>
+ <string name="renderer_accuracy_extreme">극한 (느림)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (느림)</string>
+ <string name="resolution_three">3X (2160p/3240p) (느림)</string>
+ <string name="resolution_four">4X (2880p/4320p) (느림)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">즉시 (끔)</string>
+ <string name="renderer_vsync_mailbox">메일박스</string>
+ <string name="renderer_vsync_fifo">FIFO (켬)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO 릴랙스</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">가장 가까운 이웃</string>
+ <string name="scaling_filter_bilinear">이중선형</string>
+ <string name="scaling_filter_bicubic">고등차수보간</string>
+ <string name="scaling_filter_gaussian">가우시안</string>
+ <string name="scaling_filter_scale_force">스케일포스</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ 초고해상도</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">없음</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">기본 (16:9)</string>
+ <string name="ratio_force_four_three">강제 4:3</string>
+ <string name="ratio_force_twenty_one_nine">강제 21:9</string>
+ <string name="ratio_force_sixteen_ten">강제 16:10</string>
+ <string name="ratio_stretch">창에 맞게 늘림</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">자동</string>
+ <string name="cpu_accuracy_accurate">정확함</string>
+ <string name="cpu_accuracy_unsafe">안전하지 않음</string>
+ <string name="cpu_accuracy_paranoid">편집증 (느림)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">십자패드</string>
+ <string name="gamepad_left_stick">L 스틱</string>
+ <string name="gamepad_right_stick">R 스틱</string>
+ <string name="gamepad_home">홈</string>
+ <string name="gamepad_screenshot">스크린샷</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">셰이더 준비하기</string>
+ <string name="building_shaders">셰이더 빌드 중</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">앱 테마 변경</string>
+ <string name="theme_default">기본값</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">테마 모드 변경</string>
+ <string name="theme_mode_follow_system">팔로우 시스템</string>
+ <string name="theme_mode_light">밝음</string>
+ <string name="theme_mode_dark">어두움</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">검은색 배경 사용</string>
+ <string name="use_black_backgrounds_description">어두운 테마를 사용할 때는 검은색 배경을 적용합니다.</string>
+
+</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
new file mode 100644
index 000000000..80213aed4
--- /dev/null
+++ b/src/android/app/src/main/res/values-nb/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.&lt;br /&gt;&lt;br /&gt;Før du begynner, må du finne <![CDATA[<b> prod.keys </b>]]> filen din på enhetslagringen.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Lær mer</a>]]></string>
+ <string name="emulation_notification_channel_name">Emulering er aktiv</string>
+ <string name="emulation_notification_channel_description">Viser et vedvarende varsel når emuleringen kjører.</string>
+ <string name="emulation_notification_running">Yuzu kjører</string>
+ <string name="notice_notification_channel_name">Merknader og feil</string>
+ <string name="notice_notification_channel_description">Viser varsler når noe går galt.</string>
+ <string name="notification_permission_not_granted">Varslingstillatelse ikke gitt!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Velkommen!</string>
+ <string name="welcome_description">Lær å sette opp &lt;b>yuzu&lt;/b> og hopp inn i emulering.</string>
+ <string name="get_started">Kom i gang</string>
+ <string name="keys">Nøkler</string>
+ <string name="keys_description">Velg din &lt;b>prod.keys&lt;/b> fil ved å bruke knappen under.</string>
+ <string name="select_keys">Velg nøkler</string>
+ <string name="games">Spill</string>
+ <string name="games_description">Velg din &lt;b>Spill&lt;/b> mappe ved å bruke knappen under.</string>
+ <string name="done">Ferdig</string>
+ <string name="done_description">Nå er du klar.\nGled deg til å spille!</string>
+ <string name="text_continue">Fortsett</string>
+ <string name="next">Neste</string>
+ <string name="back">Tilbake</string>
+ <string name="add_games">Legg til spill</string>
+ <string name="add_games_description">Velg din spillmappe</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Spill</string>
+ <string name="home_search">Søk</string>
+ <string name="home_settings">Innstillinger</string>
+ <string name="empty_gamelist">Ingen filer ble funnet eller ingen spillkatalog er valgt ennå.</string>
+ <string name="search_and_filter_games">Søk og filtrer spill</string>
+ <string name="select_games_folder">Velg spillmappe</string>
+ <string name="select_games_folder_description">Gjør det mulig for yuzu å fylle ut spillelisten.</string>
+ <string name="add_games_warning">Hoppe over valg av spillmappe?</string>
+ <string name="add_games_warning_description">Spill vises ikke i Spill-listen hvis en mappe ikke er valgt.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Søk i spill</string>
+ <string name="games_dir_selected">Spillkatalogen er valgt</string>
+ <string name="install_prod_keys">Installer prod.keys</string>
+ <string name="install_prod_keys_description">Nødvendig for å dekryptere spill</string>
+ <string name="install_prod_keys_warning">Hoppe over å legge til nøkler?</string>
+ <string name="install_prod_keys_warning_description">Gyldige nøkler er påkrevd for å emulere spill. Bare hjemmebryggede apper vil fungere hvis du fortsetter.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Varsler</string>
+ <string name="notifications_description">Gi varslingstillatelse med knappen nedenfor.</string>
+ <string name="give_permission">Gi tillatelse</string>
+ <string name="notification_warning">Hoppe over å gi tillatelse til varsling?</string>
+ <string name="notification_warning_description">yuzu vil ikke kunne varsle deg om viktig informasjon.</string>
+ <string name="permission_denied">Tillatelse avslått</string>
+ <string name="permission_denied_description">Du har nektet denne tillatelsen for mange ganger, og nå må du gi den manuelt i systeminnstillingene.</string>
+ <string name="about">Om</string>
+ <string name="about_description">Byggeversjon, kildehenvisninger og mer</string>
+ <string name="warning_help">Hjelp</string>
+ <string name="warning_skip">Hopp over</string>
+ <string name="warning_cancel">Avbryt</string>
+ <string name="install_amiibo_keys">Installer Amiibo-nøkler</string>
+ <string name="install_amiibo_keys_description">Kreves for å bruke Amiibo i spillet</string>
+ <string name="invalid_keys_file">Ugyldig nøkkelfil valgt</string>
+ <string name="install_keys_success">Nøkler vellykket installert</string>
+ <string name="reading_keys_failure">Feil ved lesing av krypteringsnøkler</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Kontroller at nøklene har filtypen .keys.\n\n
+ 2. Nøkler må ikke lagres i nedlastingsmappen.\n\n
+ Løs problemet/problemene og prøv igjen.
+ </string>
+ <string name="invalid_keys_error">Ugyldige krypteringsnøkler</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">Den valgte filen er feil eller ødelagt. Vennligst dump nøklene på nytt.</string>
+ <string name="install_gpu_driver">Installer GPU-driver</string>
+ <string name="install_gpu_driver_description">Installer alternative drivere for potensielt bedre ytelse eller nøyaktighet.</string>
+ <string name="advanced_settings">Avanserte innstillinger</string>
+ <string name="settings_description">Konfigurere emulatorinnstillinger</string>
+ <string name="search_recently_played">Nylig spilt</string>
+ <string name="search_recently_added">Nylig lagt til</string>
+ <string name="search_retail">Butikkhandel</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Åpne yuzu-mappen</string>
+ <string name="open_user_folder_description">Administrere yuzus interne filer</string>
+ <string name="theme_and_color_description">Endre appens utseende</string>
+ <string name="no_file_manager">Ingen filbehandler funnet</string>
+ <string name="notification_no_directory_link">Kunne ikke åpne yuzu-katalogen</string>
+ <string name="notification_no_directory_link_description">Finn brukermappen manuelt med filbehandlingens sidepanel.</string>
+ <string name="manage_save_data">Administrere lagringsdata</string>
+ <string name="manage_save_data_description">Lagringsdata funnet. Velg et alternativ nedenfor.</string>
+ <string name="import_export_saves_description">Importer eller eksporter lagringsfiler</string>
+ <string name="import_export_saves_no_profile">Ingen lagringsdata funnet. Start et nytt spill og prøv på nytt.</string>
+ <string name="save_file_imported_success">Vellykket import</string>
+ <string name="save_file_invalid_zip_structure">Ugyldig struktur for lagringskatalog</string>
+ <string name="save_file_invalid_zip_structure_description">Det første undermappenavnet må være spillets tittel-ID.</string>
+ <string name="import_saves">Importer</string>
+ <string name="export_saves">Eksporter</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia er ikke ekte</string>
+ <string name="copied_to_clipboard">Kopiert til utklippstavlen</string>
+ <string name="about_app_description">En Switch-emulator med åpen kildekode</string>
+ <string name="contributors">Bidragsytere</string>
+ <string name="contributors_description">Laget med \u2764 fra yuzu-teamet</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Bygg</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Tidlig tilgang</string>
+ <string name="get_early_access">Få tidlig tilgang</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Banebrytende funksjoner, tidlig tilgang til oppdateringer og mye mer.</string>
+ <string name="early_access_benefits">Fordeler ved tidlig tilgang</string>
+ <string name="cutting_edge_features">Avanserte funksjoner</string>
+ <string name="early_access_updates">Tidlig tilgang til oppdateringer</string>
+ <string name="no_manual_installation">Ingen manuell installasjon</string>
+ <string name="prioritized_support">Prioritert støtte</string>
+ <string name="helping_game_preservation">Bidra til bevaring av spill</string>
+ <string name="our_eternal_gratitude">Vår evige takknemlighet</string>
+ <string name="are_you_interested">Er du interessert?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Aktiver hastighetsbegrensning</string>
+ <string name="frame_limit_enable_description">Når aktivert, begrenses emuleringshastigheten til en angitt prosentandel av normal hastighet.</string>
+ <string name="frame_limit_slider">Hastighetsbegrensning i prosent</string>
+ <string name="frame_limit_slider_description">Angir prosentandelen som skal begrense emuleringshastigheten. Med standardverdien 100 % vil emuleringen være begrenset til normal hastighet. Høyere eller lavere verdier vil øke eller redusere hastighetsbegrensningen.</string>
+ <string name="cpu_accuracy">CPU-nøyaktighet</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Dokket modus</string>
+ <string name="use_docked_mode_description">Emulerer i dokket modus, noe som øker oppløsningen på bekostning av ytelsen.</string>
+ <string name="emulated_region">Emulert region</string>
+ <string name="emulated_language">Emulert språk</string>
+ <string name="select_rtc_date">Velg RTC-dato</string>
+ <string name="select_rtc_time">Velg RTC-tid</string>
+ <string name="use_custom_rtc">Aktiver egendefinert RTC</string>
+ <string name="use_custom_rtc_description">Med denne innstillingen kan du stille inn en egendefinert sanntidsklokke som er atskilt fra gjeldende systemtid.</string>
+ <string name="set_custom_rtc">Angi egendefinert RTC</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Nøyaktighetsnivå</string>
+ <string name="renderer_resolution">Oppløsning</string>
+ <string name="renderer_vsync">VSync-modus</string>
+ <string name="renderer_aspect_ratio">Størrelsesforhold</string>
+ <string name="renderer_scaling_filter">Filter for vindustilpasning</string>
+ <string name="renderer_anti_aliasing">Anti-Aliasing-metode</string>
+ <string name="renderer_force_max_clock">Tving fram maksimal klokkefrekvens (kun Adreno)</string>
+ <string name="renderer_force_max_clock_description">Tvinger GPU-en til å kjøre med maksimal klokkefrekvens (termiske begrensninger vil fortsatt gjelde).</string>
+ <string name="renderer_asynchronous_shaders">Bruk asynkrone shaders</string>
+ <string name="renderer_asynchronous_shaders_description">Kompilerer shaders asynkront, noe som reduserer hakkingen, men kan føre til feil.</string>
+ <string name="renderer_debug">Aktiver feilsøking av grafikk</string>
+ <string name="renderer_debug_description">Når dette er merket av, går grafikk-API-et inn i en langsommere feilsøkingsmodus.</string>
+ <string name="use_disk_shader_cache">Bruk disk shader-cache</string>
+ <string name="use_disk_shader_cache_description">Reduser hakking ved å lagre og laste inn genererte shaders på disken.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Volum</string>
+ <string name="audio_volume_description">Angir volumet på lydutgangen.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Standard</string>
+ <string name="ini_saved">Lagrede innstillinger</string>
+ <string name="gameid_saved">Lagrede innstillinger for %1$s</string>
+ <string name="error_saving">Feil ved lagring av %1$s.ini: %2$s</string>
+ <string name="loading">Lastes inn...</string>
+ <string name="reset_setting_confirmation">Vil du tilbakestille denne innstillingen til standardverdien?</string>
+ <string name="reset_to_default">Tilbakestill til standardinnstillingene</string>
+ <string name="reset_all_settings">Tilbakestille alle innstillinger?</string>
+ <string name="reset_all_settings_description">Alle avanserte innstillinger tilbakestilles til standardkonfigurasjonen. Dette kan ikke angres.</string>
+ <string name="settings_reset">Tilbakestilling av innstillinger</string>
+ <string name="close">Lukk</string>
+ <string name="learn_more">Lær Mer</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Velg GPU-driver</string>
+ <string name="select_gpu_driver_title">Ønsker du å bytte ut din nåværende GPU-driver?</string>
+ <string name="select_gpu_driver_install">Installer</string>
+ <string name="select_gpu_driver_default">Standard</string>
+ <string name="select_gpu_driver_install_success">Installert %s</string>
+ <string name="select_gpu_driver_use_default">Bruk av standard GPU-driver</string>
+ <string name="select_gpu_driver_error">Ugyldig driver valgt, bruker systemstandard!</string>
+ <string name="system_gpu_driver">Systemets GPU-driver</string>
+ <string name="installing_driver">Installerer driver...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Avanserte innstillinger</string>
+ <string name="preferences_settings">Innstillinger</string>
+ <string name="preferences_general">Generelt</string>
+ <string name="preferences_system">System</string>
+ <string name="preferences_graphics">Grafikk</string>
+ <string name="preferences_audio">Lyd</string>
+ <string name="preferences_theme">Tema og farge</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">ROM-en din er kryptert</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Følg veiledningene for å redumpe dine <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">spillkassetter</a> eller <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">installerte titler</a>.]]></string>
+ <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>
+ <string name="loader_error_video_core">Det oppstod en feil ved initialisering av videokjernen</string>
+ <string name="loader_error_video_core_description">Dette skyldes vanligvis en inkompatibel GPU-driver. Installering av en tilpasset GPU-driver kan løse problemet.</string>
+ <string name="loader_error_invalid_format">Kunne ikke laste inn ROM</string>
+ <string name="loader_error_file_not_found">ROM-filen finnes ikke</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Avslutt emulering</string>
+ <string name="emulation_done">Ferdig</string>
+ <string name="emulation_fps_counter">FPS-teller</string>
+ <string name="emulation_toggle_controls">Veksle kontroller</string>
+ <string name="emulation_rel_stick_center">Relativt senter for stikken</string>
+ <string name="emulation_dpad_slide">DPad-skyveplate</string>
+ <string name="emulation_haptics">Haptikk</string>
+ <string name="emulation_show_overlay">Vis overlegg</string>
+ <string name="emulation_toggle_all">Slå av alt</string>
+ <string name="emulation_control_adjust">Juster overlegg</string>
+ <string name="emulation_control_scale">Skaler</string>
+ <string name="emulation_control_opacity">Gjennomsiktighet</string>
+ <string name="emulation_touch_overlay_reset">Tilbakestill overlegg</string>
+ <string name="emulation_touch_overlay_edit">Rediger overlegg</string>
+ <string name="emulation_pause">Pause Emulering</string>
+ <string name="emulation_unpause">Opphev pausing av emulering</string>
+ <string name="emulation_input_overlay">Alternativer for overlegg</string>
+ <string name="emulation_game_loading">Spillet lastes inn...</string>
+
+ <string name="load_settings">Laster inn innstillinger...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Programvare Tastatur</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Avbryt</string>
+ <string name="continue_button">Fortsett</string>
+ <string name="system_archive_not_found">System Arkiv Ikke Funnet</string>
+ <string name="system_archive_not_found_message">%s mangler. Dump systemarkivene dine.\nFortsatt emulering kan føre til krasj og feil.</string>
+ <string name="system_archive_general">Et systemarkiv</string>
+ <string name="save_load_error">Feil ved lagring/innlasting</string>
+ <string name="fatal_error">Fatal Feil</string>
+ <string name="fatal_error_message">Det oppstod en fatal feil. Sjekk loggen for mer informasjon.\nFortsatt emulering kan føre til krasj og feil.</string>
+ <string name="performance_warning">Hvis du slår av denne innstillingen, reduseres emuleringsytelsen betydelig! Vi anbefaler at du lar denne innstillingen være aktivert for å få den beste opplevelsen.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Automatisk valg</string>
+ <string name="region_japan">Japan</string>
+ <string name="region_usa">USA</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Australia</string>
+ <string name="region_china">Kina</string>
+ <string name="region_korea">Korea</string>
+ <string name="region_taiwan">Taiwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japansk (日本語)</string>
+ <string name="language_english">Engelsk</string>
+ <string name="language_french">Fransk (Français)</string>
+ <string name="langauge_german">Tysk (Deutsch)</string>
+ <string name="language_italian">Italiensk (Italiano)</string>
+ <string name="language_spanish">Spansk (Español)</string>
+ <string name="language_chinese">Kinesisk (简体中文)</string>
+ <string name="language_korean">Koreansk (한국어)</string>
+ <string name="language_dutch">Nederlandsk (Nederlands)</string>
+ <string name="language_portuguese">Portugisisk (Português)</string>
+ <string name="language_russian">Russisk (Русский)</string>
+ <string name="language_taiwanese">Taiwansk (台湾)</string>
+ <string name="language_british_english">Britisk Engelsk</string>
+ <string name="language_canadian_french">Kanadisk fransk (Français canadien)</string>
+ <string name="language_latin_american_spanish">Latinamerikansk spansk (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Forenklet kinesisk (简体中文)</string>
+ <string name="language_traditional_chinese">Tradisjonell Kinesisk (正體中文)</string>
+ <string name="language_brazilian_portuguese">Brasiliansk portugisisk (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Ingen</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normal</string>
+ <string name="renderer_accuracy_high">Høy</string>
+ <string name="renderer_accuracy_extreme">Ekstrem (Treg)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Slow)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Slow)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Slow)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Umiddelbar (av)</string>
+ <string name="renderer_vsync_mailbox">Postkasse</string>
+ <string name="renderer_vsync_fifo">FIFO (På)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO avslappet</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Nærmeste nabo</string>
+ <string name="scaling_filter_bilinear">Bilineær</string>
+ <string name="scaling_filter_bicubic">Bikubisk</string>
+ <string name="scaling_filter_gaussian">Gaussisk</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Ingen</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Standard (16:9)</string>
+ <string name="ratio_force_four_three">Tving 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Tving 21:9</string>
+ <string name="ratio_force_sixteen_ten">Tving 16:10</string>
+ <string name="ratio_stretch">Strekk til Vindu</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Auto</string>
+ <string name="cpu_accuracy_accurate">Nøyaktig</string>
+ <string name="cpu_accuracy_unsafe">Utrygt</string>
+ <string name="cpu_accuracy_paranoid">Paranoid (Langsom)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">D-Pad</string>
+ <string name="gamepad_left_stick">Venstre Pinne</string>
+ <string name="gamepad_right_stick">Høyre Pinne</string>
+ <string name="gamepad_home">Hjem</string>
+ <string name="gamepad_screenshot">Skjermbilde</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Forberedelse av shaders</string>
+ <string name="building_shaders">Bygging av shaders</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Endre appens tema</string>
+ <string name="theme_default">Standard</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Endre temamodus</string>
+ <string name="theme_mode_follow_system">Følg systemet</string>
+ <string name="theme_mode_light">Lys</string>
+ <string name="theme_mode_dark">Mørk</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Bruk svart bakgrunn</string>
+ <string name="use_black_backgrounds_description">Bruk svart bakgrunn når du bruker det mørke temaet.</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml
new file mode 100644
index 000000000..fc9f49e0e
--- /dev/null
+++ b/src/android/app/src/main/res/values-pl/strings.xml
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.&lt;br /&gt;&lt;br /&gt;Zanim zaczniesz, wybierz plik kluczy <![CDATA[<b> prod.keys </b>]]> z katalogu w pamięci masowej.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Dowiedz się więcej</a>]]></string>
+ <string name="emulation_notification_channel_name">Emulacja jest uruchomiona</string>
+ <string name="emulation_notification_channel_description">Pokaż trwałe powiadomienie gdy emulacja jest uruchomiona.</string>
+ <string name="emulation_notification_running">yuzu jest uruchomiony</string>
+ <string name="notice_notification_channel_name">Powiadomienia błędy</string>
+ <string name="notice_notification_channel_description">Pokaż powiadomienie gdy coś pójdzie źle</string>
+ <string name="notification_permission_not_granted">Nie zezwolono na powiadomienia!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Witaj!</string>
+ <string name="welcome_description">Zobacz jak skonfigurować &lt;b>yuzu&lt;/b> i wskocz w świat emulacji.</string>
+ <string name="get_started">Zaczynamy</string>
+ <string name="keys">Klucze</string>
+ <string name="keys_description">Wybierz swoje klucze &lt;b>prod.keys&lt;/b> za pomocą przycisku poniżej.</string>
+ <string name="select_keys">Wybierz klucze</string>
+ <string name="games">Gry</string>
+ <string name="games_description">Wybierz katalog z grami &lt;b>Games&lt;/b> za pomocą przycisku poniżej.</string>
+ <string name="done">Gotowe</string>
+ <string name="done_description">Wszystko skonfigurowane.\n Miłego grania!</string>
+ <string name="text_continue">Kontynuuj</string>
+ <string name="next">Dalej</string>
+ <string name="back">Wstecz</string>
+ <string name="add_games">Dodaj gry</string>
+ <string name="add_games_description">Wybierz folder zawierający Twoje gry</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Gry</string>
+ <string name="home_search">Szukaj</string>
+ <string name="home_settings">Ustawienia</string>
+ <string name="empty_gamelist">Nie znaleziono plików, lub nie wybrano jeszcze katalogu zawierającego gry.</string>
+ <string name="search_and_filter_games">Szukaj i filtruj gry</string>
+ <string name="select_games_folder">Wybierz folder z grami</string>
+ <string name="select_games_folder_description">Pozwala yuzu wygenerować listę gier</string>
+ <string name="add_games_warning">Pominąć wybór folderu z grami?</string>
+ <string name="add_games_warning_description">Aby pokazać listę gier wybierz katalog zawierający gry.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Szukaj gier</string>
+ <string name="games_dir_selected">Wybrano katalog gier</string>
+ <string name="install_prod_keys">Instaluj klucze prod.keys</string>
+ <string name="install_prod_keys_description">Wymagane aby poprawnie odczytać sklepowe gry</string>
+ <string name="install_prod_keys_warning">Pominąć dodawanie kluczy?</string>
+ <string name="install_prod_keys_warning_description">Poprawne klucze są wymagane aby emulować sklepowe gry. Jeśli przejdziesz dalej, jedynie homebrew będą działać.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Powiadomienia</string>
+ <string name="notifications_description">Nadaj uprawnienia dostępu do powiadomień. </string>
+ <string name="give_permission">Nadaj uprawnienia</string>
+ <string name="notification_warning">Pominąć nadanie uprawnień powiadomień?</string>
+ <string name="notification_warning_description">yuzu nie będzie mógł powiadamiać Cię o ważnych informacjach.</string>
+ <string name="permission_denied">Odmowa dostępu</string>
+ <string name="permission_denied_description">Odmówiłeś dostępu do powiadomień zbyt wiele razy, teraz musisz przyznać je w ustawieniach systemowych Androida.</string>
+ <string name="about">O aplikacji</string>
+ <string name="about_description">Wersja, podziękowania i więcej</string>
+ <string name="warning_help">Pomoc</string>
+ <string name="warning_skip">Pomiń</string>
+ <string name="warning_cancel">Anuluj</string>
+ <string name="install_amiibo_keys">Zainstaluj klucze Amiibo</string>
+ <string name="install_amiibo_keys_description">Wymagane aby korzystać z Amiibo w grze</string>
+ <string name="invalid_keys_file">Wybrano niepoprawne klucze</string>
+ <string name="install_keys_success">Klucze zainstalowane pomyślnie</string>
+ <string name="reading_keys_failure">Błąd podczas odczytu kluczy</string>
+ <string name="install_keys_failure_extension_description">
+1. Upewnij się że klucze mają rozszerzenie .keys. \n\n
+2. Klucze nie mogą znajdować się w folderze Pobrane. \n\n
+Rozwiąż te problemy (oba) i spróbuj ponownie.</string>
+ <string name="invalid_keys_error">Niepoprawne klucze</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">Wybrany plik jest niepoprawny lub uszkodzony. Zrzuć ponownie swoje klucze.</string>
+ <string name="install_gpu_driver">Zainstaluj sterownik GPU</string>
+ <string name="install_gpu_driver_description">Użyj alternatywnych sterowników aby potencjalnie zwiększyć wydajność i naprawić błędy</string>
+ <string name="advanced_settings">Ustawienia zaawansowane</string>
+ <string name="settings_description">Skonfiguruj ustawienia emulatora</string>
+ <string name="search_recently_played">Ostatnio grane</string>
+ <string name="search_recently_added">Ostatnio dodane</string>
+ <string name="search_retail">Sklepowe</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Otwórz folder yuzu</string>
+ <string name="open_user_folder_description">Zarządzaj plikami emulatora</string>
+ <string name="theme_and_color_description">Personalizuj wygląd aplikacji</string>
+ <string name="no_file_manager">Nie znaleziono menedżera plików</string>
+ <string name="notification_no_directory_link">Nie można otworzyć folderu emulatora</string>
+ <string name="notification_no_directory_link_description">Proszę wybrać ręcznie folder z pomocą panelu bocznego menedżera plików.</string>
+ <string name="manage_save_data">Zarządzaj plikami zapisów gier</string>
+ <string name="manage_save_data_description">Znaleziono pliki zapisów gier. Wybierz opcję poniżej.</string>
+ <string name="import_export_saves_description">Importuj lub wyeksportuj pliki zapisów</string>
+ <string name="import_export_saves_no_profile">Nie znaleziono plików zapisów. Uruchom grę i spróbuj ponownie.</string>
+ <string name="save_file_imported_success">Zaimportowano pomyślnie</string>
+ <string name="save_file_invalid_zip_structure">Niepoprawna struktura folderów</string>
+ <string name="save_file_invalid_zip_structure_description">Pierwszy podkatalog musi zawierać w nazwie numer ID tytułu gry.</string>
+ <string name="import_saves">Importuj</string>
+ <string name="export_saves">Eksportuj</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia isn\'t real</string>
+ <string name="copied_to_clipboard">Skopiowano do schowka</string>
+ <string name="about_app_description">Otwarto-źródłowy emulator konsoli Switch</string>
+ <string name="contributors">Współtwórcy</string>
+ <string name="contributors_description">Stworzone z \u2764 przez zespół yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Wersja</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Wczesny dostęp</string>
+ <string name="get_early_access">Uzyskaj wczesny dostęp</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Nowe funkcje, szybszy dostęp do aktualizacji i nie tylko</string>
+ <string name="early_access_benefits">Korzyści z wcześniejszego dostępu</string>
+ <string name="cutting_edge_features">Nowatorskie funkcje</string>
+ <string name="early_access_updates">Częste aktualizacje</string>
+ <string name="no_manual_installation">Automatyczne aktualizacje</string>
+ <string name="prioritized_support">Priorytetowe wsparcie</string>
+ <string name="helping_game_preservation">Pomoc w problemach z grami</string>
+ <string name="our_eternal_gratitude">Nasza wdzięczność</string>
+ <string name="are_you_interested">Jesteś zainteresowany?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Włącz limit szybkości emulacji</string>
+ <string name="frame_limit_enable_description">Włącz, aby ustawić procentowy limit szybkości emulacji</string>
+ <string name="frame_limit_slider">Procentowy limit szybkości emulacji</string>
+ <string name="frame_limit_slider_description">Określa limit szybkości emulacji gier. Domyślna wartość 100% oznacza normalną szybkość z jaką działa gra. Wartości niższe lub wyższe zmniejszą lub zwiększą limit szybkości.</string>
+ <string name="cpu_accuracy">Dokładność procesora CPU</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Tryb zadokowany</string>
+ <string name="use_docked_mode_description">Emulacja w trybie stacji dokującej, zwiększa rozdzielczość kosztem wydajności.</string>
+ <string name="emulated_region">Region emulacji</string>
+ <string name="emulated_language">Język emulacji</string>
+ <string name="select_rtc_date">Ustaw datę RTC</string>
+ <string name="select_rtc_time">Ustaw czas RTC</string>
+ <string name="use_custom_rtc">Włącz niestandardowy zegar RTC</string>
+ <string name="use_custom_rtc_description">Ta opcja pozwala na wybranie własnych ustawień czasu używanych w czasie emulacji, innych niż czas systemu Android.</string>
+ <string name="set_custom_rtc">Ustaw niestandardowy czas RTC</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">Interfejs graficzny</string>
+ <string name="renderer_accuracy">Poziom precyzji emulacji</string>
+ <string name="renderer_resolution">Rozdzielczość</string>
+ <string name="renderer_vsync">Synchronizacja pionowa VSync</string>
+ <string name="renderer_aspect_ratio">Proporcje ekranu</string>
+ <string name="renderer_scaling_filter">Filtr adaptacji rozdzielczości</string>
+ <string name="renderer_anti_aliasing">Metoda wygładzania krawędzi</string>
+ <string name="renderer_force_max_clock">Maksymalne taktowanie GPU (układy Adreno)</string>
+ <string name="renderer_force_max_clock_description">Wymusza uruchomienie maksymalnego taktowania układu graficznego (zabezpieczenia termiczne będą dalej aktywne).</string>
+ <string name="renderer_asynchronous_shaders">Wyłącz synchronizację shaderów</string>
+ <string name="renderer_asynchronous_shaders_description">Kompiluj oświetlenie bez synchronizacji, poprawi wydajność ale może powodować błędy.</string>
+ <string name="renderer_debug">Włącz debugowanie grafiki</string>
+ <string name="renderer_debug_description">Kiedy włączone, interfejs graficzny korzysta z wolnego trybu debugowania błędów.</string>
+ <string name="use_disk_shader_cache">Użyj pamięci podręcznej shaderów na dysku</string>
+ <string name="use_disk_shader_cache_description">Zmniejsza przycięcia przez przechowywanie gotowych wygenerowanych plików oświetlenia w pamięci urządzenia.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Głośność</string>
+ <string name="audio_volume_description">Ustala poziom głośności wyjścia dźwięku.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Domyślne</string>
+ <string name="ini_saved">Ustawienia zapisane</string>
+ <string name="gameid_saved">Ustawienia zapisane w %1$s</string>
+ <string name="error_saving">Błąd zapisu %1$s.ini: %2$s</string>
+ <string name="loading">Wczytywanie...</string>
+ <string name="reset_setting_confirmation">Przywrócić wartość tego ustawienia do wartości domyślnej?</string>
+ <string name="reset_to_default">Przywróć ustawienia domyślne</string>
+ <string name="reset_all_settings">Przywrócić WSZYSTKIE ustawienia?</string>
+ <string name="reset_all_settings_description">Wszystkie zaawansowane opcje zostaną przywrócone do wartości domyślnych. Czynności nie będzie można cofnąć.</string>
+ <string name="settings_reset">Reset ustawień</string>
+ <string name="close">Zamknij</string>
+ <string name="learn_more">Dowiedz się więcej</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Wybierz sterownik GPU </string>
+ <string name="select_gpu_driver_title">Chcesz zastąpić obecny sterownik układu graficznego?</string>
+ <string name="select_gpu_driver_install">Zainstaluj</string>
+ <string name="select_gpu_driver_default">Domyślne</string>
+ <string name="select_gpu_driver_install_success">Zainstalowano %s</string>
+ <string name="select_gpu_driver_use_default">Aktywny domyślny sterownik GPU</string>
+ <string name="select_gpu_driver_error">Wybrano błędny sterownik, powrót do domyślnego. </string>
+ <string name="system_gpu_driver">Systemowy sterownik GPU</string>
+ <string name="installing_driver">Instalowanie sterownika...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Zaawansowane</string>
+ <string name="preferences_settings">Ustawienia</string>
+ <string name="preferences_general">Ogólne</string>
+ <string name="preferences_system">System</string>
+ <string name="preferences_graphics">Grafika</string>
+ <string name="preferences_audio">Dźwięk</string>
+ <string name="preferences_theme">Motyw i kolor</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">Twój ROM jest zakodowany</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Użyj przewodnika aby wykonać zrzuty <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">kardridży</a> lub <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">zainstalowanych gier</a>.]]></string>
+ <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>
+ <string name="loader_error_video_core">Błąd inicjacji podsystemu graficznego</string>
+ <string name="loader_error_video_core_description">Zazwyczaj spowodowane niekompatybilnym sterownikiem GPU, instalacja niestandardowego sterownika może rozwiązać ten problem.</string>
+ <string name="loader_error_invalid_format">Nie można wczytać pliku ROM</string>
+ <string name="loader_error_file_not_found">Plik ROM nie istnieje</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Zakończ emulację</string>
+ <string name="emulation_done">Gotowe</string>
+ <string name="emulation_fps_counter">Licznik FPS</string>
+ <string name="emulation_toggle_controls">Wybierz przyciski</string>
+ <string name="emulation_rel_stick_center">Wycentruj gałki</string>
+ <string name="emulation_dpad_slide">Ruchomy DPad</string>
+ <string name="emulation_haptics">Wibracje haptyczne</string>
+ <string name="emulation_show_overlay">Pokaż przyciski</string>
+ <string name="emulation_toggle_all">Zaznacz wszystkie</string>
+ <string name="emulation_control_adjust">Dostosuj nakładkę</string>
+ <string name="emulation_control_scale">Skala</string>
+ <string name="emulation_control_opacity">Przeźroczystość</string>
+ <string name="emulation_touch_overlay_reset">Resetuj</string>
+ <string name="emulation_touch_overlay_edit">Edytuj nakładkę</string>
+ <string name="emulation_pause">Wstrzymaj emulację</string>
+ <string name="emulation_unpause">Wznów emulację</string>
+ <string name="emulation_input_overlay">Opcje nakładki</string>
+ <string name="emulation_game_loading">Wczytywanie gry...</string>
+
+ <string name="load_settings">Wczytywanie ustawień...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Klawiatura systemowa</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Przerwij</string>
+ <string name="continue_button">Kontynuuj</string>
+ <string name="system_archive_not_found">Archiwum systemu nie znalezione.</string>
+ <string name="system_archive_not_found_message">%s nieznaleziony. Proszę wykonać zrzut archiwum systemu.\nKontynuowanie może powodować błędy lub przerwanie emulacji.</string>
+ <string name="system_archive_general">Archiwum systemu</string>
+ <string name="save_load_error">Błąd odczytu/zapisu</string>
+ <string name="fatal_error">Błąd krytyczny</string>
+ <string name="fatal_error_message">Wystąpił błąd krytyczny. Szczegóły znajdziesz w pliku log.\nKontynuowanie może spowodować błędy lub przerwanie emulacji. </string>
+ <string name="performance_warning">Wyłączenie tej opcji znacząco ograniczy wydajność! Dla najlepszego doświadczenia, zaleca się zostawienie tej opcji włączonej.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Auto-wybór</string>
+ <string name="region_japan">Japonia</string>
+ <string name="region_usa">USA</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Australia</string>
+ <string name="region_china">Chiny</string>
+ <string name="region_korea">Korea</string>
+ <string name="region_taiwan">Tajwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japoński (日本語)</string>
+ <string name="language_english">Angielski</string>
+ <string name="language_french">Francuski (Francja)</string>
+ <string name="langauge_german">Niemiecki (Niemcy)</string>
+ <string name="language_italian">Włoski (Włochy)</string>
+ <string name="language_spanish">Hiszpański (Hiszpania)</string>
+ <string name="language_chinese">Chiński (简体中文)</string>
+ <string name="language_korean">Koreański (한국어)</string>
+ <string name="language_dutch">Duński (Holandia)</string>
+ <string name="language_portuguese">Portugalski (Portugalia)</string>
+ <string name="language_russian">Rosyjski (Русский)</string>
+ <string name="language_taiwanese">Tajwański (台湾)</string>
+ <string name="language_british_english">Angielski Brytyjski</string>
+ <string name="language_canadian_french">Francuski (Kanada)</string>
+ <string name="language_latin_american_spanish">Hiszpański (Ameryka Latynoska)</string>
+ <string name="language_simplified_chinese">Chiński uproszczony (简体中文)</string>
+ <string name="language_traditional_chinese">Chiński tradycyjny (正體中文)</string>
+ <string name="language_brazilian_portuguese">Portugalski (Brazylia)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Żadny</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normalny</string>
+ <string name="renderer_accuracy_high">Wysoki</string>
+ <string name="renderer_accuracy_extreme">Ekstremalny (Wolny)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Wolno)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Wolno)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Wolno)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Natychmiastowa (Wyłączona)</string>
+ <string name="renderer_vsync_mailbox">Skrzynka pocztowa</string>
+ <string name="renderer_vsync_fifo">FIFO (Włączona)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaks</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Najbliższy sąsiadujący</string>
+ <string name="scaling_filter_bilinear">Bilinearny</string>
+ <string name="scaling_filter_bicubic">Bikubiczny</string>
+ <string name="scaling_filter_gaussian">Kulisty</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Żadna (wyłączony)</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Domyślne (16:9)</string>
+ <string name="ratio_force_four_three">Wymuś 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Wymuś 21:9</string>
+ <string name="ratio_force_sixteen_ten">Wymuś 16:10</string>
+ <string name="ratio_stretch">Rozciągnij do Okna</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Automatyczny</string>
+ <string name="cpu_accuracy_accurate">Dokładny</string>
+ <string name="cpu_accuracy_unsafe">Niebezpieczny</string>
+ <string name="cpu_accuracy_paranoid">Paranoid (Wolny)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">D-Pad</string>
+ <string name="gamepad_left_stick">Lewa gałka</string>
+ <string name="gamepad_right_stick">Prawa gałka</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Zrzut ekranu</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Przygotowanie shaderów</string>
+ <string name="building_shaders">Budowanie shaderów</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Zmień motyw aplikacji</string>
+ <string name="theme_default">Domyślny</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Zmiana trybu motywu</string>
+ <string name="theme_mode_follow_system">Podążaj za systemowym</string>
+ <string name="theme_mode_light">Jasny</string>
+ <string name="theme_mode_dark">Ciemny</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Używaj czarnego tła</string>
+ <string name="use_black_backgrounds_description">Kiedy używany ciemny motyw, tła zostają zastąpione czernią.</string>
+
+</resources>
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
new file mode 100644
index 000000000..83185c385
--- /dev/null
+++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Este software corre jogos para a consola Nintendo Switch. Não estão incluídas nem jogos ou chaves. &lt;br /&gt;&lt;br /&gt;Antes de começares, por favor localiza o ficheiro <![CDATA[1 prod.keys 1]]> no armazenamento do teu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[2Learn more2]]></string>
+ <string name="emulation_notification_channel_name">Emulação está Ativa</string>
+ <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação está a correr.</string>
+ <string name="emulation_notification_running">Yuzu está em execução </string>
+ <string name="notice_notification_channel_name">Notificações e erros</string>
+ <string name="notice_notification_channel_description">Mostra notificações quendo algo corre mal.</string>
+ <string name="notification_permission_not_granted">Permissões de notificação não permitidas </string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Bemvindo! </string>
+ <string name="welcome_description">Aprende como configurar &lt;b>yuzu&lt;/b> e arranca a emulação.</string>
+ <string name="get_started">Começa</string>
+ <string name="keys">Chaves</string>
+ <string name="keys_description">Seleciona o teu ficheiro &lt;b>prod.keys&lt;/b> com o botão abaixo.</string>
+ <string name="select_keys">Seleciona as Chaves</string>
+ <string name="games">Jogos</string>
+ <string name="games_description">Seleciona a tua pasta &lt;b>Games&lt;/b> com o botão abaixo.</string>
+ <string name="done">Feito</string>
+ <string name="done_description">Tudo pronto.\nDisfruta dos teus jogos!</string>
+ <string name="text_continue">Continuar</string>
+ <string name="next">Próximo</string>
+ <string name="back">Voltar</string>
+ <string name="add_games">Adiciona Jogos</string>
+ <string name="add_games_description">Seleciona a tua pasta de Jogos</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Jogos</string>
+ <string name="home_search">Pesquisar</string>
+ <string name="home_settings">Configurações</string>
+ <string name="empty_gamelist">Não foram encontrados jogos ou a pasta de Jogos ainda não foi definida. </string>
+ <string name="search_and_filter_games">Procura e filtra jogos.</string>
+ <string name="select_games_folder">Seleciona a pasta de jogos.</string>
+ <string name="select_games_folder_description">Permite que o Yuzu preencha a lista de jogos</string>
+ <string name="add_games_warning">Ignorar a seleção da pasta de jogos?</string>
+ <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>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Procurar Jogos</string>
+ <string name="games_dir_selected">Pasta de Jogos selecionada</string>
+ <string name="install_prod_keys">Instala prod.keys</string>
+ <string name="install_prod_keys_description">Necessário para desencriptar jogos comerciais</string>
+ <string name="install_prod_keys_warning">Ignorar a adição de chaves?</string>
+ <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>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#Guia de introdução</string>
+ <string name="notifications">Notificações</string>
+ <string name="notifications_description">Conceda a permissão de notificação com o botão abaixo.</string>
+ <string name="give_permission">Conceda permissão</string>
+ <string name="notification_warning">Saltar a concessão da permissão de notificação?</string>
+ <string name="notification_warning_description">Yuzu não conseguirá te notificar de informações importantes. </string>
+ <string name="permission_denied">Permissão negada</string>
+ <string name="permission_denied_description">Você negou essa permissão muitas vezes e agora precisa concedê-la manualmente nas configurações do sistema.</string>
+ <string name="about">Sobre</string>
+ <string name="about_description">Versão de compilação, créditos e mais</string>
+ <string name="warning_help">Ajuda</string>
+ <string name="warning_skip">Saltar</string>
+ <string name="warning_cancel">Cancelar</string>
+ <string name="install_amiibo_keys">Instala chaves Amiibo</string>
+ <string name="install_amiibo_keys_description">Necessário para usares Amiibo no jogo</string>
+ <string name="invalid_keys_file">Ficheiro de chaves inválido</string>
+ <string name="install_keys_success">Chaves instaladas com sucesso</string>
+ <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Verifica se as tuas chaves têm a extensão .keys.\n\n
+ 2. As Chaves não podem estar gravadas na pasta Transferências.\n\n
+ Resolve esta(s) questões e tenta novamente.
+ </string>
+ <string name="invalid_keys_error">Chaves de encriptação inválidas</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string>
+ <string name="install_gpu_driver">Instala driver para GPU</string>
+ <string name="install_gpu_driver_description">Instala drivers alternativos para desempenho ou precisão potencialmente melhores</string>
+ <string name="advanced_settings">Definições avançadas</string>
+ <string name="settings_description">Configura definições do emulador</string>
+ <string name="search_recently_played">Jogos recentes</string>
+ <string name="search_recently_added">Adicionados recentemente</string>
+ <string name="search_retail">Jogos comerciais</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Abre a pasta Yuzu</string>
+ <string name="open_user_folder_description">Gere os ficheiro internos do Yuzu</string>
+ <string name="theme_and_color_description">Modifica a aparência da App</string>
+ <string name="no_file_manager">Nenhum gestor de ficheiros encontrado</string>
+ <string name="notification_no_directory_link">Impossível abrir pasta Yuzu</string>
+ <string name="notification_no_directory_link_description">Localiza a pasta de utilizador manualmente com o painel lateral do gestor de ficheiros.</string>
+ <string name="manage_save_data">Gerir dados guardados</string>
+ <string name="manage_save_data_description">Dados não encontrados. Por favor seleciona uma opção abaixo.</string>
+ <string name="import_export_saves_description">Importa ou exporta dados guardados</string>
+ <string name="import_export_saves_no_profile">Dados não encontrados. Por favor lança o jogo e tenta novamente.</string>
+ <string name="save_file_imported_success">Importado com sucesso</string>
+ <string name="save_file_invalid_zip_structure">Estrutura de diretório de dados invalida</string>
+ <string name="save_file_invalid_zip_structure_description">O nome da primeira sub pasta tem de ser a ID do jogo.</string>
+ <string name="import_saves">Importar</string>
+ <string name="export_saves">Exportar</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia não é real</string>
+ <string name="copied_to_clipboard">Copiado para a área de transferência</string>
+ <string name="about_app_description">Um emulador Switch de código aberto</string>
+ <string name="contributors">Contribuidores</string>
+ <string name="contributors_description">Feito com \u2764 da equipa do Yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Versão</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Acesso antecipado</string>
+ <string name="get_early_access">Obtém Acesso Antecipado</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Recursos de ponta, acesso antecipado a atualizações e muito mais</string>
+ <string name="early_access_benefits">Benefícios do Acesso Antecipado</string>
+ <string name="cutting_edge_features">Recursos de ponta</string>
+ <string name="early_access_updates">Acesso antecipado a atualizações</string>
+ <string name="no_manual_installation">Sem instalação manual</string>
+ <string name="prioritized_support">Suporte prioritário</string>
+ <string name="helping_game_preservation">Ajuda na preservação dos jogos</string>
+ <string name="our_eternal_gratitude">A nossa eterna gratidão</string>
+ <string name="are_you_interested">Estás interessado?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Ativar limite de velocidade</string>
+ <string name="frame_limit_enable_description">Quando ativada, a velocidade da emulação será limitada à percentagem definida da velocidade normal.</string>
+ <string name="frame_limit_slider">Percentagem do limite de velocidade</string>
+ <string name="frame_limit_slider_description">Especifica o limite da percentagem da velocidade da emulação. Com a velocidade por defeito a 100% a emulação será limitada à velocidade normal. Valores maiores ou menores aumentarão ou diminuirão o limite de velocidade.</string>
+ <string name="cpu_accuracy">Precisão do CPU</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Modo ancorado</string>
+ <string name="use_docked_mode_description">Emula em modo ancorado, que aumenta a resolução ás custas da performance.</string>
+ <string name="emulated_region">Região da emulação</string>
+ <string name="emulated_language">Idioma da emulação</string>
+ <string name="select_rtc_date">Seleciona a data RTC</string>
+ <string name="select_rtc_time">Seleciona a hora RTC</string>
+ <string name="use_custom_rtc">Ativa RTC personalizado</string>
+ <string name="use_custom_rtc_description">Esta configuração permite definir um RTC personalizado diferente da hora atual do sistema</string>
+ <string name="set_custom_rtc">Define RTC personalizado</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Nível de precisão</string>
+ <string name="renderer_resolution">Resolução</string>
+ <string name="renderer_vsync">Modo VSync</string>
+ <string name="renderer_aspect_ratio">Proporção do ecrã</string>
+ <string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
+ <string name="renderer_anti_aliasing">Método de Anti-Aliasing </string>
+ <string name="renderer_force_max_clock">Força velocidade máxima (Adreno only)</string>
+ <string name="renderer_force_max_clock_description">Força o GPU a correr à velocidade máxima (restrições térmicas serão aplicadas)</string>
+ <string name="renderer_asynchronous_shaders">Usa shaders assíncronos </string>
+ <string name="renderer_asynchronous_shaders_description">Compila shaders assincronamente, que aumentará a fluidez, mas poderá causar falhas.</string>
+ <string name="renderer_debug">Ativar depuração de gráficos</string>
+ <string name="renderer_debug_description">Quando selecionado, a API gráfica entra num modo de depuração mais lento.</string>
+ <string name="use_disk_shader_cache">Usar cache de shaders em disco</string>
+ <string name="use_disk_shader_cache_description">Aumenta a fluidez ao guardar e carregar shaders gerados para o armazenamento.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Volume</string>
+ <string name="audio_volume_description">Especifica o volume de saída.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Padrão</string>
+ <string name="ini_saved">Definições guardadas</string>
+ <string name="gameid_saved">Definições guardadas para %1$s</string>
+ <string name="error_saving">Erro ao guardar %1$s.ini: %2$s</string>
+ <string name="loading">A carregar...</string>
+ <string name="reset_setting_confirmation">Queres reverter esta definição para os valores padrão?</string>
+ <string name="reset_to_default">Reverter para padrão</string>
+ <string name="reset_all_settings">Redefinir todas as definições?</string>
+ <string name="reset_all_settings_description">Todas as definições avançadas serão redefinidas para as definições padrão. Isto não pode ser revertido.</string>
+ <string name="settings_reset">Redefinir definições</string>
+ <string name="close">Fechar</string>
+ <string name="learn_more">Saiba mais</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Seleciona a driver para o GPU</string>
+ <string name="select_gpu_driver_title">Queres substituir o driver do GPU atual? </string>
+ <string name="select_gpu_driver_install">Instalar</string>
+ <string name="select_gpu_driver_default">Padrão</string>
+ <string name="select_gpu_driver_install_success">Instalado%s</string>
+ <string name="select_gpu_driver_use_default">Usar o driver padrão do GPU</string>
+ <string name="select_gpu_driver_error">Driver selecionado inválido, a usar o padrão do sistema!</string>
+ <string name="system_gpu_driver">Driver do GPU padrão</string>
+ <string name="installing_driver">A instalar o Driver...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Configurações avançadas</string>
+ <string name="preferences_settings">Configurações</string>
+ <string name="preferences_general">Geral</string>
+ <string name="preferences_system">Sistema</string>
+ <string name="preferences_graphics">Gráficos</string>
+ <string name="preferences_audio">Áudio</string>
+ <string name="preferences_theme">Cor e tema.</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">A tua ROM está encriptada</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor segue os guias para fazer redump das tuas<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">Cartidges de Jogo</a> or <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">Jogos Instalados</a>.]]></string>
+ <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>
+ <string name="loader_error_video_core">Ocorreu um erro ao iniciar o núcleo de vídeo.</string>
+ <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>
+ <string name="loader_error_invalid_format">Impossível carregar a tua ROM</string>
+ <string name="loader_error_file_not_found">O ficheiro da ROM não existe</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Sair da emulação</string>
+ <string name="emulation_done">Feito</string>
+ <string name="emulation_fps_counter">Contador de FPS</string>
+ <string name="emulation_toggle_controls">Alterar Controlos</string>
+ <string name="emulation_rel_stick_center">Centro do Analógico Relativo</string>
+ <string name="emulation_dpad_slide">Deslizar do DPad</string>
+ <string name="emulation_haptics">Hápticos </string>
+ <string name="emulation_show_overlay">Mostrar sobreposição </string>
+ <string name="emulation_toggle_all">Alterar todos</string>
+ <string name="emulation_control_adjust">Ajustar a sobreposição </string>
+ <string name="emulation_control_scale">Escala</string>
+ <string name="emulation_control_opacity">Opacidade</string>
+ <string name="emulation_touch_overlay_reset">Redefinir Sobreposição </string>
+ <string name="emulation_touch_overlay_edit">Editar sobreposição </string>
+ <string name="emulation_pause">Pausa emulação</string>
+ <string name="emulation_unpause">Retomar emulação</string>
+ <string name="emulation_input_overlay">Opções de sobreposição </string>
+ <string name="emulation_game_loading">Jogo a carregar...</string>
+
+ <string name="load_settings">Configurações a carregar...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Teclado de software</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Abortar</string>
+ <string name="continue_button">Continuar</string>
+ <string name="system_archive_not_found">Arquivo do sistema não encontrado</string>
+ <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>
+ <string name="system_archive_general">Um arquivo do sistema</string>
+ <string name="save_load_error">Erro Guardar/Carregar</string>
+ <string name="fatal_error">Erro fatal</string>
+ <string name="fatal_error_message">Ocorreu um erro fatal. Verifica o teu registro para detalhes. \nContinuar a emulação pode causar erros.</string>
+ <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>
+
+ <!-- Region Names -->
+ <string name="region_auto">Auto seleção</string>
+ <string name="region_japan">Japão</string>
+ <string name="region_usa">EUA</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Austrália</string>
+ <string name="region_china">China</string>
+ <string name="region_korea">Coréia</string>
+ <string name="region_taiwan">Taiwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japônes (日本語)</string>
+ <string name="language_english">Português do Brasil</string>
+ <string name="language_french">Francês (Français)</string>
+ <string name="langauge_german">Alemão (Deutsch)</string>
+ <string name="language_italian">Italiano (Italiano)</string>
+ <string name="language_spanish">Espanhol (Español)</string>
+ <string name="language_chinese">Mandarim (简体中文)</string>
+ <string name="language_korean">Coreano (한국어)</string>
+ <string name="language_dutch">Holandês (Nederlands)</string>
+ <string name="language_portuguese">Português (Português)</string>
+ <string name="language_russian">Russo (Русский)</string>
+ <string name="language_taiwanese">Taiwanês (台湾)</string>
+ <string name="language_british_english">Inglês britânico (British English)</string>
+ <string name="language_canadian_french">Fracês Canadiano (Français canadien)</string>
+ <string name="language_latin_american_spanish">Espanhol da América Latina (Español latino-americano)</string>
+ <string name="language_simplified_chinese">Chinês Simplificado (简体中文)</string>
+ <string name="language_traditional_chinese">Chinês tradicional (正體中文)</string>
+ <string name="language_brazilian_portuguese">Português do Brasil (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulcano</string>
+ <string name="renderer_none">Nenhum</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normal</string>
+ <string name="renderer_accuracy_high">Alto</string>
+ <string name="renderer_accuracy_extreme">Estremo (Lento)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Slow)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Lento)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Lento)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Imediato (Desligado)</string>
+ <string name="renderer_vsync_mailbox">Caixa de entrada</string>
+ <string name="renderer_vsync_fifo">FIFO (Ligado)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxado </string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Vizinho mais próximo</string>
+ <string name="scaling_filter_bilinear">Bilinear</string>
+ <string name="scaling_filter_bicubic">Bicúbico</string>
+ <string name="scaling_filter_gaussian">Gaussiano</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Nenhum</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Padrão (16:9)</string>
+ <string name="ratio_force_four_three">Forçar 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Forçar 21:9</string>
+ <string name="ratio_force_sixteen_ten">Forçar 16:10</string>
+ <string name="ratio_stretch">Esticar para a janela</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Automático</string>
+ <string name="cpu_accuracy_accurate">Preciso</string>
+ <string name="cpu_accuracy_unsafe">Não seguro</string>
+ <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">D-pad</string>
+ <string name="gamepad_left_stick">Analógico esquerdo</string>
+ <string name="gamepad_right_stick">Analógico direito</string>
+ <string name="gamepad_home">Botão Home</string>
+ <string name="gamepad_screenshot">Captura de ecrã</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">A preparar shaders</string>
+ <string name="building_shaders">A criar shaders</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Muda o Tema da App</string>
+ <string name="theme_default">Padrão</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Altera o Modo do Tema</string>
+ <string name="theme_mode_follow_system">Igual ao Sistema</string>
+ <string name="theme_mode_light">Claro</string>
+ <string name="theme_mode_dark">Escuro</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Usa Fundos Negros</string>
+ <string name="use_black_backgrounds_description">Quando usar tema escuro, aplicar fundos escuros</string>
+
+</resources>
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
new file mode 100644
index 000000000..3d0851e6f
--- /dev/null
+++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Este software corre jogos para a consola Nintendo Switch. Não estão incluídas nem jogos ou chaves. &lt;br /&gt;&lt;br /&gt;Antes de começares, por favor localiza o ficheiro <![CDATA[1 prod.keys 1]]> no armazenamento do teu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[2Learn more2]]></string>
+ <string name="emulation_notification_channel_name">Emulação está Ativa</string>
+ <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação está a correr.</string>
+ <string name="emulation_notification_running">Yuzu está em execução </string>
+ <string name="notice_notification_channel_name">Notificações e erros</string>
+ <string name="notice_notification_channel_description">Mostra notificações quendo algo corre mal.</string>
+ <string name="notification_permission_not_granted">Permissões de notificação não permitidas </string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Benvindo! </string>
+ <string name="welcome_description">Aprende como configurar &lt;b>yuzu&lt;/b> e arranca a emulação.</string>
+ <string name="get_started">Começa</string>
+ <string name="keys">Chaves</string>
+ <string name="keys_description">Seleciona o teu ficheiro &lt;b>prod.keys&lt;/b> com o botão abaixo.</string>
+ <string name="select_keys">Seleciona as Chaves</string>
+ <string name="games">Jogos</string>
+ <string name="games_description">Seleciona a tua pasta &lt;b>Games&lt;/b> com o botão abaixo.</string>
+ <string name="done">Feito</string>
+ <string name="done_description">Tudo pronto.\nDisfruta dos teus jogos!</string>
+ <string name="text_continue">Continuar</string>
+ <string name="next">Próximo</string>
+ <string name="back">Voltar</string>
+ <string name="add_games">Adiciona Jogos</string>
+ <string name="add_games_description">Seleciona a tua pasta de Jogos</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Jogos</string>
+ <string name="home_search">Pesquisar</string>
+ <string name="home_settings">Configurações</string>
+ <string name="empty_gamelist">Não foram encontrados jogos ou a pasta de Jogos ainda não foi definida. </string>
+ <string name="search_and_filter_games">Procura e filtra jogos.</string>
+ <string name="select_games_folder">Seleciona a pasta de jogos.</string>
+ <string name="select_games_folder_description">Permite que o Yuzu preencha a lista de jogos</string>
+ <string name="add_games_warning">Ignorar a seleção da pasta de jogos?</string>
+ <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>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Procurar Jogos</string>
+ <string name="games_dir_selected">Pasta de Jogos selecionada</string>
+ <string name="install_prod_keys">Instala prod.keys</string>
+ <string name="install_prod_keys_description">Necessário para desencriptar jogos comerciais</string>
+ <string name="install_prod_keys_warning">Ignorar a adição de chaves?</string>
+ <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>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Notificações</string>
+ <string name="notifications_description">Conceda a permissão de notificação com o botão abaixo.</string>
+ <string name="give_permission">Conceda permissão</string>
+ <string name="notification_warning">Saltar a concessão da permissão de notificação?</string>
+ <string name="notification_warning_description">Yuzu não conseguirá te notificar de informações importantes. </string>
+ <string name="permission_denied">Permissão negada</string>
+ <string name="permission_denied_description">Você negou essa permissão muitas vezes e agora precisa concedê-la manualmente nas configurações do sistema.</string>
+ <string name="about">Sobre</string>
+ <string name="about_description">Versão de compilação, créditos e mais</string>
+ <string name="warning_help">Ajuda</string>
+ <string name="warning_skip">Saltar</string>
+ <string name="warning_cancel">Cancelar</string>
+ <string name="install_amiibo_keys">Instala chaves Amiibo</string>
+ <string name="install_amiibo_keys_description">Necessário para usares Amiibo no jogo</string>
+ <string name="invalid_keys_file">Ficheiro de chaves inválido</string>
+ <string name="install_keys_success">Chaves instaladas com sucesso</string>
+ <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Verifica se as tuas chaves têm a extensão .keys.\n\n
+ 2. As Chaves não podem estar gravadas na pasta Transferências.\n\n
+ Resolve esta(s) questões e tenta novamente.
+ </string>
+ <string name="invalid_keys_error">Chaves de encriptação inválidas</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string>
+ <string name="install_gpu_driver">Instala driver para GPU</string>
+ <string name="install_gpu_driver_description">Instala drivers alternativos para desempenho ou precisão potencialmente melhores</string>
+ <string name="advanced_settings">Configurações avançadas</string>
+ <string name="settings_description">Configura configurações do emulador</string>
+ <string name="search_recently_played">Jogos recentes</string>
+ <string name="search_recently_added">Adicionados recentemente</string>
+ <string name="search_retail">Jogos comerciais</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Abre a pasta Yuzu</string>
+ <string name="open_user_folder_description">Gere os ficheiro internos do Yuzu</string>
+ <string name="theme_and_color_description">Modifica a aparência da App</string>
+ <string name="no_file_manager">Nenhum gestor de ficheiros encontrado</string>
+ <string name="notification_no_directory_link">Impossível abrir pasta Yuzu</string>
+ <string name="notification_no_directory_link_description">Localiza a pasta de utilizador manualmente com o painel lateral do gestor de ficheiros.</string>
+ <string name="manage_save_data">Gerir dados guardados</string>
+ <string name="manage_save_data_description">Dados não encontrados. Por favor seleciona uma opção abaixo.</string>
+ <string name="import_export_saves_description">Importa ou exporta dados guardados</string>
+ <string name="import_export_saves_no_profile">Dados não encontrados. Por favor lança o jogo e tenta novamente.</string>
+ <string name="save_file_imported_success">Importado com sucesso</string>
+ <string name="save_file_invalid_zip_structure">Estrutura de diretório de dados invalida</string>
+ <string name="save_file_invalid_zip_structure_description">O nome da primeira sub pasta tem de ser a ID do jogo.</string>
+ <string name="import_saves">Importar</string>
+ <string name="export_saves">Exportar</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia não é real</string>
+ <string name="copied_to_clipboard">Copiado para a área de transferência</string>
+ <string name="about_app_description">Um emulador Switch de código aberto</string>
+ <string name="contributors">Contribuidores</string>
+ <string name="contributors_description">Feito com \u2764 da equipa do Yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Versão</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Acesso antecipado</string>
+ <string name="get_early_access">Obtém Acesso Antecipado</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Recursos de ponta, acesso antecipado a atualizações e muito mais</string>
+ <string name="early_access_benefits">Benefícios do Acesso Antecipado</string>
+ <string name="cutting_edge_features">Recursos de ponta</string>
+ <string name="early_access_updates">Acesso antecipado a atualizações</string>
+ <string name="no_manual_installation">Sem instalação manual</string>
+ <string name="prioritized_support">Suporte prioritário</string>
+ <string name="helping_game_preservation">Ajuda na preservação dos jogos</string>
+ <string name="our_eternal_gratitude">A nossa eterna gratidão</string>
+ <string name="are_you_interested">Estás interessado?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Ativar limite de velocidade</string>
+ <string name="frame_limit_enable_description">Quando ativada, a velocidade da emulação será limitada à percentagem definida da velocidade normal.</string>
+ <string name="frame_limit_slider">Percentagem do limite de velocidade</string>
+ <string name="frame_limit_slider_description">Especifica o limite da percentagem da velocidade da emulação. Com a velocidade por defeito a 100% a emulação será limitada à velocidade normal. Valores maiores ou menores aumentarão ou diminuirão o limite de velocidade.</string>
+ <string name="cpu_accuracy">Precisão do CPU</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Modo ancorado</string>
+ <string name="use_docked_mode_description">Emula em modo ancorado, que aumenta a resolução ás custas da performance.</string>
+ <string name="emulated_region">Região da emulação</string>
+ <string name="emulated_language">Idioma da emulação</string>
+ <string name="select_rtc_date">Seleciona a data RTC</string>
+ <string name="select_rtc_time">Seleciona a hora RTC</string>
+ <string name="use_custom_rtc">Ativa RTC personalizado</string>
+ <string name="use_custom_rtc_description">Esta configuração permite definir um RTC personalizado diferente da hora atual do sistema</string>
+ <string name="set_custom_rtc">Define RTC personalizado</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Nível de precisão</string>
+ <string name="renderer_resolution">Resolução</string>
+ <string name="renderer_vsync">Modo VSync</string>
+ <string name="renderer_aspect_ratio">Proporção do ecrã</string>
+ <string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
+ <string name="renderer_anti_aliasing">Método de Anti-Aliasing </string>
+ <string name="renderer_force_max_clock">Força velocidade máxima (Adreno only)</string>
+ <string name="renderer_force_max_clock_description">Força o GPU a correr à velocidade máxima (restrições térmicas serão aplicadas)</string>
+ <string name="renderer_asynchronous_shaders">Usa shaders assíncronos </string>
+ <string name="renderer_asynchronous_shaders_description">Compila shaders assincronamente, que aumentará a fluidez, mas poderá causar falhas.</string>
+ <string name="renderer_debug">Ativar depuração de gráficos</string>
+ <string name="renderer_debug_description">Quando selecionado, a API gráfica entra num modo de depuração mais lento.</string>
+ <string name="use_disk_shader_cache">Usar cache do disk shader</string>
+ <string name="use_disk_shader_cache_description">Aumenta a fluidez ao guardar e carregar shaders gerados para o armazenamento.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Volume</string>
+ <string name="audio_volume_description">Especifica o volume de saída.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">Padrão</string>
+ <string name="ini_saved">Configurações guardadas</string>
+ <string name="gameid_saved">Configurações guardadas para %1$s</string>
+ <string name="error_saving">Erro ao guardar %1$s.ini: %2$s</string>
+ <string name="loading">A carregar...</string>
+ <string name="reset_setting_confirmation">Queres reverter esta definição para os valores padrão?</string>
+ <string name="reset_to_default">Reverter para padrão</string>
+ <string name="reset_all_settings">Redefinir todas as configurações?</string>
+ <string name="reset_all_settings_description">Todas as configurações avançadas serão redefinidas para as definições padrão. Isto não pode ser revertido.</string>
+ <string name="settings_reset">Redefinir configurações </string>
+ <string name="close">Fechar</string>
+ <string name="learn_more">Saber Mais</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Seleciona a driver para o GPU</string>
+ <string name="select_gpu_driver_title">Queres substituir o driver do GPU atual? </string>
+ <string name="select_gpu_driver_install">Instalar</string>
+ <string name="select_gpu_driver_default">Padrão</string>
+ <string name="select_gpu_driver_install_success">Instalado%s</string>
+ <string name="select_gpu_driver_use_default">Usar o driver padrão do GPU</string>
+ <string name="select_gpu_driver_error">Driver selecionado inválido, a usar o padrão do sistema!</string>
+ <string name="system_gpu_driver">Driver do GPU padrão</string>
+ <string name="installing_driver">A instalar o Driver...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Configurações avançadas</string>
+ <string name="preferences_settings">Configurações</string>
+ <string name="preferences_general">Geral</string>
+ <string name="preferences_system">Sistema</string>
+ <string name="preferences_graphics">Gráficos</string>
+ <string name="preferences_audio">Audio</string>
+ <string name="preferences_theme">Cor e tema.</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">A tua ROM está encriptada</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Por favor segue os guias para fazer redump das tuas<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">Cartidges de Jogo</a> or <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">Jogos Instalados</a>.]]></string>
+ <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>
+ <string name="loader_error_video_core">Ocorreu um erro ao iniciar o núcleo de vídeo.</string>
+ <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>
+ <string name="loader_error_invalid_format">Impossível carregar a tua ROM</string>
+ <string name="loader_error_file_not_found">O ficheiro da ROM não existe</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Sair da emulação</string>
+ <string name="emulation_done">Feito</string>
+ <string name="emulation_fps_counter">Contador de FPS</string>
+ <string name="emulation_toggle_controls">Alterar Controlos</string>
+ <string name="emulation_rel_stick_center">Centro do Analógico Relativo</string>
+ <string name="emulation_dpad_slide">Deslizar do DPad</string>
+ <string name="emulation_haptics">Hápticos </string>
+ <string name="emulation_show_overlay">Mostrar sobreposição </string>
+ <string name="emulation_toggle_all">Alterar todos</string>
+ <string name="emulation_control_adjust">Ajustar a sobreposição </string>
+ <string name="emulation_control_scale">Escala</string>
+ <string name="emulation_control_opacity">Opacidade</string>
+ <string name="emulation_touch_overlay_reset">Redefinir Sobreposição </string>
+ <string name="emulation_touch_overlay_edit">Editar sobreposição </string>
+ <string name="emulation_pause">Pausa emulação</string>
+ <string name="emulation_unpause">Retomar emulação</string>
+ <string name="emulation_input_overlay">Opções de sobreposição </string>
+ <string name="emulation_game_loading">Jogo a carregar...</string>
+
+ <string name="load_settings">Configurações a carregar...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Teclado de Software</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Abortar</string>
+ <string name="continue_button">Continuar</string>
+ <string name="system_archive_not_found">Arquivo do Sistema Não Encontrado</string>
+ <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>
+ <string name="system_archive_general">Um arquivo do sistema</string>
+ <string name="save_load_error">Erro Guardar/Carregar</string>
+ <string name="fatal_error">Erro fatal</string>
+ <string name="fatal_error_message">Ocorreu um erro fatal. Verifica o teu registro para detalhes. \nContinuar a emulação pode causar erros.</string>
+ <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>
+
+ <!-- Region Names -->
+ <string name="region_auto">Autosseleção</string>
+ <string name="region_japan">Japão</string>
+ <string name="region_usa">EUA</string>
+ <string name="region_europe">Europa</string>
+ <string name="region_australia">Austrália</string>
+ <string name="region_china">China</string>
+ <string name="region_korea">Coreia</string>
+ <string name="region_taiwan">Taiwan</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Japonês (日本語)</string>
+ <string name="language_english">Inglês</string>
+ <string name="language_french">Francês (Français)</string>
+ <string name="langauge_german">Alemão (Deutsch)</string>
+ <string name="language_italian">Italiano (Italiano)</string>
+ <string name="language_spanish">Espanhol (Español)</string>
+ <string name="language_chinese">Chinês simplificado (简体中文)</string>
+ <string name="language_korean">Coreano (한국어)</string>
+ <string name="language_dutch">Holandês (Nederlands)</string>
+ <string name="language_portuguese">Português (Português)</string>
+ <string name="language_russian">Russo (Русский)</string>
+ <string name="language_taiwanese">Taiwanês (台湾)</string>
+ <string name="language_british_english">Inglês Britânico</string>
+ <string name="language_canadian_french">Fracês Canadiano (Français canadien)</string>
+ <string name="language_latin_american_spanish">Espanhol da América Latina (Español latino-americano)</string>
+ <string name="language_simplified_chinese">Chinês Simplificado (简体中文)</string>
+ <string name="language_traditional_chinese">Chinês Tradicional (正 體 中文)</string>
+ <string name="language_brazilian_portuguese">Português do Brasil (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulcano</string>
+ <string name="renderer_none">Nenhum</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Normal</string>
+ <string name="renderer_accuracy_high">Alto</string>
+ <string name="renderer_accuracy_extreme">Estremo (Lento)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Lento)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Lento)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Lento)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Imediato (Desligado)</string>
+ <string name="renderer_vsync_mailbox">Caixa de entrada</string>
+ <string name="renderer_vsync_fifo">FIFO (Ligado)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxado </string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Vizinho mais próximo</string>
+ <string name="scaling_filter_bilinear">Bilinear</string>
+ <string name="scaling_filter_bicubic">Bicúbico</string>
+ <string name="scaling_filter_gaussian">Gaussiano</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Nenhum</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Padrão (16:9)</string>
+ <string name="ratio_force_four_three">Forçar 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Forçar 21:9</string>
+ <string name="ratio_force_sixteen_ten">Forçar 16:10</string>
+ <string name="ratio_stretch">Esticar à Janela</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Automático</string>
+ <string name="cpu_accuracy_accurate">Preciso</string>
+ <string name="cpu_accuracy_unsafe">Inseguro</string>
+ <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">D-Pad</string>
+ <string name="gamepad_left_stick">Analógico Esquerdo</string>
+ <string name="gamepad_right_stick">Analógico Direito</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Captura de ecrã</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">A preparar shaders</string>
+ <string name="building_shaders">A criar shaders</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Muda o Tema da App</string>
+ <string name="theme_default">Padrão</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Altera o Modo do Tema</string>
+ <string name="theme_mode_follow_system">Igual ao Sistema</string>
+ <string name="theme_mode_light">Claro</string>
+ <string name="theme_mode_dark">Escuro</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Usa Fundos Escuros</string>
+ <string name="use_black_backgrounds_description">Quando usar tema escuro, aplicar fundos escuros</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 000000000..1401cf6a0
--- /dev/null
+++ b/src/android/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.&lt;br /&gt;&lt;br /&gt;Перед началом работы найдите файл <![CDATA[<b> prod.keys </b>]]> в хранилище устройства..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Узнать больше</a>]]></string>
+ <string name="emulation_notification_channel_name">Эмуляция активна</string>
+ <string name="emulation_notification_channel_description">Показывает постоянное уведомление, когда запущена эмуляция.</string>
+ <string name="emulation_notification_running">yuzu запущен</string>
+ <string name="notice_notification_channel_name">Уведомления и ошибки</string>
+ <string name="notice_notification_channel_description">Показывать уведомления, когда что-то пошло не так</string>
+ <string name="notification_permission_not_granted">Вы не предоставили разрешение уведомлений!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Добро пожаловать!</string>
+ <string name="welcome_description">Узнайте, как настроить &lt;b>yuzu&lt;/b> и перейти прямиком к эмуляции.</string>
+ <string name="get_started">Начать</string>
+ <string name="keys">Ключи</string>
+ <string name="keys_description">Выберите ваш файл &lt;b>prod.keys&lt;/b> с помощью кнопки ниже.</string>
+ <string name="select_keys">Выбрать ключи</string>
+ <string name="games">Игры</string>
+ <string name="games_description">Выберите вашу папку с &lt;b>играми&lt;/b> с помощью кнопки ниже.</string>
+ <string name="done">Готово</string>
+ <string name="done_description">Все готово.\nМожно играть!</string>
+ <string name="text_continue">Продолжить</string>
+ <string name="next">Далее</string>
+ <string name="back">Назад</string>
+ <string name="add_games">Добавить игры</string>
+ <string name="add_games_description">Выберите папку с играми</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Игры</string>
+ <string name="home_search">Поиск</string>
+ <string name="home_settings">Настройки</string>
+ <string name="empty_gamelist">Не найдены файлы или еще не выбрана папка с играми.</string>
+ <string name="search_and_filter_games">Поиск и фильтрация игр</string>
+ <string name="select_games_folder">Выберите папку с играми</string>
+ <string name="select_games_folder_description">Позволяет yuzu заполнить список игр</string>
+ <string name="add_games_warning">Пропустить выбор папки с играми?</string>
+ <string name="add_games_warning_description">Игры не будут отображаться в списке Игры, если папка не выбрана.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Найти игры</string>
+ <string name="games_dir_selected">Выбрана папка с играми</string>
+ <string name="install_prod_keys">Установить prod.keys</string>
+ <string name="install_prod_keys_description">Требуется для расшифровки розничных игр</string>
+ <string name="install_prod_keys_warning">Пропустить добавление ключей?</string>
+ <string name="install_prod_keys_warning_description">Для эмуляции розничных игр требуются действительные ключи. Если вы продолжите, будут работать только homebrew приложения.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Уведомления</string>
+ <string name="notifications_description">Предоставьте разрешение уведомлений с помощью кнопки ниже.</string>
+ <string name="give_permission">Предоставить разрешение</string>
+ <string name="notification_warning">Пропустить предоставление разрешения уведомлений?</string>
+ <string name="notification_warning_description">yuzu не сможет уведомлять вас о важной информации.</string>
+ <string name="permission_denied">Разрешение отказано</string>
+ <string name="permission_denied_description">Вы слишком часто отклоняли это разрешение, и теперь вам нужно будет вручную предоставить его в настройках системы.</string>
+ <string name="about">О нас</string>
+ <string name="about_description">Версия сборки, титры и другое</string>
+ <string name="warning_help">Помощь</string>
+ <string name="warning_skip">Пропустить</string>
+ <string name="warning_cancel">Отмена</string>
+ <string name="install_amiibo_keys">Установить ключи Amiibo</string>
+ <string name="install_amiibo_keys_description">Необходимо для использования Amiibo в играх</string>
+ <string name="invalid_keys_file">Выбран неверный файл ключей</string>
+ <string name="install_keys_success">Ключи успешно установлены</string>
+ <string name="reading_keys_failure">Ошибка при чтении ключей шифрования</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Убедитесь, что ваши ключи имеют расширение .keys\n\n
+ 2. Ключи не должны находиться в папке Downloads.\n\n
+ Исправьте проблему(-ы) и повторите попытку.
+ </string>
+ <string name="invalid_keys_error">Неверные ключи шифрования</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">Выбранный файл неверен или поврежден. Пожалуйста, пере-дампите ваши ключи.</string>
+ <string name="install_gpu_driver">Установить драйвер ГП</string>
+ <string name="install_gpu_driver_description">Установите альтернативные драйверы для потенциально лучшей производительности и/или точности</string>
+ <string name="advanced_settings">Расширенные настройки</string>
+ <string name="settings_description">Настройка параметров эмулятора</string>
+ <string name="search_recently_played">Недавно сыграно</string>
+ <string name="search_recently_added">Недавно добавлено</string>
+ <string name="search_retail">Розничные</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Открыть папку yuzu</string>
+ <string name="open_user_folder_description">Управление внутренними файлами yuzu</string>
+ <string name="theme_and_color_description">Изменение внешнего вида приложения</string>
+ <string name="no_file_manager">Не найден файловый менеджер</string>
+ <string name="notification_no_directory_link">Не удалось открыть папку yuzu</string>
+ <string name="notification_no_directory_link_description">Пожалуйста, найдите папку пользователя с помощью боковой панели файлового менеджера вручную.</string>
+ <string name="manage_save_data">Управление данными сохранений</string>
+ <string name="manage_save_data_description">Найдено данные сохранений. Пожалуйста, выберите вариант ниже.</string>
+ <string name="import_export_saves_description">Импорт или экспорт файлов сохранения</string>
+ <string name="import_export_saves_no_profile">Данные сохранений не найдены. Пожалуйста, запустите игру и повторите попытку.</string>
+ <string name="save_file_imported_success">Успешно импортировано</string>
+ <string name="save_file_invalid_zip_structure">Недопустимая структура папки сохранения</string>
+ <string name="save_file_invalid_zip_structure_description">Название первой вложенной папки должно быть идентификатором игры.</string>
+ <string name="import_saves">Импорт</string>
+ <string name="export_saves">Экспорт</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia не существует</string>
+ <string name="copied_to_clipboard">Скопировано в буфер обмена</string>
+ <string name="about_app_description">Эмулятор Switch с открытым исходным кодом</string>
+ <string name="contributors">Контрибьюторы</string>
+ <string name="contributors_description">Сделано с \u2764 от команды yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Сборка</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Ранний доступ</string>
+ <string name="get_early_access">Получить ранний доступ</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Новейшие возможности, ранний доступ к обновлениям и другое</string>
+ <string name="early_access_benefits">Преимущества раннего доступа</string>
+ <string name="cutting_edge_features">Новейшие возможности</string>
+ <string name="early_access_updates">Ранний доступ к обновлениям</string>
+ <string name="no_manual_installation">Без ручной установки</string>
+ <string name="prioritized_support">Приоритетная поддержка</string>
+ <string name="helping_game_preservation">Помощь в презервации игр</string>
+ <string name="our_eternal_gratitude">Наша бесконечная благодарность</string>
+ <string name="are_you_interested">Вы заинтересованы?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Включить ограничение скорости</string>
+ <string name="frame_limit_enable_description">Если эта функция включена, скорость эмуляции будет ограничена указанным процентом от нормальной скорости.</string>
+ <string name="frame_limit_slider">Ограничение процента cкорости</string>
+ <string name="frame_limit_slider_description">Указывает процент для ограничения скорости эмуляции. При значении по умолчанию 100% эмуляция будет ограничена нормальной скоростью. Значения выше или ниже будут увеличивать или уменьшать ограничение скорости.</string>
+ <string name="cpu_accuracy">Точность ЦП</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Режим док-станции</string>
+ <string name="use_docked_mode_description">Эмуляция режима док-станции, что увеличивает разрешение за счет снижения производительности.</string>
+ <string name="emulated_region">Эмулируемый регион</string>
+ <string name="emulated_language">Эмулируемый язык</string>
+ <string name="select_rtc_date">Выберите дату RTC</string>
+ <string name="select_rtc_time">Выберите время RTC</string>
+ <string name="use_custom_rtc">Включить пользовательский RTC</string>
+ <string name="use_custom_rtc_description">Этот параметр позволяет установить пользовательские часы реального времени отдельно от текущего системного времени</string>
+ <string name="set_custom_rtc">Установить пользовательский RTC</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Уровень точности</string>
+ <string name="renderer_resolution">Разрешение</string>
+ <string name="renderer_vsync">Режим верт. синхронизации</string>
+ <string name="renderer_aspect_ratio">Соотношение сторон</string>
+ <string name="renderer_scaling_filter">Фильтр адаптации окна</string>
+ <string name="renderer_anti_aliasing">Метод сглаживания</string>
+ <string name="renderer_force_max_clock">Принудительно заставить максимальную тактовую частоту (только для Adreno)</string>
+ <string name="renderer_force_max_clock_description">Заставляет ГП работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
+ <string name="renderer_asynchronous_shaders">Использовать асинхронные шейдеры</string>
+ <string name="renderer_asynchronous_shaders_description">Компилирует шейдеры асинхронно, что уменьшает зависания, но может взамен предоставить визуальные баги.</string>
+ <string name="renderer_debug">Включить отладку графики</string>
+ <string name="renderer_debug_description">Если включено, графический API переходит в более медленный режим отладки</string>
+ <string name="use_disk_shader_cache">Использовать кэш шейдеров на диске</string>
+ <string name="use_disk_shader_cache_description">Уменьшение зависаний за счет хранения и загрузки сгенерированных шейдеров на хранилище.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Громкость</string>
+ <string name="audio_volume_description">Задает громкость аудиовыхода.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">По умолчанию</string>
+ <string name="ini_saved">Сохраненные настройки</string>
+ <string name="gameid_saved">Настройки сохранены для %1$s</string>
+ <string name="error_saving">Ошибка сохранения %1$s.ini: %2$s</string>
+ <string name="loading">Загрузка...</string>
+ <string name="reset_setting_confirmation">Хотите ли вы вернуть этот параметр к значению по умолчанию?</string>
+ <string name="reset_to_default">Сброс к настройкам по умолчанию</string>
+ <string name="reset_all_settings">Сбросить все настройки?</string>
+ <string name="reset_all_settings_description">Все дополнительные настройки будут сброшены к настройке по умолчанию. Это невозможно отменить.</string>
+ <string name="settings_reset">Настройки сброшены</string>
+ <string name="close">Закрыть</string>
+ <string name="learn_more">Узнать больше</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Выбрать драйвер ГП</string>
+ <string name="select_gpu_driver_title">Хотите заменить текущий драйвер ГП?</string>
+ <string name="select_gpu_driver_install">Установить</string>
+ <string name="select_gpu_driver_default">По умолчанию</string>
+ <string name="select_gpu_driver_install_success">Установлено %s</string>
+ <string name="select_gpu_driver_use_default">Используется стандартный драйвер ГП </string>
+ <string name="select_gpu_driver_error">Выбран неверный драйвер, используется стандартный системный!</string>
+ <string name="system_gpu_driver">Системный драйвер ГП</string>
+ <string name="installing_driver">Установка драйвера...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Расширенные настройки</string>
+ <string name="preferences_settings">Настройки</string>
+ <string name="preferences_general">Общие</string>
+ <string name="preferences_system">Система</string>
+ <string name="preferences_graphics">Графика</string>
+ <string name="preferences_audio">Аудио</string>
+ <string name="preferences_theme">Тема и цвет</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">Ваш ROM зашифрованный</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Пожалуйста, следуйте инструкциям, чтобы пере-дампить ваши <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">игровые картриджи</a> или <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">установленные игры</a>.]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[Пожалуйста, убедитесь, что ваш файл <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> установлен, чтобы игры можно было расшифровать.]]></string>
+ <string name="loader_error_video_core">Произошла ошибка при инициализации видеоядра.</string>
+ <string name="loader_error_video_core_description">Обычно это вызвано несовместимым драйвером ГП. Установка пользовательского драйвера ГП может решить эту проблему.</string>
+ <string name="loader_error_invalid_format">Не удалось запустить ROM</string>
+ <string name="loader_error_file_not_found">Файл ROM не существует</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Выход из эмуляции</string>
+ <string name="emulation_done">Готово</string>
+ <string name="emulation_fps_counter">Счётчик FPS</string>
+ <string name="emulation_toggle_controls">Переключение управления</string>
+ <string name="emulation_rel_stick_center">Относительный центр стика</string>
+ <string name="emulation_dpad_slide">Слайд крестовиной</string>
+ <string name="emulation_haptics">Тактильная обратная связь</string>
+ <string name="emulation_show_overlay">Показать оверлей</string>
+ <string name="emulation_toggle_all">Переключить всё</string>
+ <string name="emulation_control_adjust">Настроить оверлей</string>
+ <string name="emulation_control_scale">Масштаб</string>
+ <string name="emulation_control_opacity">Непрозрачность</string>
+ <string name="emulation_touch_overlay_reset">Сбросить оверлей</string>
+ <string name="emulation_touch_overlay_edit">Изменить оверлей</string>
+ <string name="emulation_pause">Пауза эмуляции</string>
+ <string name="emulation_unpause">Возобновление эмуляции</string>
+ <string name="emulation_input_overlay">Настройки оверлея</string>
+ <string name="emulation_game_loading">Загрузка игры...</string>
+
+ <string name="load_settings">Загрузка настроек...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Виртуальная клавиатура</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Прервать</string>
+ <string name="continue_button">Продолжить</string>
+ <string name="system_archive_not_found">Системный архив не найден</string>
+ <string name="system_archive_not_found_message">%s отсутствует. Пожалуйста, сдампите ваши системные архивы.\nПродолжение эмуляции может привести к сбоям и ошибкам.</string>
+ <string name="system_archive_general">Системный архив</string>
+ <string name="save_load_error">Ошибка сохранения/загрузки</string>
+ <string name="fatal_error">Фатальная ошибка</string>
+ <string name="fatal_error_message">Произошла фатальная ошибка. Проверьте журнал для получения подробной информации.\nПродолжение эмуляции может привести к сбоям и ошибкам.</string>
+ <string name="performance_warning">Отключение этой настройки значительно снизит производительность эмуляции! Для достижения наилучших результатов рекомендуется оставить эту настройку включенной.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Авто-выбор</string>
+ <string name="region_japan">Япония</string>
+ <string name="region_usa">США</string>
+ <string name="region_europe">Европа</string>
+ <string name="region_australia">Австралия</string>
+ <string name="region_china">Китай</string>
+ <string name="region_korea">Корея</string>
+ <string name="region_taiwan">Тайвань</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Японский (日本語)</string>
+ <string name="language_english">Английский (English)</string>
+ <string name="language_french">Французский (Français)</string>
+ <string name="langauge_german">Немецкий (Deutsch)</string>
+ <string name="language_italian">Итальянский (Italiano)</string>
+ <string name="language_spanish">Испанский (Español)</string>
+ <string name="language_chinese">Китайский (简体中文)</string>
+ <string name="language_korean">Корейский (한국어)</string>
+ <string name="language_dutch">Голландский (Nederlands)</string>
+ <string name="language_portuguese">Португальский (Português)</string>
+ <string name="language_russian">Русский</string>
+ <string name="language_taiwanese">Тайваньский (台湾)</string>
+ <string name="language_british_english">Британский английский</string>
+ <string name="language_canadian_french">Канадский французский (Français canadien)</string>
+ <string name="language_latin_american_spanish">Латиноамериканский испанский (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Упрощенный китайский (简体中文)</string>
+ <string name="language_traditional_chinese">Традиционный китайский (正體中文)</string>
+ <string name="language_brazilian_portuguese">Бразильский португальский (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Никакой</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Нормальная</string>
+ <string name="renderer_accuracy_high">Высокая</string>
+ <string name="renderer_accuracy_extreme">Экстрим (медленный)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Медленно)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Медленно)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Медленно)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Моментальная (выключена) </string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (Включена)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Ближайший сосед</string>
+ <string name="scaling_filter_bilinear">Билинейный</string>
+ <string name="scaling_filter_bicubic">Бикубический</string>
+ <string name="scaling_filter_gaussian">Гаусс</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™️ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Выкл.</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">Стандартное (16:9)</string>
+ <string name="ratio_force_four_three">Заставить 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Заставить 21:9</string>
+ <string name="ratio_force_sixteen_ten">Заставить 16:10</string>
+ <string name="ratio_stretch">Растянуть до окна</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Авто</string>
+ <string name="cpu_accuracy_accurate">Точно</string>
+ <string name="cpu_accuracy_unsafe">Небезопасно</string>
+ <string name="cpu_accuracy_paranoid">Параноик (медленно)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">Крестовина</string>
+ <string name="gamepad_left_stick">Левый мини-джойстик</string>
+ <string name="gamepad_right_stick">Правый мини-джойстик</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Скриншот</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Подготовка шейдеров</string>
+ <string name="building_shaders">Постройка шейдеров</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Изменить тему приложения</string>
+ <string name="theme_default">По умолчанию</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Изменить режим темы</string>
+ <string name="theme_mode_follow_system">Системная</string>
+ <string name="theme_mode_light">Светлая</string>
+ <string name="theme_mode_dark">Темная</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Использовать черный фон</string>
+ <string name="use_black_backgrounds_description">При использовании темной темы применяйте черный фон.</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml
new file mode 100644
index 000000000..86d9c84f0
--- /dev/null
+++ b/src/android/app/src/main/res/values-uk/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.&lt;br /&gt;&lt;br /&gt;Перед початком роботи знайдіть ваш файл <![CDATA[<b> prod.keys </b>]]> у сховищі пристрою.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Дізнатися більше</a>]]></string>
+ <string name="emulation_notification_channel_name">Емуляція активна</string>
+ <string name="emulation_notification_channel_description">Показує постійне сповіщення, коли запущено емуляцію.</string>
+ <string name="emulation_notification_running">yuzu запущено</string>
+ <string name="notice_notification_channel_name">Сповіщення та помилки</string>
+ <string name="notice_notification_channel_description">Показувати сповіщення, коли щось пішло не так</string>
+ <string name="notification_permission_not_granted">Ви не надали дозвіл сповіщень!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">Вітаємо!</string>
+ <string name="welcome_description">Дізнайтеся, як налаштувати &lt;b>yuzu&lt;/b> та перейти до емуляції.</string>
+ <string name="get_started">Розпочати</string>
+ <string name="keys">Ключі</string>
+ <string name="keys_description">Виберіть ваш файл &lt;b>prod.keys&lt;/b> за допомогою кнопки нижче.</string>
+ <string name="select_keys">Вибрати ключі</string>
+ <string name="games">Ігри</string>
+ <string name="games_description">Виберіть вашу папку з &lt;b>іграми&lt;/b> за допомогою кнопки нижче.</string>
+ <string name="done">Готово</string>
+ <string name="done_description">Все готово.\nМожна грати!</string>
+ <string name="text_continue">Продовжити</string>
+ <string name="next">Далі</string>
+ <string name="back">Назад</string>
+ <string name="add_games">Додати ігри</string>
+ <string name="add_games_description">Виберіть папку з іграми</string>
+
+ <!-- Home strings -->
+ <string name="home_games">Ігри</string>
+ <string name="home_search">Пошук</string>
+ <string name="home_settings">Налаштування</string>
+ <string name="empty_gamelist">Не знайдено файлів або ще не вибрано папку з іграми.</string>
+ <string name="search_and_filter_games">Пошук та фільтрація ігор</string>
+ <string name="select_games_folder">Виберіть папку з іграми</string>
+ <string name="select_games_folder_description">Дозволяє yuzu заповнити список ігор</string>
+ <string name="add_games_warning">Пропустити вибір папки з іграми?</string>
+ <string name="add_games_warning_description">Ігри не відображатимуться у списку Ігри, якщо папку не вибрано.</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">Знайти ігри</string>
+ <string name="games_dir_selected">Вибрано папку з іграми</string>
+ <string name="install_prod_keys">Встановити prod.keys</string>
+ <string name="install_prod_keys_description">Потрібно для розшифровки роздрібних ігор</string>
+ <string name="install_prod_keys_warning">Пропустити додавання ключів?</string>
+ <string name="install_prod_keys_warning_description">Для емуляції роздрібних ігор потрібні дійсні ключі. Якщо ви продовжите, працюватимуть тільки homebrew додатки.</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">Сповіщення</string>
+ <string name="notifications_description">Надайте дозвіл сповіщень за допомогою кнопки нижче.</string>
+ <string name="give_permission">Надати дозвіл</string>
+ <string name="notification_warning">Пропустити надання дозволу сповіщень?</string>
+ <string name="notification_warning_description">yuzu не зможе повідомляти вас про важливу інформацію.</string>
+ <string name="permission_denied">У дозволі відмовлено</string>
+ <string name="permission_denied_description">Ви занадто часто відхиляли цей дозвіл, тож тепер вам потрібно буде вручну надати його в системних налаштуваннях.</string>
+ <string name="about">Про нас</string>
+ <string name="about_description">Версія збірки, титри та інше</string>
+ <string name="warning_help">Допомога</string>
+ <string name="warning_skip">Пропустити</string>
+ <string name="warning_cancel">Відміна</string>
+ <string name="install_amiibo_keys">Встановити ключі Amiibo</string>
+ <string name="install_amiibo_keys_description">Необхідно для використання Amiibo в іграх</string>
+ <string name="invalid_keys_file">Вибрано неправильний файл ключів</string>
+ <string name="install_keys_success">Ключі успішно встановлено</string>
+ <string name="reading_keys_failure">Помилка під час зчитування ключів шифрування</string>
+ <string name="install_keys_failure_extension_description">
+ 1. Переконайтеся, що ваші ключі мають розширення .keys\n\n
+ 2. Ключі не повинні знаходитися в папці Downloads.\n\n
+ Виправте проблему(-и) та спробуйте ще раз.
+ </string>
+ <string name="invalid_keys_error">Невірні ключі шифрування</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">Обраний файл невірний або пошкоджений. Будь ласка, пере-дампіть ваші ключі.</string>
+ <string name="install_gpu_driver">Встановити драйвер ГП</string>
+ <string name="install_gpu_driver_description">Встановіть альтернативні драйвери для потенційно кращої продуктивності та/або точності</string>
+ <string name="advanced_settings">Розширені налаштування</string>
+ <string name="settings_description">Налаштування параметрів емулятора</string>
+ <string name="search_recently_played">Нещодавно зіграно</string>
+ <string name="search_recently_added">Нещодавно додано</string>
+ <string name="search_retail">Роздрібні</string>
+ <string name="search_homebrew">Homebrew</string>
+ <string name="open_user_folder">Відкрити папку yuzu</string>
+ <string name="open_user_folder_description">Керування внутрішніми файлами yuzu</string>
+ <string name="theme_and_color_description">Змінити зовнішній вигляд застосунку</string>
+ <string name="no_file_manager">Не знайдено файлового менеджера</string>
+ <string name="notification_no_directory_link">Не вдалося відкрити папку yuzu</string>
+ <string name="notification_no_directory_link_description">Будь ласка, знайдіть папку користувача за допомогою бічної панелі файлового менеджера вручну.</string>
+ <string name="manage_save_data">Керування даними збережень</string>
+ <string name="manage_save_data_description">Знайдено дані збережень. Будь ласка, виберіть варіант нижче.</string>
+ <string name="import_export_saves_description">Імпорт або експорт файлів збереження</string>
+ <string name="import_export_saves_no_profile">Дані збережень не знайдено. Будь ласка, запустіть гру та повторіть спробу.</string>
+ <string name="save_file_imported_success">Успішно імпортовано</string>
+ <string name="save_file_invalid_zip_structure">Неприпустима структура папки збереження</string>
+ <string name="save_file_invalid_zip_structure_description">Назва першої вкладеної папки має бути ідентифікатором гри.</string>
+ <string name="import_saves">Імпорт</string>
+ <string name="export_saves">Експорт</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia не існує</string>
+ <string name="copied_to_clipboard">Скопійовано в буфер обміну</string>
+ <string name="about_app_description">Емулятор Switch із відкритим першокодом</string>
+ <string name="contributors">Вкладники</string>
+ <string name="contributors_description">Зроблено з \u2764 від команди yuzu</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">Збірка</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">Ранній доступ</string>
+ <string name="get_early_access">Отримати ранній доступ</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">Новітні можливості, ранній доступ до оновлень та інше</string>
+ <string name="early_access_benefits">Переваги раннього доступу</string>
+ <string name="cutting_edge_features">Новітні можливості</string>
+ <string name="early_access_updates">Ранній доступ до оновлень</string>
+ <string name="no_manual_installation">Без ручного встановлення</string>
+ <string name="prioritized_support">Пріоритетна підтримка</string>
+ <string name="helping_game_preservation">Допомога в презервації ігор</string>
+ <string name="our_eternal_gratitude">Наша нескінченна вдячність</string>
+ <string name="are_you_interested">Ви зацікавлені?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">Увімкнути обмеження швидкості</string>
+ <string name="frame_limit_enable_description">Якщо цю функцію ввімкнено, швидкість емуляції буде обмежена зазначеним відсотком від нормальної швидкості.</string>
+ <string name="frame_limit_slider">Обмеження відсотка швидкості</string>
+ <string name="frame_limit_slider_description">Вказує відсоток для обмеження швидкості емуляції. При значенні за замовчуванням 100% емуляція буде обмежена нормальною швидкістю. Значення вище або нижче збільшуватимуть або зменшуватимуть обмеження швидкості.</string>
+ <string name="cpu_accuracy">Точність ЦП</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">Режим док-станції</string>
+ <string name="use_docked_mode_description">Емуляція режиму док-станції, що збільшує роздільну здатність за рахунок зниження продуктивності.</string>
+ <string name="emulated_region">Емульований регіон</string>
+ <string name="emulated_language">Емульована мова</string>
+ <string name="select_rtc_date">Оберіть дату RTC</string>
+ <string name="select_rtc_time">Оберіть час RTC</string>
+ <string name="use_custom_rtc">Увімкнути користувацький RTC</string>
+ <string name="use_custom_rtc_description">Цей параметр дає змогу встановити користувацький годинник реального часу окремо від поточного системного часу</string>
+ <string name="set_custom_rtc">Встановити користувацький RTC</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">Рівень точності</string>
+ <string name="renderer_resolution">Роздільна здатність</string>
+ <string name="renderer_vsync">Режим верт. синхронізації</string>
+ <string name="renderer_aspect_ratio">Співвідношення сторін</string>
+ <string name="renderer_scaling_filter">Фільтр адаптації вікна</string>
+ <string name="renderer_anti_aliasing">Метод згладжування</string>
+ <string name="renderer_force_max_clock">Примусово змусити максимальну тактову частоту (тільки для Adreno)</string>
+ <string name="renderer_force_max_clock_description">Змушує ГП працювати на максимально можливих тактових частотах (теплові обмеження все одно будуть застосовуватися).</string>
+ <string name="renderer_asynchronous_shaders">Використовувати асинхронні шейдери</string>
+ <string name="renderer_asynchronous_shaders_description">Компілює шейдери асинхронно, що зменшує зависання, але може натомість надати візуальні баги.</string>
+ <string name="renderer_debug">Увімкнути налагодження графіки</string>
+ <string name="renderer_debug_description">Якщо увімкнено, графічний API переходить у повільніший режим налагодження</string>
+ <string name="use_disk_shader_cache">Використовувати кеш шейдерів на диску</string>
+ <string name="use_disk_shader_cache_description">Зменшення зависань завдяки зберіганню та завантаженню згенерованих шейдерів на сховище.</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">Гучність</string>
+ <string name="audio_volume_description">Вказує гучність аудіовиходу.</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">За замовчуванням</string>
+ <string name="ini_saved">Збережені налаштування</string>
+ <string name="gameid_saved">Налаштування збережені для %1$s</string>
+ <string name="error_saving">Помилка збереження %1$s.ini: %2$s</string>
+ <string name="loading">Завантаження...</string>
+ <string name="reset_setting_confirmation">Чи хочете ви повернути цей параметр до значення за замовчуванням?</string>
+ <string name="reset_to_default">Скидання до налаштувань за замовчуванням</string>
+ <string name="reset_all_settings">Скинути всі налаштування</string>
+ <string name="reset_all_settings_description">Усі додаткові налаштування буде скинуто до налаштування за замовчуванням. Це неможливо скасувати.</string>
+ <string name="settings_reset">Налаштування скинуто</string>
+ <string name="close">Закрити</string>
+ <string name="learn_more">Дізнатися більше</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">Вибрати драйвер ГП</string>
+ <string name="select_gpu_driver_title">Хочете замінити поточний драйвер ГП?</string>
+ <string name="select_gpu_driver_install">Встановити</string>
+ <string name="select_gpu_driver_default">За замовчуванням</string>
+ <string name="select_gpu_driver_install_success">Встановлено %s</string>
+ <string name="select_gpu_driver_use_default">Використовується стандартний драйвер ГП</string>
+ <string name="select_gpu_driver_error">Обрано неправильний драйвер, використовується стандартний системний!</string>
+ <string name="system_gpu_driver">Системний драйвер ГП</string>
+ <string name="installing_driver">Встановлення драйвера...</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">Розширені налаштування</string>
+ <string name="preferences_settings">Налаштування</string>
+ <string name="preferences_general">Загальні</string>
+ <string name="preferences_system">Система</string>
+ <string name="preferences_graphics">Графіка</string>
+ <string name="preferences_audio">Аудіо</string>
+ <string name="preferences_theme">Тема і колір</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">Ваш ROM зашифрований</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[Будь ласка, дотримуйтесь інструкцій, щоб пере-дампити ваші <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">ігрові картриджі</a> або <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">встановлені ігри</a>.]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[Будь ласка, переконайтеся, що ваш файл <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> встановлено, щоб ігри можна було розшифрувати.]]></string>
+ <string name="loader_error_video_core">Сталася помилка під час ініціалізації відеоядра.</string>
+ <string name="loader_error_video_core_description">Зазвичай це спричинено несумісним драйвером ГП. Встановлення користувацького драйвера ГП може вирішити цю проблему.</string>
+ <string name="loader_error_invalid_format">Не вдалося запустити ROM</string>
+ <string name="loader_error_file_not_found">Файл ROM не існує</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">Вихід з емуляції</string>
+ <string name="emulation_done">Готово</string>
+ <string name="emulation_fps_counter">Лічильник FPS</string>
+ <string name="emulation_toggle_controls">Перемикання керування</string>
+ <string name="emulation_rel_stick_center">Відносний центр стіка</string>
+ <string name="emulation_dpad_slide">Слайд хрестовиною</string>
+ <string name="emulation_haptics">Тактильний зворотний зв\'язок</string>
+ <string name="emulation_show_overlay">Показати оверлей</string>
+ <string name="emulation_toggle_all">Перемкнути все</string>
+ <string name="emulation_control_adjust">Налаштувати оверлей</string>
+ <string name="emulation_control_scale">Масштаб</string>
+ <string name="emulation_control_opacity">Непрозорість</string>
+ <string name="emulation_touch_overlay_reset">Скинути оверлей</string>
+ <string name="emulation_touch_overlay_edit">Змінити оверлей</string>
+ <string name="emulation_pause">Пауза емуляції</string>
+ <string name="emulation_unpause">Відновлення емуляції</string>
+ <string name="emulation_input_overlay">Налаштування оверлея</string>
+ <string name="emulation_game_loading">Завантаження гри...</string>
+
+ <string name="load_settings">Завантаження налаштувань...</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">Віртуальна клавіатура</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">Перервати</string>
+ <string name="continue_button">Продовжити</string>
+ <string name="system_archive_not_found">Системний архів не знайдено</string>
+ <string name="system_archive_not_found_message">%s відсутній. Будь ласка, здампіть ваші системні архіви.\nПродовження емуляції може призвести до збоїв і помилок.</string>
+ <string name="system_archive_general">Системний архів</string>
+ <string name="save_load_error">Помилка збереження/завантаження</string>
+ <string name="fatal_error">Фатальна помилка</string>
+ <string name="fatal_error_message">Сталася фатальна помилка. Перевірте журнал для отримання докладної інформації.\nПродовження емуляції може призвести до збоїв і помилок.</string>
+ <string name="performance_warning">Вимкнення цього налаштування значно знизить продуктивність емуляції! Для досягнення найкращих результатів рекомендується залишити це налаштування увімкненим.</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">Авто-вибір</string>
+ <string name="region_japan">Японія</string>
+ <string name="region_usa">США</string>
+ <string name="region_europe">Європа</string>
+ <string name="region_australia">Австралія</string>
+ <string name="region_china">Китай</string>
+ <string name="region_korea">Корея</string>
+ <string name="region_taiwan">Тайвань</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">Японська (日本語)</string>
+ <string name="language_english">Англійська (English)</string>
+ <string name="language_french">Французька (Français)</string>
+ <string name="langauge_german">Німецька (Deutsch)</string>
+ <string name="language_italian">Італійська (Italiano)</string>
+ <string name="language_spanish">Іспанська (Español)</string>
+ <string name="language_chinese">Китайскька (简体中文)</string>
+ <string name="language_korean">Корейська (한국어)</string>
+ <string name="language_dutch">Голландська (Nederlands)</string>
+ <string name="language_portuguese">Португальська (Português)</string>
+ <string name="language_russian">Російська (Русский)</string>
+ <string name="language_taiwanese">Тайванська (台湾)</string>
+ <string name="language_british_english">Британська англійська</string>
+ <string name="language_canadian_french">Канадська французька (Français canadien)</string>
+ <string name="language_latin_american_spanish">Латиноамериканська іспанська (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">Спрощена китайська (简体中文)</string>
+ <string name="language_traditional_chinese">Традиційна китайська (正體中文)</string>
+ <string name="language_brazilian_portuguese">Бразильська португальська (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">Вимкнено</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">Нормальна</string>
+ <string name="renderer_accuracy_high">Висока</string>
+ <string name="renderer_accuracy_extreme">Екстрим (повільно)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (Повільно)</string>
+ <string name="resolution_three">3X (2160p/3240p) (Повільно)</string>
+ <string name="resolution_four">4X (2880p/4320p) (Повільно)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">Моментальна (вимкнена)</string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (ввімкнута)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">Найближчий сусід</string>
+ <string name="scaling_filter_bilinear">Білінійне</string>
+ <string name="scaling_filter_bicubic">Бікубічне</string>
+ <string name="scaling_filter_gaussian">Гауса</string>
+ <string name="scaling_filter_scale_force">ScaleForce</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">Вимкнено</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">За замовчуванням (16:9)</string>
+ <string name="ratio_force_four_three">Змусити 4:3</string>
+ <string name="ratio_force_twenty_one_nine">Змусити 21:9</string>
+ <string name="ratio_force_sixteen_ten">Змусити 16:10</string>
+ <string name="ratio_stretch">Розтягнути до вікна</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">Авто</string>
+ <string name="cpu_accuracy_accurate">Точно</string>
+ <string name="cpu_accuracy_unsafe">Небезпечно</string>
+ <string name="cpu_accuracy_paranoid">Параноїк (повільно)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">Кнопки напрямків</string>
+ <string name="gamepad_left_stick">Лівий міні-джойстик</string>
+ <string name="gamepad_right_stick">Правий міні-джойстик</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">Знімок екрану</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">Підготовка шейдерів</string>
+ <string name="building_shaders">Побудова шейдерів</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">Змінити тему застосунку</string>
+ <string name="theme_default">За замовчуванням</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">Змінити режим теми</string>
+ <string name="theme_mode_follow_system">Системна</string>
+ <string name="theme_mode_light">Світла</string>
+ <string name="theme_mode_dark">Темна</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">Використовувати чорне тло</string>
+ <string name="use_black_backgrounds_description">У разі використання темної теми застосовуйте чорне тло.</string>
+
+</resources>
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
new file mode 100644
index 000000000..034421c92
--- /dev/null
+++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。&lt;br /&gt;&lt;br /&gt;在开始前,请找到放置于设备存储中的 <![CDATA[<b> prod.keys </b>]]> 文件。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">了解更多</a>]]></string>
+ <string name="emulation_notification_channel_name">正在进行模拟</string>
+ <string name="emulation_notification_channel_description">在模拟运行时显示持久通知。</string>
+ <string name="emulation_notification_running">yuzu 正在运行</string>
+ <string name="notice_notification_channel_name">通知及错误提醒</string>
+ <string name="notice_notification_channel_description">当发生错误时显示通知。</string>
+ <string name="notification_permission_not_granted">未授予通知权限!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">欢迎!</string>
+ <string name="welcome_description">了解如何设置 &lt;b>yuzu&lt;/b> 并进行模拟。</string>
+ <string name="get_started">开始</string>
+ <string name="keys">密钥文件</string>
+ <string name="keys_description">使用下方的按钮来选择你的 &lt;b>prod.keys&lt;/b> 文件。</string>
+ <string name="select_keys">选择密钥文件</string>
+ <string name="games">游戏</string>
+ <string name="games_description">使用下方的按钮选择你的 &lt;b>游戏&lt;/b> 文件夹。</string>
+ <string name="done">完成</string>
+ <string name="done_description">你完成了全部设置。\n玩的开心!</string>
+ <string name="text_continue">继续</string>
+ <string name="next">下一步</string>
+ <string name="back">上一步</string>
+ <string name="add_games">添加游戏</string>
+ <string name="add_games_description">选择你的游戏文件夹</string>
+
+ <!-- Home strings -->
+ <string name="home_games">游戏</string>
+ <string name="home_search">搜索</string>
+ <string name="home_settings">设置</string>
+ <string name="empty_gamelist">找不到游戏,或者尚未选择游戏文件夹。</string>
+ <string name="search_and_filter_games">搜索游戏</string>
+ <string name="select_games_folder">选择游戏文件夹</string>
+ <string name="select_games_folder_description">允许 yuzu 填充游戏列表</string>
+ <string name="add_games_warning">跳过选择游戏文件夹?</string>
+ <string name="add_games_warning_description">如果未选择游戏文件夹,游戏将不会显示在游戏列表中。</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">搜索游戏</string>
+ <string name="games_dir_selected">已选择游戏文件夹</string>
+ <string name="install_prod_keys">安装 prod.keys 文件</string>
+ <string name="install_prod_keys_description">需要密钥文件来解密游戏</string>
+ <string name="install_prod_keys_warning">跳过添加密钥文件?</string>
+ <string name="install_prod_keys_warning_description">对于商业游戏,需要有效的密钥文件才能运行。如果没有密钥文件,将只能运行自制软件。</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">通知</string>
+ <string name="notifications_description">使用下方的按钮授予通知权限。</string>
+ <string name="give_permission">授予权限</string>
+ <string name="notification_warning">跳过授予通知权限?</string>
+ <string name="notification_warning_description">yuzu 将无法通知您重要信息。</string>
+ <string name="permission_denied">授权遭拒</string>
+ <string name="permission_denied_description">您曾多次拒绝权限请求,现在您需要在系统设置中手动授予权限。</string>
+ <string name="about">关于</string>
+ <string name="about_description">开发版本、贡献者、以及更多</string>
+ <string name="warning_help">帮助</string>
+ <string name="warning_skip">跳过</string>
+ <string name="warning_cancel">取消</string>
+ <string name="install_amiibo_keys">安装 Amiibo 密钥文件</string>
+ <string name="install_amiibo_keys_description">在遊戏中使用 Amiibo 时必需</string>
+ <string name="invalid_keys_file">选择的密钥文件无效</string>
+ <string name="install_keys_success">密钥文件已成功安装</string>
+ <string name="reading_keys_failure">读取加密密钥时出错</string>
+ <string name="install_keys_failure_extension_description">
+ 1. 验证您的密钥文件是否具有 .keys 扩展名。\n\n
+ 2. 密钥文件不能放置于 Downloads 文件夹。\n\n
+ 解决问题并再试一次。
+ </string>
+ <string name="invalid_keys_error">无效的加密密钥</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">选择的密钥文件不正确或已损坏。请重新转储密钥文件。</string>
+ <string name="install_gpu_driver">安装 GPU 驱动</string>
+ <string name="install_gpu_driver_description">安装替代的驱动程序以获得更好的性能和精度</string>
+ <string name="advanced_settings">高级选项</string>
+ <string name="settings_description">更改模拟器设置</string>
+ <string name="search_recently_played">最近游玩</string>
+ <string name="search_recently_added">最近添加</string>
+ <string name="search_retail">商业游戏</string>
+ <string name="search_homebrew">自制游戏</string>
+ <string name="open_user_folder">打开 yuzu 文件夹</string>
+ <string name="open_user_folder_description">管理 yuzu 内部文件</string>
+ <string name="theme_and_color_description">更改外观</string>
+ <string name="no_file_manager">找不到可用的文件管理器</string>
+ <string name="notification_no_directory_link">无法打开 yuzu 文件夹</string>
+ <string name="notification_no_directory_link_description">请使用文件管理器的侧部面板手动定位用户文件夹。</string>
+ <string name="manage_save_data">管理存档数据</string>
+ <string name="manage_save_data_description">已找到存档数据,请选择下方的选项。</string>
+ <string name="import_export_saves_description">导入或导出存档</string>
+ <string name="import_export_saves_no_profile">找不到存档数据,请启动游戏并重试。</string>
+ <string name="save_file_imported_success">已成功导入存档</string>
+ <string name="save_file_invalid_zip_structure">无效的存档目录</string>
+ <string name="save_file_invalid_zip_structure_description">第一个子文件夹名称必须为当前游戏的 ID。</string>
+ <string name="import_saves">导入</string>
+ <string name="export_saves">导出</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia 不真实</string>
+ <string name="copied_to_clipboard">已复制到剪贴板</string>
+ <string name="about_app_description">一款开放源代码的 Switch 模拟器</string>
+ <string name="contributors">贡献者</string>
+ <string name="contributors_description">使用来自 yuzu 团队的 \u2764 制作</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">构建版本</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">抢先体验</string>
+ <string name="get_early_access">取得抢先体验</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">最新的功能、抢先更新、以及更多</string>
+ <string name="early_access_benefits">抢先体验的权益</string>
+ <string name="cutting_edge_features">最新功能</string>
+ <string name="early_access_updates">抢先更新</string>
+ <string name="no_manual_installation">无需手动安装</string>
+ <string name="prioritized_support">优先支持</string>
+ <string name="helping_game_preservation">帮助保留游戏</string>
+ <string name="our_eternal_gratitude">我们真诚的感激</string>
+ <string name="are_you_interested">您对此感兴趣吗?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">启用运行速度限制</string>
+ <string name="frame_limit_enable_description">启用后,模拟速度将限制在正常运行速度的指定百分比。</string>
+ <string name="frame_limit_slider">限制速度百分比</string>
+ <string name="frame_limit_slider_description">指定限制模拟速度的百分比。预设为 100%,此时模拟速度将被限制为标准速度。更高或更低的值将增加或降低速度限制上限。</string>
+ <string name="cpu_accuracy">CPU 精度</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">主机模式</string>
+ <string name="use_docked_mode_description">以主机模式进行模拟,牺牲性能并提高画面分辨率。</string>
+ <string name="emulated_region">模拟区域</string>
+ <string name="emulated_language">模拟语言</string>
+ <string name="select_rtc_date">选择日期</string>
+ <string name="select_rtc_time">选择时间</string>
+ <string name="use_custom_rtc">启用自定义系统时钟</string>
+ <string name="use_custom_rtc_description">此选项允许您设置与目前系统时间相独立的自定义系统时钟</string>
+ <string name="set_custom_rtc">设置自定义系统时钟</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">精度等级</string>
+ <string name="renderer_resolution">分辨率</string>
+ <string name="renderer_vsync">垂直同步模式</string>
+ <string name="renderer_aspect_ratio">屏幕纵横比</string>
+ <string name="renderer_scaling_filter">窗口滤镜</string>
+ <string name="renderer_anti_aliasing">抗锯齿方式</string>
+ <string name="renderer_force_max_clock">强制最大时钟 (仅限 Adreno)</string>
+ <string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (仍被温控限制)。</string>
+ <string name="renderer_asynchronous_shaders">使用异步着色器</string>
+ <string name="renderer_asynchronous_shaders_description">异步编译着色器,减少卡顿,但可能引入故障。</string>
+ <string name="renderer_debug">启用图形调试</string>
+ <string name="renderer_debug_description">启用时,图形 API 将进入较慢的调试模式。</string>
+ <string name="use_disk_shader_cache">使用磁盘着色器缓存</string>
+ <string name="use_disk_shader_cache_description">将生成的着色器缓存于磁盘中并进行读取以减少卡顿。</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">音量</string>
+ <string name="audio_volume_description">指定输出的音量。</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">系统默认</string>
+ <string name="ini_saved">已保存设置</string>
+ <string name="gameid_saved">已保存 %1$s 的设置</string>
+ <string name="error_saving">保存 %1$s.ini 时出错: %2$s</string>
+ <string name="loading">加载中…</string>
+ <string name="reset_setting_confirmation">您要将此设定重设为默认值吗?</string>
+ <string name="reset_to_default">恢复默认</string>
+ <string name="reset_all_settings">重置所有设置项?</string>
+ <string name="reset_all_settings_description">所有高级选项都将被重设,此动作无法还原。</string>
+ <string name="settings_reset">重设设置项</string>
+ <string name="close">关闭</string>
+ <string name="learn_more">了解更多</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">选择 GPU 驱动程序</string>
+ <string name="select_gpu_driver_title">要取代您当前的 GPU 驱动程序吗?</string>
+ <string name="select_gpu_driver_install">安装</string>
+ <string name="select_gpu_driver_default">系统默认</string>
+ <string name="select_gpu_driver_install_success">已安装 %s</string>
+ <string name="select_gpu_driver_use_default">使用默认 GPU 驱动程序</string>
+ <string name="select_gpu_driver_error">选择的驱动程序无效,将使用系统默认的驱动程序!</string>
+ <string name="system_gpu_driver">系统 GPU 驱动程序</string>
+ <string name="installing_driver">正在安装驱动程序…</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">高级选项</string>
+ <string name="preferences_settings">设置</string>
+ <string name="preferences_general">通用</string>
+ <string name="preferences_system">系统</string>
+ <string name="preferences_graphics">图形</string>
+ <string name="preferences_audio">声音</string>
+ <string name="preferences_theme">主题和色彩</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">您的 ROM 已加密</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[请参考指南重新转储你的<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">游戏卡带</a>或<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">已安装的游戏</a>。]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[请确保 <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 文件已安装,使得游戏可以被解密。]]></string>
+ <string name="loader_error_video_core">初始化视频核心时发生错误</string>
+ <string name="loader_error_video_core_description">这通常由不兼容的 GPU 驱动程序造成,安装自定义 GPU 驱动程序可能解决此问题。</string>
+ <string name="loader_error_invalid_format">无法载入 ROM</string>
+ <string name="loader_error_file_not_found">ROM 文件不存在</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">退出模拟</string>
+ <string name="emulation_done">完成</string>
+ <string name="emulation_fps_counter">FPS 计数器</string>
+ <string name="emulation_toggle_controls">按键切换</string>
+ <string name="emulation_rel_stick_center">相对摇杆中心</string>
+ <string name="emulation_dpad_slide">十字方向键滑动</string>
+ <string name="emulation_haptics">触觉反馈</string>
+ <string name="emulation_show_overlay">显示虚拟按键</string>
+ <string name="emulation_toggle_all">全部切换</string>
+ <string name="emulation_control_adjust">调整虚拟按键</string>
+ <string name="emulation_control_scale">缩放</string>
+ <string name="emulation_control_opacity">不透明度</string>
+ <string name="emulation_touch_overlay_reset">重设虚拟按键</string>
+ <string name="emulation_touch_overlay_edit">编辑虚拟按键</string>
+ <string name="emulation_pause">暂停模拟</string>
+ <string name="emulation_unpause">继续模拟</string>
+ <string name="emulation_input_overlay">虚拟按键选项</string>
+ <string name="emulation_game_loading">载入游戏中…</string>
+
+ <string name="load_settings">正在载入设定…</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">软件键盘</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">中止</string>
+ <string name="continue_button">继续</string>
+ <string name="system_archive_not_found">未找到系统档案</string>
+ <string name="system_archive_not_found_message">%s 丢失,请转储您的系统档案。\n继续模拟可能造成崩溃和错误。</string>
+ <string name="system_archive_general">系统档案</string>
+ <string name="save_load_error">保存/载入发生错误</string>
+ <string name="fatal_error">致命错误</string>
+ <string name="fatal_error_message">发生致命错误,请查阅日志获取详细信息。\n继续模拟可能会造成崩溃和错误。</string>
+ <string name="performance_warning">关闭此项会显著降低模拟性能!建议您将此项保持为启用状态。</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">自动选择</string>
+ <string name="region_japan">日本</string>
+ <string name="region_usa">美国</string>
+ <string name="region_europe">欧洲</string>
+ <string name="region_australia">澳大利亚</string>
+ <string name="region_china">中国</string>
+ <string name="region_korea">韩国</string>
+ <string name="region_taiwan">中国台湾</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">日语 (日本語)</string>
+ <string name="language_english">英语 (English)</string>
+ <string name="language_french">法语 (Français)</string>
+ <string name="langauge_german">德语 (Deutsch)</string>
+ <string name="language_italian">意大利语 (Italiano)</string>
+ <string name="language_spanish">西班牙语 (Español)</string>
+ <string name="language_chinese">中文 (简体中文)</string>
+ <string name="language_korean">韩语 (한국어)</string>
+ <string name="language_dutch">荷兰语 (Nederlands)</string>
+ <string name="language_portuguese">葡萄牙语 (Português)</string>
+ <string name="language_russian">俄语 (Русский)</string>
+ <string name="language_taiwanese">台湾中文 (台灣)</string>
+ <string name="language_british_english">英式英语</string>
+ <string name="language_canadian_french">加拿大法语 (Français canadien)</string>
+ <string name="language_latin_american_spanish">拉丁美洲西班牙语 (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">简体中文 (简体中文)</string>
+ <string name="language_traditional_chinese">繁体中文 (正體中文)</string>
+ <string name="language_brazilian_portuguese">巴西葡萄牙语 (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">无</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">正常</string>
+ <string name="renderer_accuracy_high">高</string>
+ <string name="renderer_accuracy_extreme">极高 (慢速)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (慢速)</string>
+ <string name="resolution_three">3X (2160p/3240p) (慢速)</string>
+ <string name="resolution_four">4X (2880p/4320p) (慢速)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">即时 (关闭)</string>
+ <string name="renderer_vsync_mailbox">Mailbox</string>
+ <string name="renderer_vsync_fifo">FIFO (开启)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">近邻取样</string>
+ <string name="scaling_filter_bilinear">双线性过滤</string>
+ <string name="scaling_filter_bicubic">双三线过滤</string>
+ <string name="scaling_filter_gaussian">高斯模糊</string>
+ <string name="scaling_filter_scale_force">强制缩放</string>
+ <string name="scaling_filter_fsr">AMD FidelityFX™️ 超级分辨率锐画技术</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">无</string>
+ <string name="anti_aliasing_fxaa">快速近似抗锯齿</string>
+ <string name="anti_aliasing_smaa">子像素形态学抗锯齿</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">默认 (16:9)</string>
+ <string name="ratio_force_four_three">强制 4:3</string>
+ <string name="ratio_force_twenty_one_nine">强制 21:9</string>
+ <string name="ratio_force_sixteen_ten">强制 16:10</string>
+ <string name="ratio_stretch">拉伸窗口</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">自动</string>
+ <string name="cpu_accuracy_accurate">高精度</string>
+ <string name="cpu_accuracy_unsafe">低精度</string>
+ <string name="cpu_accuracy_paranoid">偏执模式 (慢速)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">十字方向键</string>
+ <string name="gamepad_left_stick">左摇杆</string>
+ <string name="gamepad_right_stick">右摇杆</string>
+ <string name="gamepad_home">Home</string>
+ <string name="gamepad_screenshot">截图</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">正在准备着色器</string>
+ <string name="building_shaders">正在编译着色器</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">切换主题</string>
+ <string name="theme_default">系统默认</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">主题模式</string>
+ <string name="theme_mode_follow_system">跟随系统</string>
+ <string name="theme_mode_light">浅色</string>
+ <string name="theme_mode_dark">深色</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">使用黑色背景</string>
+ <string name="use_black_backgrounds_description">使用深色主题时,套用黑色背景。</string>
+
+</resources>
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
new file mode 100644
index 000000000..85798cc6a
--- /dev/null
+++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_disclaimer">此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。&lt;br /&gt;&lt;br /&gt;在您開始前,請找到放置於您的裝置儲存空間的 <![CDATA[<b> prod.keys </b>]]> 檔案。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">深入瞭解</a>]]></string>
+ <string name="emulation_notification_channel_name">模擬進行中</string>
+ <string name="emulation_notification_channel_description">在模擬執行時顯示持續通知。</string>
+ <string name="emulation_notification_running">yuzu 正在執行</string>
+ <string name="notice_notification_channel_name">通知和錯誤</string>
+ <string name="notice_notification_channel_description">發生錯誤時顯示通知。</string>
+ <string name="notification_permission_not_granted">未授予通知權限!</string>
+
+ <!-- Setup strings -->
+ <string name="welcome">歡迎!</string>
+ <string name="welcome_description">瞭解如何設定 &lt;b>yuzu&lt;/b> 並進入模擬。</string>
+ <string name="get_started">開始使用</string>
+ <string name="keys">金鑰</string>
+ <string name="keys_description">使用下方的按鈕選取您的 &lt;b>prod.keys&lt;/b> 檔案。</string>
+ <string name="select_keys">選取金鑰</string>
+ <string name="games">遊戲</string>
+ <string name="games_description">使用下方的按鈕選取您的&lt;b>遊戲&lt;/b>資料夾。</string>
+ <string name="done">完成</string>
+ <string name="done_description">您已準備就緒。\n盡情遊玩您的遊戲!</string>
+ <string name="text_continue">繼續</string>
+ <string name="next">下一步</string>
+ <string name="back">上一步</string>
+ <string name="add_games">新增遊戲</string>
+ <string name="add_games_description">選取您的遊戲資料夾</string>
+
+ <!-- Home strings -->
+ <string name="home_games">遊戲</string>
+ <string name="home_search">搜尋</string>
+ <string name="home_settings">設定</string>
+ <string name="empty_gamelist">找不到檔案,或者尚未選取遊戲目錄。</string>
+ <string name="search_and_filter_games">搜尋並篩選遊戲</string>
+ <string name="select_games_folder">選取遊戲資料夾</string>
+ <string name="select_games_folder_description">一律允許 yuzu 填入遊戲清單</string>
+ <string name="add_games_warning">跳過選取遊戲資料夾?</string>
+ <string name="add_games_warning_description">如果資料夾未選取,遊戲將不會顯示在遊戲清單。</string>
+ <string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
+ <string name="home_search_games">搜尋遊戲</string>
+ <string name="games_dir_selected">遊戲目錄已選取</string>
+ <string name="install_prod_keys">安裝 prod.keys</string>
+ <string name="install_prod_keys_description">需要解密零售遊戲</string>
+ <string name="install_prod_keys_warning">跳過新增金鑰?</string>
+ <string name="install_prod_keys_warning_description">模擬零售遊戲需要有效的金鑰,若要繼續,將僅有自製遊戲應用程式可以運作。</string>
+ <string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
+ <string name="notifications">通知</string>
+ <string name="notifications_description">使用下方的按鈕授予通知權限。</string>
+ <string name="give_permission">授予權限</string>
+ <string name="notification_warning">跳過授予通知權限?</string>
+ <string name="notification_warning_description">yuzu 將無法通知您重要資訊。</string>
+ <string name="permission_denied">權限遭拒</string>
+ <string name="permission_denied_description">您曾多次拒絕了權限要求,現在您需要在系統設定中手動授予權限。</string>
+ <string name="about">關於</string>
+ <string name="about_description">組建版本、製作群、以及更多</string>
+ <string name="warning_help">說明</string>
+ <string name="warning_skip">跳過</string>
+ <string name="warning_cancel">取消</string>
+ <string name="install_amiibo_keys">安裝 Amiibo 金鑰</string>
+ <string name="install_amiibo_keys_description">需要在遊戲中使用 Amiibo</string>
+ <string name="invalid_keys_file">無效的金鑰檔案已選取</string>
+ <string name="install_keys_success">金鑰已成功安裝</string>
+ <string name="reading_keys_failure">讀取加密金鑰時出現錯誤</string>
+ <string name="install_keys_failure_extension_description">
+ 1. 驗證您的金鑰是否具有 .keys 副檔名。\n\n
+ 2. 金鑰不能儲存於 Downloads 資料夾。\n\n
+ 解決問題並再試一次。
+ </string>
+ <string name="invalid_keys_error">無效的加密金鑰</string>
+ <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
+ <string name="install_keys_failure_description">選取的檔案不正確或已損毀,請重新傾印您的金鑰。</string>
+ <string name="install_gpu_driver">安裝 GPU 驅動程式</string>
+ <string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
+ <string name="advanced_settings">進階設定</string>
+ <string name="settings_description">進行模擬器設定</string>
+ <string name="search_recently_played">最近遊玩</string>
+ <string name="search_recently_added">最近新增</string>
+ <string name="search_retail">零售</string>
+ <string name="search_homebrew">自製遊戲</string>
+ <string name="open_user_folder">開啟 yuzu 資料夾</string>
+ <string name="open_user_folder_description">管理 yuzu 的內部檔案</string>
+ <string name="theme_and_color_description">修改應用程式外觀</string>
+ <string name="no_file_manager">找不到檔案管理員</string>
+ <string name="notification_no_directory_link">無法開啟 yuzu 目錄</string>
+ <string name="notification_no_directory_link_description">請使用檔案管理員的側邊面板手動定位到使用者資料夾。</string>
+ <string name="manage_save_data">管理儲存資料</string>
+ <string name="manage_save_data_description">已找到儲存資料,請選取下方的選項。</string>
+ <string name="import_export_saves_description">匯入或匯出儲存檔案</string>
+ <string name="import_export_saves_no_profile">找不到儲存資料,請啟動遊戲並重試。</string>
+ <string name="save_file_imported_success">已成功匯入</string>
+ <string name="save_file_invalid_zip_structure">無效的儲存目錄結構</string>
+ <string name="save_file_invalid_zip_structure_description">首個子資料夾名稱必須為遊戲標題 ID。</string>
+ <string name="import_saves">匯入</string>
+ <string name="export_saves">匯出</string>
+
+ <!-- About screen strings -->
+ <string name="gaia_is_not_real">Gaia 不真實</string>
+ <string name="copied_to_clipboard">已複製到剪貼簿</string>
+ <string name="about_app_description">一個開放原始碼的 Switch 模擬器</string>
+ <string name="contributors">參與者</string>
+ <string name="contributors_description">使用來自 yuzu 團隊的 \u2764 製作</string>
+ <string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
+ <string name="build">組建</string>
+ <string name="support_link">https://discord.gg/u77vRWY</string>
+ <string name="website_link">https://yuzu-emu.org/</string>
+ <string name="github_link">https://github.com/yuzu-emu</string>
+
+ <!-- Early access upgrade strings -->
+ <string name="early_access">搶先體驗</string>
+ <string name="get_early_access">搶先體驗新功能</string>
+ <string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
+ <string name="get_early_access_description">最新的功能、搶先版更新、以及更多</string>
+ <string name="early_access_benefits">搶先體驗權益</string>
+ <string name="cutting_edge_features">最新功能</string>
+ <string name="early_access_updates">搶先版更新</string>
+ <string name="no_manual_installation">無需手動安裝</string>
+ <string name="prioritized_support">優先支援</string>
+ <string name="helping_game_preservation">協助遊戲保留</string>
+ <string name="our_eternal_gratitude">我們永遠的感激</string>
+ <string name="are_you_interested">您仍感興趣嗎?</string>
+
+ <!-- General settings strings -->
+ <string name="frame_limit_enable">啟用限制速度</string>
+ <string name="frame_limit_enable_description">若啟用,模擬速度將會限制在標準速度的指定百分比。</string>
+ <string name="frame_limit_slider">限制速度百分比</string>
+ <string name="frame_limit_slider_description">指定限制模擬速度的百分比。預設為 100%,模擬速度將被限制為標準速度。更高或更低的值將會增加或減少速度限制。</string>
+ <string name="cpu_accuracy">CPU 準確度</string>
+
+ <!-- System settings strings -->
+ <string name="use_docked_mode">底座模式</string>
+ <string name="use_docked_mode_description">以底座模式模擬,以犧牲效能的代價提高解析度。</string>
+ <string name="emulated_region">模擬區域</string>
+ <string name="emulated_language">模擬語言</string>
+ <string name="select_rtc_date">選取 RTC 日期</string>
+ <string name="select_rtc_time">選取 RTC 時間</string>
+ <string name="use_custom_rtc">啟用自訂 RTC</string>
+ <string name="use_custom_rtc_description">此設定允許您設定與您的目前系統時間相互獨立的自訂即時時鐘</string>
+ <string name="set_custom_rtc">設定自訂 RTC</string>
+
+ <!-- Graphics settings strings -->
+ <string name="renderer_api">API</string>
+ <string name="renderer_accuracy">準確度層級</string>
+ <string name="renderer_resolution">解析度</string>
+ <string name="renderer_vsync">VSync 模式</string>
+ <string name="renderer_aspect_ratio">長寬比</string>
+ <string name="renderer_scaling_filter">視窗適應過濾器</string>
+ <string name="renderer_anti_aliasing">消除鋸齒方法</string>
+ <string name="renderer_force_max_clock">強制最大時脈 (僅 Adreno)</string>
+ <string name="renderer_force_max_clock_description">強制 GPU 以最大可能時脈執行 (熱溫限制仍被套用)。</string>
+ <string name="renderer_asynchronous_shaders">使用非同步著色器</string>
+ <string name="renderer_asynchronous_shaders_description">非同步編譯著色器,將會減少間斷,但可能會引入故障。</string>
+ <string name="renderer_debug">啟用圖形偵錯</string>
+ <string name="renderer_debug_description">核取時,圖形 API 將會進入慢速偵錯模式。</string>
+ <string name="use_disk_shader_cache">使用磁碟著色器快取</string>
+ <string name="use_disk_shader_cache_description">透過將產生的著色器儲存並載入至磁碟,減少中斷。</string>
+
+ <!-- Audio settings strings -->
+ <string name="audio_volume">音量</string>
+ <string name="audio_volume_description">指定音訊輸出音量。</string>
+
+ <!-- Miscellaneous -->
+ <string name="slider_default">預設</string>
+ <string name="ini_saved">已儲存設定</string>
+ <string name="gameid_saved">已儲存 %1$s 設定</string>
+ <string name="error_saving">儲存 %1$s 時發生錯誤 ini: %2$s</string>
+ <string name="loading">正在載入…</string>
+ <string name="reset_setting_confirmation">要將此設定重設回預設值嗎?</string>
+ <string name="reset_to_default">重設為預設值</string>
+ <string name="reset_all_settings">重設所有設定?</string>
+ <string name="reset_all_settings_description">所有進階設定將被重設為預設組態,此動作無法復原。</string>
+ <string name="settings_reset">設定已重設</string>
+ <string name="close">關閉</string>
+ <string name="learn_more">深入瞭解</string>
+
+ <!-- GPU driver installation -->
+ <string name="select_gpu_driver">選取 GPU 驅動程式</string>
+ <string name="select_gpu_driver_title">要取代您目前的 GPU 驅動程式嗎?</string>
+ <string name="select_gpu_driver_install">安裝</string>
+ <string name="select_gpu_driver_default">預設</string>
+ <string name="select_gpu_driver_install_success">已安裝 %s</string>
+ <string name="select_gpu_driver_use_default">使用預設 GPU 驅動程式</string>
+ <string name="select_gpu_driver_error">選取的驅動程式無效,將使用系統預設驅動程式!</string>
+ <string name="system_gpu_driver">系統 GPU 驅動程式</string>
+ <string name="installing_driver">正在安裝驅動程式…</string>
+
+ <!-- Preferences Screen -->
+ <string name="preferences_advanced_settings">進階設定</string>
+ <string name="preferences_settings">設定</string>
+ <string name="preferences_general">一般</string>
+ <string name="preferences_system">系統</string>
+ <string name="preferences_graphics">圖形</string>
+ <string name="preferences_audio">音訊</string>
+ <string name="preferences_theme">主題和色彩</string>
+
+ <!-- ROM loading errors -->
+ <string name="loader_error_encrypted">您的 ROM 已加密</string>
+ <string name="loader_error_encrypted_roms_description"><![CDATA[請依循指南重新傾印您的<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games\">遊戲卡匣</a>或<a href=\"https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop\">安裝標題</a>。]]></string>
+ <string name="loader_error_encrypted_keys_description"><![CDATA[請確保您的 <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 檔案已安裝,讓遊戲可以解密。]]></string>
+ <string name="loader_error_video_core">初始化視訊核心時發生錯誤</string>
+ <string name="loader_error_video_core_description">這經常由不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。</string>
+ <string name="loader_error_invalid_format">無法載入 ROM</string>
+ <string name="loader_error_file_not_found">ROM 檔案不存在</string>
+
+ <!-- Emulation Menu -->
+ <string name="emulation_exit">結束模擬</string>
+ <string name="emulation_done">完成</string>
+ <string name="emulation_fps_counter">FPS 計數器</string>
+ <string name="emulation_toggle_controls">切換控制</string>
+ <string name="emulation_rel_stick_center">相對搖桿中心</string>
+ <string name="emulation_dpad_slide">方向鍵滑動</string>
+ <string name="emulation_haptics">觸覺回饋技術</string>
+ <string name="emulation_show_overlay">顯示覆疊</string>
+ <string name="emulation_toggle_all">全部切換</string>
+ <string name="emulation_control_adjust">調整覆疊</string>
+ <string name="emulation_control_scale">縮放</string>
+ <string name="emulation_control_opacity">不透明度</string>
+ <string name="emulation_touch_overlay_reset">重設覆疊</string>
+ <string name="emulation_touch_overlay_edit">編輯覆疊</string>
+ <string name="emulation_pause">暫停模擬</string>
+ <string name="emulation_unpause">取消暫停模擬</string>
+ <string name="emulation_input_overlay">覆疊選項</string>
+ <string name="emulation_game_loading">遊戲正在載入…</string>
+
+ <string name="load_settings">正在載入設定…</string>
+
+ <!-- Software keyboard -->
+ <string name="software_keyboard">軟體鍵盤</string>
+
+ <!-- Errors and warnings -->
+ <string name="abort_button">中止</string>
+ <string name="continue_button">繼續</string>
+ <string name="system_archive_not_found">找不到系統檔案</string>
+ <string name="system_archive_not_found_message">%s 遺失,請傾印您的系統封存。\n繼續模擬可能會造成當機和錯誤。</string>
+ <string name="system_archive_general">系統封存</string>
+ <string name="save_load_error">儲存/載入發生錯誤</string>
+ <string name="fatal_error">嚴重錯誤</string>
+ <string name="fatal_error_message">發生嚴重錯誤,檢查記錄以取得詳細資訊。\n繼續模擬可能會造成當機和錯誤。</string>
+ <string name="performance_warning">關閉此設定會顯著降低模擬效能!如需最佳體驗,建議您將此設定保持為啟用狀態。</string>
+
+ <!-- Region Names -->
+ <string name="region_auto">自動選取</string>
+ <string name="region_japan">日本</string>
+ <string name="region_usa">美國</string>
+ <string name="region_europe">歐洲</string>
+ <string name="region_australia">澳洲</string>
+ <string name="region_china">中國</string>
+ <string name="region_korea">南韓</string>
+ <string name="region_taiwan">台灣</string>
+
+ <!-- Language Names -->
+ <string name="language_japanese">日文 (日本語)</string>
+ <string name="language_english">英文</string>
+ <string name="language_french">法文 (Français)</string>
+ <string name="langauge_german">德文 (Deutsch)</string>
+ <string name="language_italian">義大利文 (Italiano)</string>
+ <string name="language_spanish">西班牙文 (Español)</string>
+ <string name="language_chinese">中文 (简体中文)</string>
+ <string name="language_korean">韓文 (한국어)</string>
+ <string name="language_dutch">荷蘭文 (Nederlands)</string>
+ <string name="language_portuguese">葡萄牙文 (Português)</string>
+ <string name="language_russian">俄文 (Русский)</string>
+ <string name="language_taiwanese">台文 (台灣)</string>
+ <string name="language_british_english">英式英文</string>
+ <string name="language_canadian_french">加拿大法文 (Français canadien)</string>
+ <string name="language_latin_american_spanish">拉丁美洲西班牙文 (Español latinoamericano)</string>
+ <string name="language_simplified_chinese">簡體中文 (简体中文)</string>
+ <string name="language_traditional_chinese">正體中文 (正體中文)</string>
+ <string name="language_brazilian_portuguese">巴西葡萄牙文 (Português do Brasil)</string>
+
+ <!-- Renderer APIs -->
+ <string name="renderer_vulkan">Vulkan</string>
+ <string name="renderer_none">無</string>
+
+ <!-- Renderer Accuracy -->
+ <string name="renderer_accuracy_normal">標準</string>
+ <string name="renderer_accuracy_high">高</string>
+ <string name="renderer_accuracy_extreme">極高 (慢)</string>
+
+ <!-- Resolutions -->
+ <string name="resolution_half">0.5X (360p/540p)</string>
+ <string name="resolution_three_quarter">0.75X (540p/810p)</string>
+ <string name="resolution_one">1X (720p/1080p)</string>
+ <string name="resolution_two">2X (1440p/2160p) (慢)</string>
+ <string name="resolution_three">3X (2160p/3240p) (慢)</string>
+ <string name="resolution_four">4X (2880p/4320p) (慢)</string>
+
+ <!-- Renderer VSync -->
+ <string name="renderer_vsync_immediate">即時 (關閉)</string>
+ <string name="renderer_vsync_mailbox">信箱</string>
+ <string name="renderer_vsync_fifo">FIFO (開啟)</string>
+ <string name="renderer_vsync_fifo_relaxed">FIFO 寬鬆</string>
+
+ <!-- Scaling Filters -->
+ <string name="scaling_filter_nearest_neighbor">最近鄰</string>
+ <string name="scaling_filter_bilinear">雙線性</string>
+ <string name="scaling_filter_bicubic">雙立方</string>
+ <string name="scaling_filter_gaussian">高斯</string>
+ <string name="scaling_filter_scale_force">強制縮放</string>
+ <string name="scaling_filter_fsr">AMD Radeon™ 超級解析度</string>
+
+ <!-- Anti-Aliasing -->
+ <string name="anti_aliasing_none">無</string>
+ <string name="anti_aliasing_fxaa">FXAA</string>
+ <string name="anti_aliasing_smaa">SMAA</string>
+
+ <!-- Aspect Ratios -->
+ <string name="ratio_default">預設 (16:9)</string>
+ <string name="ratio_force_four_three">強制 4:3</string>
+ <string name="ratio_force_twenty_one_nine">強制 21:9</string>
+ <string name="ratio_force_sixteen_ten">強制 16:10</string>
+ <string name="ratio_stretch">延伸視窗</string>
+
+ <!-- CPU Accuracy -->
+ <string name="cpu_accuracy_auto">自動</string>
+ <string name="cpu_accuracy_accurate">高精度</string>
+ <string name="cpu_accuracy_unsafe">低精度</string>
+ <string name="cpu_accuracy_paranoid">不合理 (慢)</string>
+
+ <!-- Gamepad Buttons -->
+ <string name="gamepad_d_pad">方向鍵</string>
+ <string name="gamepad_left_stick">左搖桿</string>
+ <string name="gamepad_right_stick">右搖桿</string>
+ <string name="gamepad_home">HOME</string>
+ <string name="gamepad_screenshot">螢幕截圖</string>
+
+ <!-- Disk shader cache -->
+ <string name="preparing_shaders">正在準備著色器</string>
+ <string name="building_shaders">正在建置著色器</string>
+
+ <!-- Theme options -->
+ <string name="change_app_theme">變更應用程式主題</string>
+ <string name="theme_default">預設</string>
+ <string name="theme_material_you">Material You</string>
+
+ <!-- Theme Modes -->
+ <string name="change_theme_mode">變更主題模式</string>
+ <string name="theme_mode_follow_system">跟隨系統</string>
+ <string name="theme_mode_light">淺色</string>
+ <string name="theme_mode_dark">深色</string>
+
+ <!-- Black backgrounds theme -->
+ <string name="use_black_backgrounds">使用黑色背景</string>
+ <string name="use_black_backgrounds_description">使用深色主題時,套用黑色背景。</string>
+
+</resources>
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 0ae69afb4..7dae63dcb 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -65,11 +65,8 @@
<string name="invalid_keys_file">Invalid keys file selected</string>
<string name="install_keys_success">Keys successfully installed</string>
<string name="reading_keys_failure">Error reading encryption keys</string>
- <string name="install_keys_failure_extension_description">
- 1. Verify your keys have the .keys extension.\n\n
- 2. Keys must not be stored in the Downloads folder.\n\n
- Resolve the issue(s) and try again.
- </string>
+ <string name="install_prod_keys_failure_extension_description">Verify your keys file has a .keys extension and try again.</string>
+ <string name="install_amiibo_keys_failure_extension_description">Verify your keys file has a .bin extension and try again.</string>
<string name="invalid_keys_error">Invalid encryption keys</string>
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
<string name="install_keys_failure_description">The selected file is incorrect or corrupt. Please redump your keys.</string>
@@ -105,6 +102,15 @@
<string name="share_log">Share debug logs</string>
<string name="share_log_description">Share yuzu\'s log file to debug issues</string>
<string name="share_log_missing">No log file found</string>
+ <string name="install_game_content">Install game content</string>
+ <string name="install_game_content_description">Install game updates or DLC</string>
+ <string name="install_game_content_failure">Error installing file to NAND</string>
+ <string name="install_game_content_failure_description">Game content installation failed. Please ensure content is valid and that the prod.keys file is installed.</string>
+ <string name="install_game_content_failure_base">Installation of base games isn\'t permitted in order to avoid possible conflicts. Please select an update or DLC instead.</string>
+ <string name="install_game_content_failure_file_extension">The selected file type is not supported. Only NSP and XCI content is supported for this action. Please verify the game content is valid.</string>
+ <string name="install_game_content_success">Game content installed successfully</string>
+ <string name="install_game_content_success_overwrite">Game content was overwritten successfully</string>
+ <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
<!-- About screen strings -->
<string name="gaia_is_not_real">Gaia isn\'t real</string>
diff --git a/src/audio_core/audio_core.cpp b/src/audio_core/audio_core.cpp
index 07a679c32..703ef4494 100644
--- a/src/audio_core/audio_core.cpp
+++ b/src/audio_core/audio_core.cpp
@@ -47,12 +47,4 @@ AudioRenderer::ADSP::ADSP& AudioCore::GetADSP() {
return *adsp;
}
-void AudioCore::SetNVDECActive(bool active) {
- nvdec_active = active;
-}
-
-bool AudioCore::IsNVDECActive() const {
- return nvdec_active;
-}
-
} // namespace AudioCore
diff --git a/src/audio_core/audio_core.h b/src/audio_core/audio_core.h
index e33e00a3e..ea047773e 100644
--- a/src/audio_core/audio_core.h
+++ b/src/audio_core/audio_core.h
@@ -57,18 +57,6 @@ public:
*/
AudioRenderer::ADSP::ADSP& GetADSP();
- /**
- * Toggle NVDEC state, used to avoid stall in playback.
- *
- * @param active - Set true if nvdec is active, otherwise false.
- */
- void SetNVDECActive(bool active);
-
- /**
- * Get NVDEC state.
- */
- bool IsNVDECActive() const;
-
private:
/**
* Create the sinks on startup.
@@ -83,8 +71,6 @@ private:
std::unique_ptr<Sink::Sink> input_sink;
/// The ADSP in the sysmodule
std::unique_ptr<AudioRenderer::ADSP::ADSP> adsp;
- /// Is NVDec currently active?
- bool nvdec_active{false};
};
} // namespace AudioCore
diff --git a/src/common/fs/fs_paths.h b/src/common/fs/fs_paths.h
index c77c112f1..61bac9eba 100644
--- a/src/common/fs/fs_paths.h
+++ b/src/common/fs/fs_paths.h
@@ -10,6 +10,7 @@
// Sub-directories contained within a yuzu data directory
+#define AMIIBO_DIR "amiibo"
#define CACHE_DIR "cache"
#define CONFIG_DIR "config"
#define DUMP_DIR "dump"
diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp
index e026a13d9..d71cfacc6 100644
--- a/src/common/fs/path_util.cpp
+++ b/src/common/fs/path_util.cpp
@@ -114,6 +114,7 @@ public:
#endif
GenerateYuzuPath(YuzuPath::YuzuDir, yuzu_path);
+ GenerateYuzuPath(YuzuPath::AmiiboDir, yuzu_path / AMIIBO_DIR);
GenerateYuzuPath(YuzuPath::CacheDir, yuzu_path_cache);
GenerateYuzuPath(YuzuPath::ConfigDir, yuzu_path_config);
GenerateYuzuPath(YuzuPath::DumpDir, yuzu_path / DUMP_DIR);
diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h
index 7cfe85b70..ba28964d0 100644
--- a/src/common/fs/path_util.h
+++ b/src/common/fs/path_util.h
@@ -12,6 +12,7 @@ namespace Common::FS {
enum class YuzuPath {
YuzuDir, // Where yuzu stores its data.
+ AmiiboDir, // Where Amiibo backups are stored.
CacheDir, // Where cached filesystem data is stored.
ConfigDir, // Where config files are stored.
DumpDir, // Where dumped data is stored.
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index ff53e80bb..9ff3edabb 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -235,6 +235,7 @@ void RestoreGlobalState(bool is_powered_on) {
values.bg_green.SetGlobal(true);
values.bg_blue.SetGlobal(true);
values.enable_compute_pipelines.SetGlobal(true);
+ values.use_video_framerate.SetGlobal(true);
// System
values.language_index.SetGlobal(true);
diff --git a/src/common/settings.h b/src/common/settings.h
index 7f865b2a7..9682281b0 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -482,6 +482,7 @@ struct Values {
SwitchableSetting<AstcRecompression, true> astc_recompression{
AstcRecompression::Uncompressed, AstcRecompression::Uncompressed, AstcRecompression::Bc3,
"astc_recompression"};
+ SwitchableSetting<bool> use_video_framerate{false, "use_video_framerate"};
SwitchableSetting<u8> bg_red{0, "bg_red"};
SwitchableSetting<u8> bg_green{0, "bg_green"};
diff --git a/src/common/uuid.cpp b/src/common/uuid.cpp
index 89e1ed225..035df7fe0 100644
--- a/src/common/uuid.cpp
+++ b/src/common/uuid.cpp
@@ -48,7 +48,7 @@ std::array<u8, 0x10> ConstructFromRawString(std::string_view raw_string) {
}
std::array<u8, 0x10> ConstructFromFormattedString(std::string_view formatted_string) {
- std::array<u8, 0x10> uuid;
+ std::array<u8, 0x10> uuid{};
size_t i = 0;
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 4406ae30e..7ba704f18 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -216,6 +216,14 @@ struct System::Impl {
}
}
+ void SetNVDECActive(bool is_nvdec_active) {
+ nvdec_active = is_nvdec_active;
+ }
+
+ bool GetNVDECActive() {
+ return nvdec_active;
+ }
+
void InitializeDebugger(System& system, u16 port) {
debugger = std::make_unique<Debugger>(system, port);
}
@@ -485,6 +493,8 @@ struct System::Impl {
std::atomic_bool is_powered_on{};
bool exit_lock = false;
+ bool nvdec_active{};
+
Reporter reporter;
std::unique_ptr<Memory::CheatEngine> cheat_engine;
std::unique_ptr<Tools::Freezer> memory_freezer;
@@ -594,6 +604,14 @@ void System::UnstallApplication() {
impl->UnstallApplication();
}
+void System::SetNVDECActive(bool is_nvdec_active) {
+ impl->SetNVDECActive(is_nvdec_active);
+}
+
+bool System::GetNVDECActive() {
+ return impl->GetNVDECActive();
+}
+
void System::InitializeDebugger() {
impl->InitializeDebugger(*this, Settings::values.gdbstub_port.GetValue());
}
diff --git a/src/core/core.h b/src/core/core.h
index 4f153154f..ff2e4bd30 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -189,6 +189,9 @@ public:
std::unique_lock<std::mutex> StallApplication();
void UnstallApplication();
+ void SetNVDECActive(bool is_nvdec_active);
+ [[nodiscard]] bool GetNVDECActive();
+
/**
* Initialize the debugger.
*/
diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h
index 3226b884a..27f97c725 100644
--- a/src/core/file_sys/submission_package.h
+++ b/src/core/file_sys/submission_package.h
@@ -8,6 +8,7 @@
#include <set>
#include <vector>
#include "common/common_types.h"
+#include "core/file_sys/nca_metadata.h"
#include "core/file_sys/vfs.h"
namespace Core::Crypto {
diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp
index 0bd7900e1..b14f682b5 100644
--- a/src/core/hle/service/nfc/common/device.cpp
+++ b/src/core/hle/service/nfc/common/device.cpp
@@ -12,6 +12,11 @@
#pragma warning(pop)
#endif
+#include <fmt/format.h>
+
+#include "common/fs/file.h"
+#include "common/fs/fs.h"
+#include "common/fs/path_util.h"
#include "common/input.h"
#include "common/logging/log.h"
#include "common/string_util.h"
@@ -136,7 +141,7 @@ bool NfcDevice::LoadNfcTag(std::span<const u8> data) {
if (!NFP::AmiiboCrypto::IsKeyAvailable()) {
LOG_INFO(Service_NFC, "Loading amiibo without keys");
memcpy(&encrypted_tag_data, data.data(), sizeof(NFP::EncryptedNTAG215File));
- BuildAmiiboWithoutKeys();
+ BuildAmiiboWithoutKeys(tag_data, encrypted_tag_data);
is_plain_amiibo = true;
is_write_protected = true;
return true;
@@ -366,16 +371,25 @@ Result NfcDevice::Mount(NFP::ModelType model_type, NFP::MountTarget mount_target
// The loaded amiibo is not encrypted
if (is_plain_amiibo) {
+ std::vector<u8> data(sizeof(NFP::NTAG215File));
+ memcpy(data.data(), &tag_data, sizeof(tag_data));
+ WriteBackupData(tag_data.uid, data);
+
device_state = DeviceState::TagMounted;
mount_target = mount_target_;
return ResultSuccess;
}
if (!NFP::AmiiboCrypto::DecodeAmiibo(encrypted_tag_data, tag_data)) {
- LOG_ERROR(Service_NFP, "Can't decode amiibo {}", device_state);
- return ResultCorruptedData;
+ bool has_backup = HasBackup(encrypted_tag_data.uuid.uid).IsSuccess();
+ LOG_ERROR(Service_NFP, "Can't decode amiibo, has_backup= {}", has_backup);
+ return has_backup ? ResultCorruptedDataWithBackup : ResultCorruptedData;
}
+ std::vector<u8> data(sizeof(NFP::EncryptedNTAG215File));
+ memcpy(data.data(), &encrypted_tag_data, sizeof(encrypted_tag_data));
+ WriteBackupData(encrypted_tag_data.uuid.uid, data);
+
device_state = DeviceState::TagMounted;
mount_target = mount_target_;
return ResultSuccess;
@@ -470,6 +484,7 @@ Result NfcDevice::FlushWithBreak(NFP::BreakType break_type) {
std::vector<u8> data(sizeof(NFP::EncryptedNTAG215File));
if (is_plain_amiibo) {
memcpy(data.data(), &tag_data, sizeof(tag_data));
+ WriteBackupData(tag_data.uid, data);
} else {
if (!NFP::AmiiboCrypto::EncodeAmiibo(tag_data, encrypted_tag_data)) {
LOG_ERROR(Service_NFP, "Failed to encode data");
@@ -477,6 +492,7 @@ Result NfcDevice::FlushWithBreak(NFP::BreakType break_type) {
}
memcpy(data.data(), &encrypted_tag_data, sizeof(encrypted_tag_data));
+ WriteBackupData(encrypted_tag_data.uuid.uid, data);
}
if (!npad_device->WriteNfc(data)) {
@@ -488,7 +504,7 @@ Result NfcDevice::FlushWithBreak(NFP::BreakType break_type) {
}
Result NfcDevice::Restore() {
- if (device_state != DeviceState::TagMounted) {
+ if (device_state != DeviceState::TagFound) {
LOG_ERROR(Service_NFP, "Wrong device state {}", device_state);
if (device_state == DeviceState::TagRemoved) {
return ResultTagRemoved;
@@ -496,13 +512,59 @@ Result NfcDevice::Restore() {
return ResultWrongDeviceState;
}
- if (mount_target == NFP::MountTarget::None || mount_target == NFP::MountTarget::Rom) {
- LOG_ERROR(Service_NFC, "Amiibo is read only", device_state);
- return ResultWrongDeviceState;
+ NFC::TagInfo tag_info{};
+ std::array<u8, sizeof(NFP::EncryptedNTAG215File)> data{};
+ Result result = GetTagInfo(tag_info, false);
+
+ if (result.IsError()) {
+ return result;
}
- // TODO: Load amiibo from backup on system
- LOG_ERROR(Service_NFP, "Not Implemented");
+ result = ReadBackupData(tag_info.uuid, data);
+
+ if (result.IsError()) {
+ return result;
+ }
+
+ NFP::NTAG215File temporary_tag_data{};
+ NFP::EncryptedNTAG215File temporary_encrypted_tag_data{};
+
+ // Fallback for encrypted amiibos without keys
+ if (is_write_protected) {
+ return ResultWriteAmiiboFailed;
+ }
+
+ // Fallback for plain amiibos
+ if (is_plain_amiibo) {
+ LOG_INFO(Service_NFP, "Restoring backup of plain amiibo");
+ memcpy(&temporary_tag_data, data.data(), sizeof(NFP::EncryptedNTAG215File));
+ temporary_encrypted_tag_data = NFP::AmiiboCrypto::EncodedDataToNfcData(temporary_tag_data);
+ }
+
+ if (!is_plain_amiibo) {
+ LOG_INFO(Service_NFP, "Restoring backup of encrypted amiibo");
+ temporary_tag_data = {};
+ memcpy(&temporary_encrypted_tag_data, data.data(), sizeof(NFP::EncryptedNTAG215File));
+ }
+
+ if (!NFP::AmiiboCrypto::IsAmiiboValid(temporary_encrypted_tag_data)) {
+ return ResultNotAnAmiibo;
+ }
+
+ if (!is_plain_amiibo) {
+ if (!NFP::AmiiboCrypto::DecodeAmiibo(temporary_encrypted_tag_data, temporary_tag_data)) {
+ LOG_ERROR(Service_NFP, "Can't decode amiibo");
+ return ResultCorruptedData;
+ }
+ }
+
+ // Overwrite tag contents with backup and mount the tag
+ tag_data = temporary_tag_data;
+ encrypted_tag_data = temporary_encrypted_tag_data;
+ device_state = DeviceState::TagMounted;
+ mount_target = NFP::MountTarget::All;
+ is_data_moddified = true;
+
return ResultSuccess;
}
@@ -1132,13 +1194,69 @@ Result NfcDevice::BreakTag(NFP::BreakType break_type) {
return FlushWithBreak(break_type);
}
-Result NfcDevice::ReadBackupData(std::span<u8> data) const {
- // Not implemented
+Result NfcDevice::HasBackup(const NFC::UniqueSerialNumber& uid) const {
+ constexpr auto backup_dir = "backup";
+ const auto yuzu_amiibo_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::AmiiboDir);
+ const auto file_name = fmt::format("{0:02x}.bin", fmt::join(uid, ""));
+
+ if (!Common::FS::Exists(yuzu_amiibo_dir / backup_dir / file_name)) {
+ return ResultUnableToAccessBackupFile;
+ }
+
return ResultSuccess;
}
-Result NfcDevice::WriteBackupData(std::span<const u8> data) {
- // Not implemented
+Result NfcDevice::ReadBackupData(const NFC::UniqueSerialNumber& uid, std::span<u8> data) const {
+ constexpr auto backup_dir = "backup";
+ const auto yuzu_amiibo_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::AmiiboDir);
+ const auto file_name = fmt::format("{0:02x}.bin", fmt::join(uid, ""));
+
+ const Common::FS::IOFile keys_file{yuzu_amiibo_dir / backup_dir / file_name,
+ Common::FS::FileAccessMode::Read,
+ Common::FS::FileType::BinaryFile};
+
+ if (!keys_file.IsOpen()) {
+ LOG_ERROR(Service_NFP, "Failed to open amiibo backup");
+ return ResultUnableToAccessBackupFile;
+ }
+
+ if (keys_file.Read(data) != data.size()) {
+ LOG_ERROR(Service_NFP, "Failed to read amiibo backup");
+ return ResultUnableToAccessBackupFile;
+ }
+
+ return ResultSuccess;
+}
+
+Result NfcDevice::WriteBackupData(const NFC::UniqueSerialNumber& uid, std::span<const u8> data) {
+ constexpr auto backup_dir = "backup";
+ const auto yuzu_amiibo_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::AmiiboDir);
+ const auto file_name = fmt::format("{0:02x}.bin", fmt::join(uid, ""));
+
+ if (HasBackup(uid).IsError()) {
+ if (!Common::FS::CreateDir(yuzu_amiibo_dir / backup_dir)) {
+ return ResultBackupPathAlreadyExist;
+ }
+
+ if (!Common::FS::NewFile(yuzu_amiibo_dir / backup_dir / file_name)) {
+ return ResultBackupPathAlreadyExist;
+ }
+ }
+
+ const Common::FS::IOFile keys_file{yuzu_amiibo_dir / backup_dir / file_name,
+ Common::FS::FileAccessMode::ReadWrite,
+ Common::FS::FileType::BinaryFile};
+
+ if (!keys_file.IsOpen()) {
+ LOG_ERROR(Service_NFP, "Failed to open amiibo backup");
+ return ResultUnableToAccessBackupFile;
+ }
+
+ if (keys_file.Write(data) != data.size()) {
+ LOG_ERROR(Service_NFP, "Failed to write amiibo backup");
+ return ResultUnableToAccessBackupFile;
+ }
+
return ResultSuccess;
}
@@ -1177,7 +1295,8 @@ NFP::AmiiboName NfcDevice::GetAmiiboName(const NFP::AmiiboSettings& settings) co
return amiibo_name;
}
-void NfcDevice::SetAmiiboName(NFP::AmiiboSettings& settings, const NFP::AmiiboName& amiibo_name) {
+void NfcDevice::SetAmiiboName(NFP::AmiiboSettings& settings,
+ const NFP::AmiiboName& amiibo_name) const {
std::array<char16_t, NFP::amiibo_name_length> settings_amiibo_name{};
// Convert from utf8 to utf16
@@ -1258,22 +1377,23 @@ void NfcDevice::UpdateRegisterInfoCrc() {
tag_data.register_info_crc = crc.checksum();
}
-void NfcDevice::BuildAmiiboWithoutKeys() {
+void NfcDevice::BuildAmiiboWithoutKeys(NFP::NTAG215File& stubbed_tag_data,
+ const NFP::EncryptedNTAG215File& encrypted_file) const {
Service::Mii::MiiManager manager;
- auto& settings = tag_data.settings;
+ auto& settings = stubbed_tag_data.settings;
- tag_data = NFP::AmiiboCrypto::NfcDataToEncodedData(encrypted_tag_data);
+ stubbed_tag_data = NFP::AmiiboCrypto::NfcDataToEncodedData(encrypted_file);
// Common info
- tag_data.write_counter = 0;
- tag_data.amiibo_version = 0;
+ stubbed_tag_data.write_counter = 0;
+ stubbed_tag_data.amiibo_version = 0;
settings.write_date = GetAmiiboDate(GetCurrentPosixTime());
// Register info
SetAmiiboName(settings, {'y', 'u', 'z', 'u', 'A', 'm', 'i', 'i', 'b', 'o'});
settings.settings.font_region.Assign(0);
settings.init_date = GetAmiiboDate(GetCurrentPosixTime());
- tag_data.owner_mii = manager.BuildFromStoreData(manager.BuildDefault(0));
+ stubbed_tag_data.owner_mii = manager.BuildFromStoreData(manager.BuildDefault(0));
// Admin info
settings.settings.amiibo_initialized.Assign(1);
diff --git a/src/core/hle/service/nfc/common/device.h b/src/core/hle/service/nfc/common/device.h
index 6a37e8458..6f049b687 100644
--- a/src/core/hle/service/nfc/common/device.h
+++ b/src/core/hle/service/nfc/common/device.h
@@ -86,8 +86,9 @@ public:
Result GetAll(NFP::NfpData& data) const;
Result SetAll(const NFP::NfpData& data);
Result BreakTag(NFP::BreakType break_type);
- Result ReadBackupData(std::span<u8> data) const;
- Result WriteBackupData(std::span<const u8> data);
+ Result HasBackup(const NFC::UniqueSerialNumber& uid) const;
+ Result ReadBackupData(const NFC::UniqueSerialNumber& uid, std::span<u8> data) const;
+ Result WriteBackupData(const NFC::UniqueSerialNumber& uid, std::span<const u8> data);
Result WriteNtf(std::span<const u8> data);
u64 GetHandle() const;
@@ -103,14 +104,15 @@ private:
void CloseNfcTag();
NFP::AmiiboName GetAmiiboName(const NFP::AmiiboSettings& settings) const;
- void SetAmiiboName(NFP::AmiiboSettings& settings, const NFP::AmiiboName& amiibo_name);
+ void SetAmiiboName(NFP::AmiiboSettings& settings, const NFP::AmiiboName& amiibo_name) const;
NFP::AmiiboDate GetAmiiboDate(s64 posix_time) const;
u64 GetCurrentPosixTime() const;
u64 RemoveVersionByte(u64 application_id) const;
void UpdateSettingsCrc();
void UpdateRegisterInfoCrc();
- void BuildAmiiboWithoutKeys();
+ void BuildAmiiboWithoutKeys(NFP::NTAG215File& stubbed_tag_data,
+ const NFP::EncryptedNTAG215File& encrypted_file) const;
bool is_controller_set{};
int callback_key;
diff --git a/src/core/hle/service/nfc/common/device_manager.cpp b/src/core/hle/service/nfc/common/device_manager.cpp
index d5deaaf27..cffd602df 100644
--- a/src/core/hle/service/nfc/common/device_manager.cpp
+++ b/src/core/hle/service/nfc/common/device_manager.cpp
@@ -543,9 +543,14 @@ Result DeviceManager::ReadBackupData(u64 device_handle, std::span<u8> data) cons
std::shared_ptr<NfcDevice> device = nullptr;
auto result = GetDeviceHandle(device_handle, device);
+ NFC::TagInfo tag_info{};
if (result.IsSuccess()) {
- result = device->ReadBackupData(data);
+ result = device->GetTagInfo(tag_info, false);
+ }
+
+ if (result.IsSuccess()) {
+ result = device->ReadBackupData(tag_info.uuid, data);
result = VerifyDeviceResult(device, result);
}
@@ -557,9 +562,14 @@ Result DeviceManager::WriteBackupData(u64 device_handle, std::span<const u8> dat
std::shared_ptr<NfcDevice> device = nullptr;
auto result = GetDeviceHandle(device_handle, device);
+ NFC::TagInfo tag_info{};
+
+ if (result.IsSuccess()) {
+ result = device->GetTagInfo(tag_info, false);
+ }
if (result.IsSuccess()) {
- result = device->WriteBackupData(data);
+ result = device->WriteBackupData(tag_info.uuid, data);
result = VerifyDeviceResult(device, result);
}
diff --git a/src/core/hle/service/nfc/nfc_interface.cpp b/src/core/hle/service/nfc/nfc_interface.cpp
index 0fa29d398..198d0f2b9 100644
--- a/src/core/hle/service/nfc/nfc_interface.cpp
+++ b/src/core/hle/service/nfc/nfc_interface.cpp
@@ -302,7 +302,7 @@ Result NfcInterface::TranslateResultToServiceError(Result result) const {
return TranslateResultToNfp(result);
}
default:
- if (result != ResultUnknown216) {
+ if (result != ResultBackupPathAlreadyExist) {
return result;
}
return ResultUnknown74;
@@ -343,6 +343,9 @@ Result NfcInterface::TranslateResultToNfp(Result result) const {
if (result == ResultApplicationAreaIsNotInitialized) {
return NFP::ResultApplicationAreaIsNotInitialized;
}
+ if (result == ResultCorruptedDataWithBackup) {
+ return NFP::ResultCorruptedDataWithBackup;
+ }
if (result == ResultCorruptedData) {
return NFP::ResultCorruptedData;
}
@@ -355,6 +358,9 @@ Result NfcInterface::TranslateResultToNfp(Result result) const {
if (result == ResultNotAnAmiibo) {
return NFP::ResultNotAnAmiibo;
}
+ if (result == ResultUnableToAccessBackupFile) {
+ return NFP::ResultUnableToAccessBackupFile;
+ }
LOG_WARNING(Service_NFC, "Result conversion not handled");
return result;
}
diff --git a/src/core/hle/service/nfc/nfc_result.h b/src/core/hle/service/nfc/nfc_result.h
index 917d79ef8..59a808740 100644
--- a/src/core/hle/service/nfc/nfc_result.h
+++ b/src/core/hle/service/nfc/nfc_result.h
@@ -9,20 +9,22 @@ namespace Service::NFC {
constexpr Result ResultDeviceNotFound(ErrorModule::NFC, 64);
constexpr Result ResultInvalidArgument(ErrorModule::NFC, 65);
-constexpr Result ResultWrongApplicationAreaSize(ErrorModule::NFP, 68);
+constexpr Result ResultWrongApplicationAreaSize(ErrorModule::NFC, 68);
constexpr Result ResultWrongDeviceState(ErrorModule::NFC, 73);
constexpr Result ResultUnknown74(ErrorModule::NFC, 74);
constexpr Result ResultUnknown76(ErrorModule::NFC, 76);
constexpr Result ResultNfcNotInitialized(ErrorModule::NFC, 77);
constexpr Result ResultNfcDisabled(ErrorModule::NFC, 80);
-constexpr Result ResultWriteAmiiboFailed(ErrorModule::NFP, 88);
+constexpr Result ResultWriteAmiiboFailed(ErrorModule::NFC, 88);
constexpr Result ResultTagRemoved(ErrorModule::NFC, 97);
-constexpr Result ResultRegistrationIsNotInitialized(ErrorModule::NFP, 120);
-constexpr Result ResultApplicationAreaIsNotInitialized(ErrorModule::NFP, 128);
-constexpr Result ResultCorruptedData(ErrorModule::NFP, 144);
-constexpr Result ResultWrongApplicationAreaId(ErrorModule::NFP, 152);
-constexpr Result ResultApplicationAreaExist(ErrorModule::NFP, 168);
-constexpr Result ResultNotAnAmiibo(ErrorModule::NFP, 178);
-constexpr Result ResultUnknown216(ErrorModule::NFC, 216);
+constexpr Result ResultUnableToAccessBackupFile(ErrorModule::NFC, 113);
+constexpr Result ResultRegistrationIsNotInitialized(ErrorModule::NFC, 120);
+constexpr Result ResultApplicationAreaIsNotInitialized(ErrorModule::NFC, 128);
+constexpr Result ResultCorruptedDataWithBackup(ErrorModule::NFC, 136);
+constexpr Result ResultCorruptedData(ErrorModule::NFC, 144);
+constexpr Result ResultWrongApplicationAreaId(ErrorModule::NFC, 152);
+constexpr Result ResultApplicationAreaExist(ErrorModule::NFC, 168);
+constexpr Result ResultNotAnAmiibo(ErrorModule::NFC, 178);
+constexpr Result ResultBackupPathAlreadyExist(ErrorModule::NFC, 216);
} // namespace Service::NFC
diff --git a/src/core/hle/service/nfp/nfp_interface.cpp b/src/core/hle/service/nfp/nfp_interface.cpp
index 21d159154..34ef9d82d 100644
--- a/src/core/hle/service/nfp/nfp_interface.cpp
+++ b/src/core/hle/service/nfp/nfp_interface.cpp
@@ -126,7 +126,7 @@ void Interface::Flush(HLERequestContext& ctx) {
void Interface::Restore(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto device_handle{rp.Pop<u64>()};
- LOG_WARNING(Service_NFP, "(STUBBED) called, device_handle={}", device_handle);
+ LOG_INFO(Service_NFP, "called, device_handle={}", device_handle);
auto result = GetManager()->Restore(device_handle);
result = TranslateResultToServiceError(result);
@@ -394,7 +394,7 @@ void Interface::BreakTag(HLERequestContext& ctx) {
void Interface::ReadBackupData(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto device_handle{rp.Pop<u64>()};
- LOG_WARNING(Service_NFP, "(STUBBED) called, device_handle={}", device_handle);
+ LOG_INFO(Service_NFP, "called, device_handle={}", device_handle);
std::vector<u8> backup_data{};
auto result = GetManager()->ReadBackupData(device_handle, backup_data);
@@ -412,7 +412,7 @@ void Interface::WriteBackupData(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto device_handle{rp.Pop<u64>()};
const auto backup_data_buffer{ctx.ReadBuffer()};
- LOG_WARNING(Service_NFP, "(STUBBED) called, device_handle={}", device_handle);
+ LOG_INFO(Service_NFP, "called, device_handle={}", device_handle);
auto result = GetManager()->WriteBackupData(device_handle, backup_data_buffer);
result = TranslateResultToServiceError(result);
diff --git a/src/core/hle/service/nfp/nfp_result.h b/src/core/hle/service/nfp/nfp_result.h
index 4c126cd81..618533843 100644
--- a/src/core/hle/service/nfp/nfp_result.h
+++ b/src/core/hle/service/nfp/nfp_result.h
@@ -17,9 +17,11 @@ constexpr Result ResultWriteAmiiboFailed(ErrorModule::NFP, 88);
constexpr Result ResultTagRemoved(ErrorModule::NFP, 97);
constexpr Result ResultRegistrationIsNotInitialized(ErrorModule::NFP, 120);
constexpr Result ResultApplicationAreaIsNotInitialized(ErrorModule::NFP, 128);
+constexpr Result ResultCorruptedDataWithBackup(ErrorModule::NFP, 136);
constexpr Result ResultCorruptedData(ErrorModule::NFP, 144);
constexpr Result ResultWrongApplicationAreaId(ErrorModule::NFP, 152);
constexpr Result ResultApplicationAreaExist(ErrorModule::NFP, 168);
constexpr Result ResultNotAnAmiibo(ErrorModule::NFP, 178);
+constexpr Result ResultUnableToAccessBackupFile(ErrorModule::NFP, 200);
} // namespace Service::NFP
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
index 0c7aee1b8..dc45169ad 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
@@ -69,7 +69,7 @@ NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> in
void nvhost_nvdec::OnOpen(DeviceFD fd) {
LOG_INFO(Service_NVDRV, "NVDEC video stream started");
- system.AudioCore().SetNVDECActive(true);
+ system.SetNVDECActive(true);
}
void nvhost_nvdec::OnClose(DeviceFD fd) {
@@ -79,7 +79,7 @@ void nvhost_nvdec::OnClose(DeviceFD fd) {
if (iter != host1x_file.fd_to_id.end()) {
system.GPU().ClearCdmaInstance(iter->second);
}
- system.AudioCore().SetNVDECActive(false);
+ system.SetNVDECActive(false);
}
} // namespace Service::Nvidia::Devices
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp
index 4988e6e17..da2d5890f 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.cpp
+++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp
@@ -324,6 +324,10 @@ s64 Nvnflinger::GetNextTicks() const {
speed_scale = 0.01f;
}
}
+ if (system.GetNVDECActive() && settings.use_video_framerate.GetValue()) {
+ // Run at intended presentation rate during video playback.
+ speed_scale = 1.f;
+ }
// As an extension, treat nonpositive swap interval as framerate multiplier.
const f32 effective_fps = swap_interval <= 0 ? 120.f * static_cast<f32>(1 - swap_interval)
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 73d04d7ee..7be6cf5f3 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -33,7 +33,8 @@ static_assert(sizeof(NroSegmentHeader) == 0x8, "NroSegmentHeader has incorrect s
struct NroHeader {
INSERT_PADDING_BYTES(0x4);
u32_le module_header_offset;
- INSERT_PADDING_BYTES(0x8);
+ u32 magic_ext1;
+ u32 magic_ext2;
u32_le magic;
INSERT_PADDING_BYTES(0x4);
u32_le file_size;
@@ -124,6 +125,16 @@ FileType AppLoader_NRO::IdentifyType(const FileSys::VirtualFile& nro_file) {
return FileType::Error;
}
+bool AppLoader_NRO::IsHomebrew() {
+ // Read NSO header
+ NroHeader nro_header{};
+ if (sizeof(NroHeader) != file->ReadObject(&nro_header)) {
+ return false;
+ }
+ return nro_header.magic_ext1 == Common::MakeMagic('H', 'O', 'M', 'E') &&
+ nro_header.magic_ext2 == Common::MakeMagic('B', 'R', 'E', 'W');
+}
+
static constexpr u32 PageAlignSize(u32 size) {
return static_cast<u32>((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK);
}
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h
index ccb77b581..8de6eebc6 100644
--- a/src/core/loader/nro.h
+++ b/src/core/loader/nro.h
@@ -38,6 +38,8 @@ public:
*/
static FileType IdentifyType(const FileSys::VirtualFile& nro_file);
+ bool IsHomebrew();
+
FileType GetFileType() const override {
return IdentifyType(file);
}
diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt
index 525b2363c..07e75f9d8 100644
--- a/src/shader_recompiler/CMakeLists.txt
+++ b/src/shader_recompiler/CMakeLists.txt
@@ -216,6 +216,7 @@ add_library(shader_recompiler STATIC
frontend/maxwell/translate_program.h
host_translate_info.h
ir_opt/collect_shader_info_pass.cpp
+ ir_opt/conditional_barrier_pass.cpp
ir_opt/constant_propagation_pass.cpp
ir_opt/dead_code_elimination_pass.cpp
ir_opt/dual_vertex_pass.cpp
@@ -223,6 +224,7 @@ add_library(shader_recompiler STATIC
ir_opt/identity_removal_pass.cpp
ir_opt/layer_pass.cpp
ir_opt/lower_fp16_to_fp32.cpp
+ ir_opt/lower_fp64_to_fp32.cpp
ir_opt/lower_int64_to_int32.cpp
ir_opt/passes.h
ir_opt/position_pass.cpp
diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp
index 17a6d4888..928b35561 100644
--- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp
@@ -280,12 +280,18 @@ IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Blo
RemoveUnreachableBlocks(program);
// Replace instructions before the SSA rewrite
+ if (!host_info.support_float64) {
+ Optimization::LowerFp64ToFp32(program);
+ }
if (!host_info.support_float16) {
Optimization::LowerFp16ToFp32(program);
}
if (!host_info.support_int64) {
Optimization::LowerInt64ToInt32(program);
}
+ if (!host_info.support_conditional_barrier) {
+ Optimization::ConditionalBarrierPass(program);
+ }
Optimization::SsaRewritePass(program);
Optimization::ConstantPropagationPass(env, program);
diff --git a/src/shader_recompiler/host_translate_info.h b/src/shader_recompiler/host_translate_info.h
index 2aaa6c5ea..7d2ded907 100644
--- a/src/shader_recompiler/host_translate_info.h
+++ b/src/shader_recompiler/host_translate_info.h
@@ -10,6 +10,7 @@ namespace Shader {
/// Misc information about the host
struct HostTranslateInfo {
+ bool support_float64{}; ///< True when the device supports 64-bit floats
bool support_float16{}; ///< True when the device supports 16-bit floats
bool support_int64{}; ///< True when the device supports 64-bit integers
bool needs_demote_reorder{}; ///< True when the device needs DemoteToHelperInvocation reordered
@@ -17,6 +18,8 @@ struct HostTranslateInfo {
bool support_viewport_index_layer{}; ///< True when the device supports gl_Layer in VS
bool support_geometry_shader_passthrough{}; ///< True when the device supports geometry
///< passthrough shaders
+ bool support_conditional_barrier{}; ///< True when the device supports barriers in conditional
+ ///< control flow
};
} // namespace Shader
diff --git a/src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp b/src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp
new file mode 100644
index 000000000..c3ed27f4f
--- /dev/null
+++ b/src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "shader_recompiler/frontend/ir/program.h"
+#include "shader_recompiler/ir_opt/passes.h"
+
+namespace Shader::Optimization {
+
+void ConditionalBarrierPass(IR::Program& program) {
+ s32 conditional_control_flow_count{0};
+ s32 conditional_return_count{0};
+ for (IR::AbstractSyntaxNode& node : program.syntax_list) {
+ switch (node.type) {
+ case IR::AbstractSyntaxNode::Type::If:
+ case IR::AbstractSyntaxNode::Type::Loop:
+ conditional_control_flow_count++;
+ break;
+ case IR::AbstractSyntaxNode::Type::EndIf:
+ case IR::AbstractSyntaxNode::Type::Repeat:
+ conditional_control_flow_count--;
+ break;
+ case IR::AbstractSyntaxNode::Type::Unreachable:
+ case IR::AbstractSyntaxNode::Type::Return:
+ if (conditional_control_flow_count > 0) {
+ conditional_return_count++;
+ }
+ break;
+ case IR::AbstractSyntaxNode::Type::Block:
+ for (IR::Inst& inst : node.data.block->Instructions()) {
+ if ((conditional_control_flow_count > 0 || conditional_return_count > 0) &&
+ inst.GetOpcode() == IR::Opcode::Barrier) {
+ LOG_WARNING(Shader, "Barrier within conditional control flow");
+ inst.ReplaceOpcode(IR::Opcode::Identity);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ ASSERT(conditional_control_flow_count == 0);
+}
+
+} // namespace Shader::Optimization
diff --git a/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp b/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp
new file mode 100644
index 000000000..5db7a38ad
--- /dev/null
+++ b/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp
@@ -0,0 +1,185 @@
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "shader_recompiler/frontend/ir/ir_emitter.h"
+#include "shader_recompiler/frontend/ir/opcodes.h"
+#include "shader_recompiler/frontend/ir/value.h"
+#include "shader_recompiler/ir_opt/passes.h"
+
+namespace Shader::Optimization {
+namespace {
+
+constexpr s32 F64ToF32Exp = +1023 - 127;
+constexpr s32 F32ToF64Exp = +127 - 1023;
+
+IR::F32 PackedF64ToF32(IR::IREmitter& ir, const IR::Value& packed) {
+ const IR::U32 lo{ir.CompositeExtract(packed, 0)};
+ const IR::U32 hi{ir.CompositeExtract(packed, 1)};
+ const IR::U32 sign{ir.BitFieldExtract(hi, ir.Imm32(31), ir.Imm32(1))};
+ const IR::U32 exp{ir.BitFieldExtract(hi, ir.Imm32(20), ir.Imm32(11))};
+ const IR::U32 mantissa_hi{ir.BitFieldExtract(hi, ir.Imm32(0), ir.Imm32(20))};
+ const IR::U32 mantissa_lo{ir.BitFieldExtract(lo, ir.Imm32(29), ir.Imm32(3))};
+ const IR::U32 mantissa{
+ ir.BitwiseOr(ir.ShiftLeftLogical(mantissa_hi, ir.Imm32(3)), mantissa_lo)};
+ const IR::U32 exp_if_subnorm{
+ ir.Select(ir.IEqual(exp, ir.Imm32(0)), ir.Imm32(0), ir.IAdd(exp, ir.Imm32(F64ToF32Exp)))};
+ const IR::U32 exp_if_infnan{
+ ir.Select(ir.IEqual(exp, ir.Imm32(0x7ff)), ir.Imm32(0xff), exp_if_subnorm)};
+ const IR::U32 result{
+ ir.BitwiseOr(ir.ShiftLeftLogical(sign, ir.Imm32(31)),
+ ir.BitwiseOr(ir.ShiftLeftLogical(exp_if_infnan, ir.Imm32(23)), mantissa))};
+ return ir.BitCast<IR::F32>(result);
+}
+
+IR::Value F32ToPackedF64(IR::IREmitter& ir, const IR::Value& raw) {
+ const IR::U32 value{ir.BitCast<IR::U32>(IR::F32(raw))};
+ const IR::U32 sign{ir.BitFieldExtract(value, ir.Imm32(31), ir.Imm32(1))};
+ const IR::U32 exp{ir.BitFieldExtract(value, ir.Imm32(23), ir.Imm32(8))};
+ const IR::U32 mantissa{ir.BitFieldExtract(value, ir.Imm32(0), ir.Imm32(23))};
+ const IR::U32 mantissa_hi{ir.BitFieldExtract(mantissa, ir.Imm32(3), ir.Imm32(20))};
+ const IR::U32 mantissa_lo{ir.BitFieldExtract(mantissa, ir.Imm32(0), ir.Imm32(3))};
+ const IR::U32 exp_if_subnorm{
+ ir.Select(ir.IEqual(exp, ir.Imm32(0)), ir.Imm32(0), ir.IAdd(exp, ir.Imm32(F32ToF64Exp)))};
+ const IR::U32 exp_if_infnan{
+ ir.Select(ir.IEqual(exp, ir.Imm32(0xff)), ir.Imm32(0x7ff), exp_if_subnorm)};
+ const IR::U32 lo{ir.ShiftLeftLogical(mantissa_lo, ir.Imm32(29))};
+ const IR::U32 hi{
+ ir.BitwiseOr(ir.ShiftLeftLogical(sign, ir.Imm32(31)),
+ ir.BitwiseOr(ir.ShiftLeftLogical(exp_if_infnan, ir.Imm32(20)), mantissa_hi))};
+ return ir.CompositeConstruct(lo, hi);
+}
+
+IR::Opcode Replace(IR::Opcode op) {
+ switch (op) {
+ case IR::Opcode::FPAbs64:
+ return IR::Opcode::FPAbs32;
+ case IR::Opcode::FPAdd64:
+ return IR::Opcode::FPAdd32;
+ case IR::Opcode::FPCeil64:
+ return IR::Opcode::FPCeil32;
+ case IR::Opcode::FPFloor64:
+ return IR::Opcode::FPFloor32;
+ case IR::Opcode::FPFma64:
+ return IR::Opcode::FPFma32;
+ case IR::Opcode::FPMul64:
+ return IR::Opcode::FPMul32;
+ case IR::Opcode::FPNeg64:
+ return IR::Opcode::FPNeg32;
+ case IR::Opcode::FPRoundEven64:
+ return IR::Opcode::FPRoundEven32;
+ case IR::Opcode::FPSaturate64:
+ return IR::Opcode::FPSaturate32;
+ case IR::Opcode::FPClamp64:
+ return IR::Opcode::FPClamp32;
+ case IR::Opcode::FPTrunc64:
+ return IR::Opcode::FPTrunc32;
+ case IR::Opcode::CompositeConstructF64x2:
+ return IR::Opcode::CompositeConstructF32x2;
+ case IR::Opcode::CompositeConstructF64x3:
+ return IR::Opcode::CompositeConstructF32x3;
+ case IR::Opcode::CompositeConstructF64x4:
+ return IR::Opcode::CompositeConstructF32x4;
+ case IR::Opcode::CompositeExtractF64x2:
+ return IR::Opcode::CompositeExtractF32x2;
+ case IR::Opcode::CompositeExtractF64x3:
+ return IR::Opcode::CompositeExtractF32x3;
+ case IR::Opcode::CompositeExtractF64x4:
+ return IR::Opcode::CompositeExtractF32x4;
+ case IR::Opcode::CompositeInsertF64x2:
+ return IR::Opcode::CompositeInsertF32x2;
+ case IR::Opcode::CompositeInsertF64x3:
+ return IR::Opcode::CompositeInsertF32x3;
+ case IR::Opcode::CompositeInsertF64x4:
+ return IR::Opcode::CompositeInsertF32x4;
+ case IR::Opcode::FPOrdEqual64:
+ return IR::Opcode::FPOrdEqual32;
+ case IR::Opcode::FPUnordEqual64:
+ return IR::Opcode::FPUnordEqual32;
+ case IR::Opcode::FPOrdNotEqual64:
+ return IR::Opcode::FPOrdNotEqual32;
+ case IR::Opcode::FPUnordNotEqual64:
+ return IR::Opcode::FPUnordNotEqual32;
+ case IR::Opcode::FPOrdLessThan64:
+ return IR::Opcode::FPOrdLessThan32;
+ case IR::Opcode::FPUnordLessThan64:
+ return IR::Opcode::FPUnordLessThan32;
+ case IR::Opcode::FPOrdGreaterThan64:
+ return IR::Opcode::FPOrdGreaterThan32;
+ case IR::Opcode::FPUnordGreaterThan64:
+ return IR::Opcode::FPUnordGreaterThan32;
+ case IR::Opcode::FPOrdLessThanEqual64:
+ return IR::Opcode::FPOrdLessThanEqual32;
+ case IR::Opcode::FPUnordLessThanEqual64:
+ return IR::Opcode::FPUnordLessThanEqual32;
+ case IR::Opcode::FPOrdGreaterThanEqual64:
+ return IR::Opcode::FPOrdGreaterThanEqual32;
+ case IR::Opcode::FPUnordGreaterThanEqual64:
+ return IR::Opcode::FPUnordGreaterThanEqual32;
+ case IR::Opcode::FPIsNan64:
+ return IR::Opcode::FPIsNan32;
+ case IR::Opcode::ConvertS16F64:
+ return IR::Opcode::ConvertS16F32;
+ case IR::Opcode::ConvertS32F64:
+ return IR::Opcode::ConvertS32F32;
+ case IR::Opcode::ConvertS64F64:
+ return IR::Opcode::ConvertS64F32;
+ case IR::Opcode::ConvertU16F64:
+ return IR::Opcode::ConvertU16F32;
+ case IR::Opcode::ConvertU32F64:
+ return IR::Opcode::ConvertU32F32;
+ case IR::Opcode::ConvertU64F64:
+ return IR::Opcode::ConvertU64F32;
+ case IR::Opcode::ConvertF32F64:
+ return IR::Opcode::Identity;
+ case IR::Opcode::ConvertF64F32:
+ return IR::Opcode::Identity;
+ case IR::Opcode::ConvertF64S8:
+ return IR::Opcode::ConvertF32S8;
+ case IR::Opcode::ConvertF64S16:
+ return IR::Opcode::ConvertF32S16;
+ case IR::Opcode::ConvertF64S32:
+ return IR::Opcode::ConvertF32S32;
+ case IR::Opcode::ConvertF64S64:
+ return IR::Opcode::ConvertF32S64;
+ case IR::Opcode::ConvertF64U8:
+ return IR::Opcode::ConvertF32U8;
+ case IR::Opcode::ConvertF64U16:
+ return IR::Opcode::ConvertF32U16;
+ case IR::Opcode::ConvertF64U32:
+ return IR::Opcode::ConvertF32U32;
+ case IR::Opcode::ConvertF64U64:
+ return IR::Opcode::ConvertF32U64;
+ default:
+ return op;
+ }
+}
+
+void Lower(IR::Block& block, IR::Inst& inst) {
+ switch (inst.GetOpcode()) {
+ case IR::Opcode::PackDouble2x32: {
+ IR::IREmitter ir(block, IR::Block::InstructionList::s_iterator_to(inst));
+ inst.ReplaceUsesWith(PackedF64ToF32(ir, inst.Arg(0)));
+ break;
+ }
+ case IR::Opcode::UnpackDouble2x32: {
+ IR::IREmitter ir(block, IR::Block::InstructionList::s_iterator_to(inst));
+ inst.ReplaceUsesWith(F32ToPackedF64(ir, inst.Arg(0)));
+ break;
+ }
+ default:
+ inst.ReplaceOpcode(Replace(inst.GetOpcode()));
+ break;
+ }
+}
+
+} // Anonymous namespace
+
+void LowerFp64ToFp32(IR::Program& program) {
+ for (IR::Block* const block : program.blocks) {
+ for (IR::Inst& inst : block->Instructions()) {
+ Lower(*block, inst);
+ }
+ }
+}
+
+} // namespace Shader::Optimization
diff --git a/src/shader_recompiler/ir_opt/passes.h b/src/shader_recompiler/ir_opt/passes.h
index 1f8f2ba95..629d18fa1 100644
--- a/src/shader_recompiler/ir_opt/passes.h
+++ b/src/shader_recompiler/ir_opt/passes.h
@@ -13,10 +13,12 @@ struct HostTranslateInfo;
namespace Shader::Optimization {
void CollectShaderInfoPass(Environment& env, IR::Program& program);
+void ConditionalBarrierPass(IR::Program& program);
void ConstantPropagationPass(Environment& env, IR::Program& program);
void DeadCodeEliminationPass(IR::Program& program);
void GlobalMemoryToStorageBufferPass(IR::Program& program);
void IdentityRemovalPass(IR::Program& program);
+void LowerFp64ToFp32(IR::Program& program);
void LowerFp16ToFp32(IR::Program& program);
void LowerInt64ToInt32(IR::Program& program);
void RescalingPass(IR::Program& program);
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 2f281b370..251a4a880 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -715,20 +715,38 @@ void BufferCache<P>::BindHostIndexBuffer() {
template <class P>
void BufferCache<P>::BindHostVertexBuffers() {
+ HostBindings host_bindings;
+ bool any_valid{false};
auto& flags = maxwell3d->dirty.flags;
for (u32 index = 0; index < NUM_VERTEX_BUFFERS; ++index) {
- const Binding& binding = channel_state->vertex_buffers[index];
- Buffer& buffer = slot_buffers[binding.buffer_id];
- TouchBuffer(buffer, binding.buffer_id);
- SynchronizeBuffer(buffer, binding.cpu_addr, binding.size);
if (!flags[Dirty::VertexBuffer0 + index]) {
continue;
}
- flags[Dirty::VertexBuffer0 + index] = false;
+ host_bindings.min_index = std::min(host_bindings.min_index, index);
+ host_bindings.max_index = std::max(host_bindings.max_index, index);
+ any_valid = true;
+ }
- const u32 stride = maxwell3d->regs.vertex_streams[index].stride;
- const u32 offset = buffer.Offset(binding.cpu_addr);
- runtime.BindVertexBuffer(index, buffer, offset, binding.size, stride);
+ if (any_valid) {
+ host_bindings.max_index++;
+ for (u32 index = host_bindings.min_index; index < host_bindings.max_index; index++) {
+ flags[Dirty::VertexBuffer0 + index] = false;
+
+ const Binding& binding = channel_state->vertex_buffers[index];
+ Buffer& buffer = slot_buffers[binding.buffer_id];
+
+ TouchBuffer(buffer, binding.buffer_id);
+ SynchronizeBuffer(buffer, binding.cpu_addr, binding.size);
+
+ const u32 stride = maxwell3d->regs.vertex_streams[index].stride;
+ const u32 offset = buffer.Offset(binding.cpu_addr);
+
+ host_bindings.buffers.push_back(reinterpret_cast<void*>(&buffer));
+ host_bindings.offsets.push_back(offset);
+ host_bindings.sizes.push_back(binding.size);
+ host_bindings.strides.push_back(stride);
+ }
+ runtime.BindVertexBuffers(host_bindings);
}
}
@@ -882,15 +900,25 @@ void BufferCache<P>::BindHostTransformFeedbackBuffers() {
if (maxwell3d->regs.transform_feedback_enabled == 0) {
return;
}
+ HostBindings host_bindings;
for (u32 index = 0; index < NUM_TRANSFORM_FEEDBACK_BUFFERS; ++index) {
const Binding& binding = channel_state->transform_feedback_buffers[index];
+ if (maxwell3d->regs.transform_feedback.controls[index].varying_count == 0 &&
+ maxwell3d->regs.transform_feedback.controls[index].stride == 0) {
+ break;
+ }
Buffer& buffer = slot_buffers[binding.buffer_id];
TouchBuffer(buffer, binding.buffer_id);
const u32 size = binding.size;
SynchronizeBuffer(buffer, binding.cpu_addr, size);
const u32 offset = buffer.Offset(binding.cpu_addr);
- runtime.BindTransformFeedbackBuffer(index, buffer, offset, size);
+ host_bindings.buffers.push_back(reinterpret_cast<void*>(&buffer));
+ host_bindings.offsets.push_back(offset);
+ host_bindings.sizes.push_back(binding.size);
+ }
+ if (host_bindings.buffers.size() > 0) {
+ runtime.BindTransformFeedbackBuffers(host_bindings);
}
}
@@ -1616,6 +1644,8 @@ void BufferCache<P>::DownloadBufferMemory(Buffer& buffer, VAddr cpu_addr, u64 si
template <class P>
void BufferCache<P>::DeleteBuffer(BufferId buffer_id, bool do_not_mark) {
+ bool dirty_index{false};
+ boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> dirty_vertex_buffers;
const auto scalar_replace = [buffer_id](Binding& binding) {
if (binding.buffer_id == buffer_id) {
binding.buffer_id = BufferId{};
@@ -1624,8 +1654,19 @@ void BufferCache<P>::DeleteBuffer(BufferId buffer_id, bool do_not_mark) {
const auto replace = [scalar_replace](std::span<Binding> bindings) {
std::ranges::for_each(bindings, scalar_replace);
};
- scalar_replace(channel_state->index_buffer);
- replace(channel_state->vertex_buffers);
+
+ if (channel_state->index_buffer.buffer_id == buffer_id) {
+ channel_state->index_buffer.buffer_id = BufferId{};
+ dirty_index = true;
+ }
+
+ for (u32 index = 0; index < channel_state->vertex_buffers.size(); index++) {
+ auto& binding = channel_state->vertex_buffers[index];
+ if (binding.buffer_id == buffer_id) {
+ binding.buffer_id = BufferId{};
+ dirty_vertex_buffers.push_back(index);
+ }
+ }
std::ranges::for_each(channel_state->uniform_buffers, replace);
std::ranges::for_each(channel_state->storage_buffers, replace);
replace(channel_state->transform_feedback_buffers);
@@ -1642,20 +1683,21 @@ void BufferCache<P>::DeleteBuffer(BufferId buffer_id, bool do_not_mark) {
delayed_destruction_ring.Push(std::move(slot_buffers[buffer_id]));
slot_buffers.erase(buffer_id);
- NotifyBufferDeletion();
-}
-
-template <class P>
-void BufferCache<P>::NotifyBufferDeletion() {
if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) {
channel_state->dirty_uniform_buffers.fill(~u32{0});
channel_state->uniform_buffer_binding_sizes.fill({});
}
+
auto& flags = maxwell3d->dirty.flags;
- flags[Dirty::IndexBuffer] = true;
- flags[Dirty::VertexBuffers] = true;
- for (u32 index = 0; index < NUM_VERTEX_BUFFERS; ++index) {
- flags[Dirty::VertexBuffer0 + index] = true;
+ if (dirty_index) {
+ flags[Dirty::IndexBuffer] = true;
+ }
+
+ if (dirty_vertex_buffers.size() > 0) {
+ flags[Dirty::VertexBuffers] = true;
+ for (auto index : dirty_vertex_buffers) {
+ flags[Dirty::VertexBuffer0 + index] = true;
+ }
}
channel_state->has_deleted_buffers = true;
}
diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h
index 60a1f285e..cf359e241 100644
--- a/src/video_core/buffer_cache/buffer_cache_base.h
+++ b/src/video_core/buffer_cache/buffer_cache_base.h
@@ -105,6 +105,15 @@ static constexpr Binding NULL_BINDING{
.buffer_id = NULL_BUFFER_ID,
};
+struct HostBindings {
+ boost::container::small_vector<void*, NUM_VERTEX_BUFFERS> buffers;
+ boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> offsets;
+ boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> sizes;
+ boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> strides;
+ u32 min_index{NUM_VERTEX_BUFFERS};
+ u32 max_index{0};
+};
+
class BufferCacheChannelInfo : public ChannelInfo {
public:
BufferCacheChannelInfo() = delete;
@@ -519,8 +528,6 @@ private:
void DeleteBuffer(BufferId buffer_id, bool do_not_mark = false);
- void NotifyBufferDeletion();
-
[[nodiscard]] Binding StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index,
bool is_written) const;
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
index c419714d4..0cc546a3a 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
@@ -232,6 +232,15 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, Buffer& buffer, u32 offset,
}
}
+void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bindings) {
+ for (u32 index = 0; index < bindings.buffers.size(); index++) {
+ BindVertexBuffer(
+ bindings.min_index + index, *reinterpret_cast<Buffer*>(bindings.buffers[index]),
+ static_cast<u32>(bindings.offsets[index]), static_cast<u32>(bindings.sizes[index]),
+ static_cast<u32>(bindings.strides[index]));
+ }
+}
+
void BufferCacheRuntime::BindUniformBuffer(size_t stage, u32 binding_index, Buffer& buffer,
u32 offset, u32 size) {
if (use_assembly_shaders) {
@@ -320,6 +329,15 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, Buffer& buffer,
static_cast<GLintptr>(offset), static_cast<GLsizeiptr>(size));
}
+void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings) {
+ for (u32 index = 0; index < bindings.buffers.size(); index++) {
+ glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, index,
+ reinterpret_cast<Buffer*>(bindings.buffers[index])->Handle(),
+ static_cast<GLintptr>(bindings.offsets[index]),
+ static_cast<GLsizeiptr>(bindings.sizes[index]));
+ }
+}
+
void BufferCacheRuntime::BindTextureBuffer(Buffer& buffer, u32 offset, u32 size,
PixelFormat format) {
*texture_handles++ = buffer.View(offset, size, format);
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h
index a24991585..e4e000284 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.h
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.h
@@ -7,7 +7,7 @@
#include <span>
#include "common/common_types.h"
-#include "video_core/buffer_cache/buffer_cache.h"
+#include "video_core/buffer_cache/buffer_cache_base.h"
#include "video_core/buffer_cache/memory_tracker_base.h"
#include "video_core/rasterizer_interface.h"
#include "video_core/renderer_opengl/gl_device.h"
@@ -87,6 +87,7 @@ public:
void BindIndexBuffer(Buffer& buffer, u32 offset, u32 size);
void BindVertexBuffer(u32 index, Buffer& buffer, u32 offset, u32 size, u32 stride);
+ void BindVertexBuffers(VideoCommon::HostBindings& bindings);
void BindUniformBuffer(size_t stage, u32 binding_index, Buffer& buffer, u32 offset, u32 size);
@@ -99,6 +100,7 @@ public:
bool is_written);
void BindTransformFeedbackBuffer(u32 index, Buffer& buffer, u32 offset, u32 size);
+ void BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings);
void BindTextureBuffer(Buffer& buffer, u32 offset, u32 size,
VideoCore::Surface::PixelFormat format);
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp
index 400c21981..03d234f2f 100644
--- a/src/video_core/renderer_opengl/gl_device.cpp
+++ b/src/video_core/renderer_opengl/gl_device.cpp
@@ -201,6 +201,7 @@ Device::Device(Core::Frontend::EmuWindow& emu_window) {
use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue() &&
!(is_amd || (is_intel && !is_linux)) && !strict_context_required;
use_driver_cache = is_nvidia;
+ supports_conditional_barriers = !is_intel;
LOG_INFO(Render_OpenGL, "Renderer_VariableAOFFI: {}", has_variable_aoffi);
LOG_INFO(Render_OpenGL, "Renderer_ComponentIndexingBug: {}", has_component_indexing_bug);
diff --git a/src/video_core/renderer_opengl/gl_device.h b/src/video_core/renderer_opengl/gl_device.h
index cc0b95f1a..ad27264e5 100644
--- a/src/video_core/renderer_opengl/gl_device.h
+++ b/src/video_core/renderer_opengl/gl_device.h
@@ -188,6 +188,10 @@ public:
return strict_context_required;
}
+ bool SupportsConditionalBarriers() const {
+ return supports_conditional_barriers;
+ }
+
private:
static bool TestVariableAoffi();
static bool TestPreciseBug();
@@ -233,6 +237,7 @@ private:
bool has_bool_ref_bug{};
bool can_report_memory{};
bool strict_context_required{};
+ bool supports_conditional_barriers{};
std::string vendor_name;
};
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 6ecda2984..3f077311e 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -232,12 +232,14 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo
.gl_max_compute_smem_size = device.GetMaxComputeSharedMemorySize(),
},
host_info{
+ .support_float64 = true,
.support_float16 = false,
.support_int64 = device.HasShaderInt64(),
.needs_demote_reorder = device.IsAmd(),
.support_snorm_render_buffer = false,
.support_viewport_index_layer = device.HasVertexViewportLayer(),
.support_geometry_shader_passthrough = device.HasGeometryShaderPassthrough(),
+ .support_conditional_barrier = device.SupportsConditionalBarriers(),
} {
if (use_asynchronous_shaders) {
workers = CreateWorkers();
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
index 7cdde992b..acb143fc7 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
@@ -37,10 +37,6 @@
#include "video_core/vulkan_common/vulkan_memory_allocator.h"
#include "video_core/vulkan_common/vulkan_wrapper.h"
-#ifdef ANDROID
-extern u32 GetAndroidScreenRotation();
-#endif
-
namespace Vulkan {
namespace {
@@ -78,47 +74,6 @@ struct ScreenRectVertex {
}
};
-#ifdef ANDROID
-
-std::array<f32, 4 * 4> MakeOrthographicMatrix(f32 width, f32 height) {
- constexpr u32 ROTATION_0 = 0;
- constexpr u32 ROTATION_90 = 1;
- constexpr u32 ROTATION_180 = 2;
- constexpr u32 ROTATION_270 = 3;
-
- // clang-format off
- switch (GetAndroidScreenRotation()) {
- case ROTATION_0:
- // Desktop
- return { 2.f / width, 0.f, 0.f, 0.f,
- 0.f, 2.f / height, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- -1.f, -1.f, 0.f, 1.f};
- case ROTATION_180:
- // Reverse desktop
- return {-2.f / width, 0.f, 0.f, 0.f,
- 0.f, -2.f / height, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 1.f, 1.f, 0.f, 1.f};
- case ROTATION_270:
- // Reverse landscape
- return { 0.f, -2.f / width, 0.f, 0.f,
- 2.f / height, 0.f, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- -1.f, 1.f, 0.f, 1.f};
- case ROTATION_90:
- default:
- // Landscape
- return { 0.f, 2.f / width, 0.f, 0.f,
- -2.f / height, 0.f, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 1.f, -1.f, 0.f, 1.f};
- }
- // clang-format on
-}
-
-#else
-
std::array<f32, 4 * 4> MakeOrthographicMatrix(f32 width, f32 height) {
// clang-format off
return { 2.f / width, 0.f, 0.f, 0.f,
@@ -128,8 +83,6 @@ std::array<f32, 4 * 4> MakeOrthographicMatrix(f32 width, f32 height) {
// clang-format on
}
-#endif
-
u32 GetBytesPerPixel(const Tegra::FramebufferConfig& framebuffer) {
using namespace VideoCore::Surface;
return BytesPerBlock(PixelFormatFromGPUPixelFormat(framebuffer.pixel_format));
@@ -1159,7 +1112,7 @@ void BlitScreen::CreateRawImages(const Tegra::FramebufferConfig& framebuffer) {
.pNext = nullptr,
.flags = 0,
.imageType = VK_IMAGE_TYPE_2D,
- .format = GetFormat(framebuffer),
+ .format = used_on_framebuffer ? VK_FORMAT_R16G16B16A16_SFLOAT : GetFormat(framebuffer),
.extent =
{
.width = (up_scale * framebuffer.width) >> down_shift,
@@ -1180,14 +1133,14 @@ void BlitScreen::CreateRawImages(const Tegra::FramebufferConfig& framebuffer) {
const auto create_commit = [&](vk::Image& image) {
return memory_allocator.Commit(image, MemoryUsage::DeviceLocal);
};
- const auto create_image_view = [&](vk::Image& image) {
+ const auto create_image_view = [&](vk::Image& image, bool used_on_framebuffer = false) {
return device.GetLogical().CreateImageView(VkImageViewCreateInfo{
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.pNext = nullptr,
.flags = 0,
.image = *image,
.viewType = VK_IMAGE_VIEW_TYPE_2D,
- .format = GetFormat(framebuffer),
+ .format = used_on_framebuffer ? VK_FORMAT_R16G16B16A16_SFLOAT : GetFormat(framebuffer),
.components =
{
.r = VK_COMPONENT_SWIZZLE_IDENTITY,
@@ -1217,7 +1170,7 @@ void BlitScreen::CreateRawImages(const Tegra::FramebufferConfig& framebuffer) {
const u32 down_shift = Settings::values.resolution_info.down_shift;
aa_image = create_image(true, up_scale, down_shift);
aa_commit = create_commit(aa_image);
- aa_image_view = create_image_view(aa_image);
+ aa_image_view = create_image_view(aa_image, true);
VkExtent2D size{
.width = (up_scale * framebuffer.width) >> down_shift,
.height = (up_scale * framebuffer.height) >> down_shift,
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index daa128399..d72d99899 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -7,7 +7,6 @@
#include <span>
#include <vector>
-#include "video_core/buffer_cache/buffer_cache.h"
#include "video_core/renderer_vulkan/maxwell_to_vk.h"
#include "video_core/renderer_vulkan/vk_buffer_cache.h"
#include "video_core/renderer_vulkan/vk_scheduler.h"
@@ -502,6 +501,40 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset
}
}
+void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bindings) {
+ boost::container::small_vector<VkBuffer, 32> buffer_handles;
+ for (u32 index = 0; index < bindings.buffers.size(); index++) {
+ auto& buffer = *reinterpret_cast<Buffer*>(bindings.buffers[index]);
+ auto handle = buffer.Handle();
+ if (handle == VK_NULL_HANDLE) {
+ bindings.offsets[index] = 0;
+ bindings.sizes[index] = VK_WHOLE_SIZE;
+ if (!device.HasNullDescriptor()) {
+ ReserveNullBuffer();
+ handle = *null_buffer;
+ }
+ }
+ buffer_handles.push_back(handle);
+ }
+ if (device.IsExtExtendedDynamicStateSupported()) {
+ scheduler.Record([bindings = bindings,
+ buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
+ cmdbuf.BindVertexBuffers2EXT(
+ bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(),
+ reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()),
+ reinterpret_cast<const VkDeviceSize*>(bindings.sizes.data()),
+ reinterpret_cast<const VkDeviceSize*>(bindings.strides.data()));
+ });
+ } else {
+ scheduler.Record([bindings = bindings,
+ buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
+ cmdbuf.BindVertexBuffers(
+ bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(),
+ reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()));
+ });
+ }
+}
+
void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset,
u32 size) {
if (!device.IsExtTransformFeedbackSupported()) {
@@ -523,6 +556,25 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer,
});
}
+void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings) {
+ if (!device.IsExtTransformFeedbackSupported()) {
+ // Already logged in the rasterizer
+ return;
+ }
+ boost::container::small_vector<VkBuffer, 4> buffer_handles;
+ for (u32 index = 0; index < bindings.buffers.size(); index++) {
+ auto& buffer = *reinterpret_cast<Buffer*>(bindings.buffers[index]);
+ buffer_handles.push_back(buffer.Handle());
+ }
+ scheduler.Record(
+ [bindings = bindings, buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
+ cmdbuf.BindTransformFeedbackBuffersEXT(
+ 0, static_cast<u32>(buffer_handles.size()), buffer_handles.data(),
+ reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()),
+ reinterpret_cast<const VkDeviceSize*>(bindings.sizes.data()));
+ });
+}
+
void BufferCacheRuntime::ReserveNullBuffer() {
if (null_buffer) {
return;
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h
index 92b4f7859..92d3e9f32 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.h
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h
@@ -18,6 +18,7 @@ namespace Vulkan {
class Device;
class DescriptorPool;
class Scheduler;
+struct HostVertexBinding;
class BufferCacheRuntime;
@@ -96,8 +97,10 @@ public:
void BindQuadIndexBuffer(PrimitiveTopology topology, u32 first, u32 count);
void BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, u32 stride);
+ void BindVertexBuffers(VideoCommon::HostBindings& bindings);
void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size);
+ void BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings);
std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage,
[[maybe_unused]] u32 binding_index, u32 size) {
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index 9482e91b0..5734f51e5 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -350,6 +350,7 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device
.has_broken_spirv_subgroup_mask_vector_extract_dynamic =
driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY};
host_info = Shader::HostTranslateInfo{
+ .support_float64 = device.IsFloat64Supported(),
.support_float16 = device.IsFloat16Supported(),
.support_int64 = device.IsShaderInt64Supported(),
.needs_demote_reorder =
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp
index afcf34fba..d3cddac69 100644
--- a/src/video_core/renderer_vulkan/vk_swapchain.cpp
+++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp
@@ -231,7 +231,12 @@ void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities, bo
.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
.queueFamilyIndexCount = 0,
.pQueueFamilyIndices = nullptr,
+#ifdef ANDROID
+ // On Android, do not allow surface rotation to deviate from the frontend.
+ .preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
+#else
.preTransform = capabilities.currentTransform,
+#endif
.compositeAlpha = alpha_flags,
.presentMode = present_mode,
.clipped = VK_FALSE,
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index 0158b6b0d..a46f9beed 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -386,6 +386,8 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
IsFormatSupported(VK_FORMAT_D24_UNORM_S8_UINT,
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT, FormatType::Optimal);
+ supports_conditional_barriers = !(is_intel_anv || is_intel_windows);
+
CollectPhysicalMemoryInfo();
CollectToolingInfo();
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h
index d62a103a1..f314d0ffe 100644
--- a/src/video_core/vulkan_common/vulkan_device.h
+++ b/src/video_core/vulkan_common/vulkan_device.h
@@ -300,6 +300,11 @@ public:
return GetDriverID() != VK_DRIVER_ID_QUALCOMM_PROPRIETARY;
}
+ /// Returns true if the device suppors float64 natively.
+ bool IsFloat64Supported() const {
+ return features.features.shaderFloat64;
+ }
+
/// Returns true if the device supports float16 natively.
bool IsFloat16Supported() const {
return features.shader_float16_int8.shaderFloat16;
@@ -580,6 +585,10 @@ public:
return properties.properties.limits.maxVertexInputBindings;
}
+ bool SupportsConditionalBarriers() const {
+ return supports_conditional_barriers;
+ }
+
private:
/// Checks if the physical device is suitable and configures the object state
/// with all necessary info about its properties.
@@ -683,6 +692,7 @@ private:
bool must_emulate_bgr565{}; ///< Emulates BGR565 by swizzling RGB565 format.
bool dynamic_state3_blending{}; ///< Has all blending features of dynamic_state3.
bool dynamic_state3_enables{}; ///< Has all enables features of dynamic_state3.
+ bool supports_conditional_barriers{}; ///< Allows barriers in conditional control flow.
u64 device_access_memory{}; ///< Total size of device local memory in bytes.
u32 sets_per_pool{}; ///< Sets per Description Pool
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 6288fef62..bac9dff90 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -101,6 +101,12 @@ const std::map<Settings::RendererBackend, QString> Config::renderer_backend_text
{Settings::RendererBackend::Null, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Null"))},
};
+const std::map<Settings::ShaderBackend, QString> Config::shader_backend_texts_map = {
+ {Settings::ShaderBackend::GLSL, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "GLSL"))},
+ {Settings::ShaderBackend::GLASM, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "GLASM"))},
+ {Settings::ShaderBackend::SPIRV, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "SPIRV"))},
+};
+
// This shouldn't have anything except static initializers (no functions). So
// QKeySequence(...).toString() is NOT ALLOWED HERE.
// This must be in alphabetical order according to action name as it must have the same order as
@@ -754,6 +760,7 @@ void Config::ReadRendererValues() {
ReadGlobalSetting(Settings::values.use_fast_gpu_time);
ReadGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);
ReadGlobalSetting(Settings::values.enable_compute_pipelines);
+ ReadGlobalSetting(Settings::values.use_video_framerate);
ReadGlobalSetting(Settings::values.bg_red);
ReadGlobalSetting(Settings::values.bg_green);
ReadGlobalSetting(Settings::values.bg_blue);
@@ -1409,6 +1416,7 @@ void Config::SaveRendererValues() {
WriteGlobalSetting(Settings::values.use_fast_gpu_time);
WriteGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);
WriteGlobalSetting(Settings::values.enable_compute_pipelines);
+ WriteGlobalSetting(Settings::values.use_video_framerate);
WriteGlobalSetting(Settings::values.bg_red);
WriteGlobalSetting(Settings::values.bg_green);
WriteGlobalSetting(Settings::values.bg_blue);
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index ad590ea9e..0fd4baf6b 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -54,6 +54,7 @@ public:
static const std::map<bool, QString> use_docked_mode_texts_map;
static const std::map<Settings::GPUAccuracy, QString> gpu_accuracy_texts_map;
static const std::map<Settings::RendererBackend, QString> renderer_backend_texts_map;
+ static const std::map<Settings::ShaderBackend, QString> shader_backend_texts_map;
static constexpr UISettings::Theme default_theme{
#ifdef _WIN32
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp
index 896863f87..0463ac8b9 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.cpp
+++ b/src/yuzu/configuration/configure_graphics_advanced.cpp
@@ -42,6 +42,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
Settings::values.use_vulkan_driver_pipeline_cache.GetValue());
ui->enable_compute_pipelines_checkbox->setChecked(
Settings::values.enable_compute_pipelines.GetValue());
+ ui->use_video_framerate_checkbox->setChecked(Settings::values.use_video_framerate.GetValue());
if (Settings::IsConfiguringGlobal()) {
ui->gpu_accuracy->setCurrentIndex(
@@ -91,6 +92,8 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {
ConfigurationShared::ApplyPerGameSetting(&Settings::values.enable_compute_pipelines,
ui->enable_compute_pipelines_checkbox,
enable_compute_pipelines);
+ ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_video_framerate,
+ ui->use_video_framerate_checkbox, use_video_framerate);
}
void ConfigureGraphicsAdvanced::changeEvent(QEvent* event) {
@@ -125,6 +128,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
Settings::values.max_anisotropy.UsingGlobal());
ui->enable_compute_pipelines_checkbox->setEnabled(
Settings::values.enable_compute_pipelines.UsingGlobal());
+ ui->use_video_framerate_checkbox->setEnabled(
+ Settings::values.use_video_framerate.UsingGlobal());
return;
}
@@ -149,6 +154,9 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
ConfigurationShared::SetColoredTristate(ui->enable_compute_pipelines_checkbox,
Settings::values.enable_compute_pipelines,
enable_compute_pipelines);
+ ConfigurationShared::SetColoredTristate(ui->use_video_framerate_checkbox,
+ Settings::values.use_video_framerate,
+ use_video_framerate);
ConfigurationShared::SetColoredComboBox(
ui->gpu_accuracy, ui->label_gpu_accuracy,
static_cast<int>(Settings::values.gpu_accuracy.GetValue(true)));
diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h
index 1c7b636b9..a4dc8ceb0 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.h
+++ b/src/yuzu/configuration/configure_graphics_advanced.h
@@ -47,6 +47,7 @@ private:
ConfigurationShared::CheckState use_fast_gpu_time;
ConfigurationShared::CheckState use_vulkan_driver_pipeline_cache;
ConfigurationShared::CheckState enable_compute_pipelines;
+ ConfigurationShared::CheckState use_video_framerate;
const Core::System& system;
};
diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui
index 37757a918..e7f0ef6be 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.ui
+++ b/src/yuzu/configuration/configure_graphics_advanced.ui
@@ -192,6 +192,16 @@ Compute pipelines are always enabled on all other drivers.</string>
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="use_video_framerate_checkbox">
+ <property name="toolTip">
+ <string>Run the game at normal speed during video playback, even when the framerate is unlocked.</string>
+ </property>
+ <property name="text">
+ <string>Sync to framerate of video playback</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QWidget" name="af_layout" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_1">
<property name="leftMargin">
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 145fea5f1..013715b44 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -3067,7 +3067,7 @@ InstallResult GMainWindow::InstallNSPXCI(const QString& filename) {
return false;
}
- std::array<u8, 0x1000> buffer{};
+ std::vector<u8> buffer(1_MiB);
for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) {
if (install_progress->wasCanceled()) {
@@ -4116,7 +4116,13 @@ void GMainWindow::UpdateDockedButton() {
void GMainWindow::UpdateAPIText() {
const auto api = Settings::values.renderer_backend.GetValue();
const auto renderer_status_text = Config::renderer_backend_texts_map.find(api)->second;
- renderer_status_button->setText(renderer_status_text.toUpper());
+ renderer_status_button->setText(
+ api == Settings::RendererBackend::OpenGL
+ ? tr("%1 %2").arg(
+ renderer_status_text.toUpper(),
+ Config::shader_backend_texts_map.find(Settings::values.shader_backend.GetValue())
+ ->second)
+ : renderer_status_text.toUpper());
}
void GMainWindow::UpdateFilterText() {