From 0ff2aebdf173c6bf6a8458fd2893917c132ce08d Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sat, 14 Mar 2026 16:52:53 +0000 Subject: [PATCH 01/98] android: Fixed Amiibo files failing to load on vanilla --- .../citra_emu/activities/EmulationActivity.kt | 14 +++++++++++--- .../citra/citra_emu/fragments/EmulationFragment.kt | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt index 1e372720e..5f5215876 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt @@ -10,7 +10,6 @@ import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager import android.net.Uri -import android.os.Build import android.os.Bundle import android.view.InputDevice import android.view.KeyEvent @@ -21,6 +20,7 @@ import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.net.toUri import androidx.core.os.BundleCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -43,6 +43,7 @@ import org.citra.citra_emu.features.settings.model.view.InputBindingSetting import org.citra.citra_emu.fragments.EmulationFragment import org.citra.citra_emu.fragments.MessageDialogFragment import org.citra.citra_emu.model.Game +import org.citra.citra_emu.utils.BuildUtil import org.citra.citra_emu.utils.ControllerMappingHelper import org.citra.citra_emu.utils.FileBrowserHelper import org.citra.citra_emu.utils.EmulationLifecycleUtil @@ -294,6 +295,7 @@ class EmulationActivity : AppCompatActivity() { private fun onAmiiboSelected(selectedFile: String) { val success = NativeLibrary.loadAmiibo(selectedFile) if (!success) { + Log.error("[EmulationActivity] Failed to load Amiibo file: $selectedFile") MessageDialogFragment.newInstance( R.string.amiibo_load_error, R.string.amiibo_load_error_message @@ -516,13 +518,19 @@ class EmulationActivity : AppCompatActivity() { return true } - val openFileLauncher = + val openAmiiboFileLauncher = registerForActivityResult(OpenFileResultContract()) { result: Intent? -> if (result == null) return@registerForActivityResult val selectedFiles = FileBrowserHelper.getSelectedFiles( result, applicationContext, listOf("bin") ) ?: return@registerForActivityResult - onAmiiboSelected(selectedFiles[0]) + if (BuildUtil.isGooglePlayBuild) { + onAmiiboSelected(selectedFiles[0]) + } else { + val fileUri = selectedFiles[0].toUri() + val nativePath = "!" + NativeLibrary.getNativePath(fileUri) + onAmiiboSelected(nativePath) + } } val openImageLauncher = diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index d4ce96a55..2cd35ff46 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -854,7 +854,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram popupMenu.setOnMenuItemClickListener { when (it.itemId) { R.id.menu_emulation_amiibo_load -> { - emulationActivity.openFileLauncher.launch(false) + emulationActivity.openAmiiboFileLauncher.launch(false) true } From d97da17263094b474e046c0b5f55b42131937ddf Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sat, 14 Mar 2026 19:21:54 +0000 Subject: [PATCH 02/98] android: Fixed installed app shortcut creation failing on vanilla --- .../java/org/citra/citra_emu/NativeLibrary.kt | 4 +++ .../java/org/citra/citra_emu/model/Game.kt | 28 +++++++++++++++---- .../org/citra/citra_emu/utils/FileUtil.kt | 8 +++++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt index cf1659361..9d2015baa 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt @@ -729,6 +729,10 @@ object NativeLibrary { return uriString } + if (uri.scheme == "file") { + return uri.path!! + } + val pathSegment = uri.lastPathSegment ?: return "" val virtualPath = pathSegment.substringAfter(":") diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt index 16fbd3490..4148a7a3f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt @@ -7,11 +7,16 @@ package org.citra.citra_emu.model import android.os.Parcelable import android.content.Intent import android.net.Uri +import androidx.core.net.toUri +import java.io.File +import java.io.IOException import java.util.HashSet import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable import org.citra.citra_emu.CitraApplication +import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.activities.EmulationActivity +import org.citra.citra_emu.utils.BuildUtil @Parcelize @Serializable @@ -37,12 +42,25 @@ class Game( val keyLastPlayedTime get() = "${filename}_LastPlayed" val launchIntent: Intent - get() = Intent(CitraApplication.appContext, EmulationActivity::class.java).apply { - action = Intent.ACTION_VIEW - data = if (isInstalled) { - CitraApplication.documentsTree.getUri(path) + get() { + var appUri: Uri + if (isInstalled) { + if (BuildUtil.isGooglePlayBuild) { + appUri = CitraApplication.documentsTree.getUri(path) + } else { + val nativePath = NativeLibrary.getUserDirectory() + "/" + path + val nativeFile = File(nativePath) + if (!nativeFile.exists()) { + throw IOException("Attempting to create shortcut for an executable that doesn't exist: $nativePath") + } + appUri = Uri.fromFile(nativeFile) + } } else { - Uri.parse(path) + appUri = path.toUri() + } + return Intent(CitraApplication.appContext, EmulationActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = appUri } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt index 9d9063c59..86b82c1dd 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt @@ -219,10 +219,16 @@ object FileUtil { */ @JvmStatic fun getFilename(uri: Uri): String { - val columns = arrayOf(DocumentsContract.Document.COLUMN_DISPLAY_NAME) var filename = "" var c: Cursor? = null try { + if (uri.scheme == "file") { + BuildUtil.assertNotGooglePlay() + val file = File(uri.path!!); + return file.name + } + + val columns = arrayOf(DocumentsContract.Document.COLUMN_DISPLAY_NAME) c = context.contentResolver.query( uri, columns, From ccd61d01349b1bc4b374d858824ebcceac38a9c2 Mon Sep 17 00:00:00 2001 From: Cobalt <60624944+cobalt2727@users.noreply.github.com> Date: Sun, 15 Mar 2026 07:46:50 -0500 Subject: [PATCH 03/98] qt: fix compilation on older QT6 (#1886) * fix compilation on older QT6 * fix indent my C++ is very rusty * fix indents again * Fixed formatting --------- Co-authored-by: OpenSauce04 --- src/citra_qt/configuration/configure_motion_touch.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/citra_qt/configuration/configure_motion_touch.cpp b/src/citra_qt/configuration/configure_motion_touch.cpp index 5b9b79bd7..4d8e52a30 100644 --- a/src/citra_qt/configuration/configure_motion_touch.cpp +++ b/src/citra_qt/configuration/configure_motion_touch.cpp @@ -230,8 +230,13 @@ void ConfigureMotionTouch::ConnectEvents() { poll_timer->start(200); // Check for new inputs every 200ms } }); +#if QT_VERSION < QT_VERSION_CHECK(6, 7, 0) + connect(ui->touchpad_checkbox, &QCheckBox::StateChanged, this, [this]() { UpdateUiDisplay(); }); +#else connect(ui->touchpad_checkbox, &QCheckBox::checkStateChanged, this, [this]() { UpdateUiDisplay(); }); +#endif + connect(ui->touchpad_config_btn, &QPushButton::clicked, this, [this]() { if (QMessageBox::information(this, tr("Information"), tr("After pressing OK, tap the touchpad on the controller " From 6ad642a984fc4cbaa5e137db058632db552f8f6e Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 15 Mar 2026 15:17:50 +0100 Subject: [PATCH 04/98] android: camera: Fix still image camera input (#1892) --- .../java/org/citra/citra_emu/camera/StillImageCameraHelper.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.kt b/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.kt index c1d45e3af..e97dbf641 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -57,6 +57,7 @@ object StillImageCameraHelper { val request = ImageRequest.Builder(context) .data(uri) .size(width, height) + .allowHardware(false) .build() return context.imageLoader.executeBlocking(request).drawable?.toBitmap( width, From 4109bb200b60d7548cc736e9436eaba648863711 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sun, 15 Mar 2026 14:47:14 +0000 Subject: [PATCH 05/98] android: Show Azahar version in toast when double-clicking on Applications --- .../org/citra/citra_emu/ui/main/MainActivity.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt index 80b26685d..c3d3673b4 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt @@ -39,6 +39,8 @@ import androidx.work.OutOfQuotaPolicy import androidx.work.WorkManager import com.google.android.material.color.MaterialColors import com.google.android.material.navigation.NavigationBarView +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.TimeSource import kotlinx.coroutines.launch import org.citra.citra_emu.BuildConfig import org.citra.citra_emu.NativeLibrary @@ -130,12 +132,22 @@ class MainActivity : AppCompatActivity(), ThemeProvider { ) } + var applicationsClickTimestamp = TimeSource.Monotonic.markNow() + val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment setUpNavigation(navHostFragment.navController) (binding.navigationView as NavigationBarView).setOnItemReselectedListener { when (it.itemId) { - R.id.gamesFragment -> gamesViewModel.setShouldScrollToTop(true) + R.id.gamesFragment -> { + if (applicationsClickTimestamp.elapsedNow() < 300.milliseconds) { + Toast.makeText(this, BuildConfig.VERSION_NAME, Toast.LENGTH_LONG) + .show() + } + applicationsClickTimestamp = TimeSource.Monotonic.markNow() + + gamesViewModel.setShouldScrollToTop(true) + } R.id.searchFragment -> gamesViewModel.setSearchFocused(true) R.id.homeSettingsFragment -> SettingsActivity.launch( this, From e677f72bda3d4fa00cae23a4418361a6f2a697a3 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sun, 15 Mar 2026 15:33:04 +0000 Subject: [PATCH 06/98] android: Fixed onResume attempting to pause instead of unpause --- .../java/org/citra/citra_emu/fragments/EmulationFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index 2cd35ff46..091ffd5ee 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -488,7 +488,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram super.onResume() Choreographer.getInstance().postFrameCallback(this) if (NativeLibrary.isRunning()) { - emulationState.pause() + emulationState.unpause() // If the overlay is enabled, we need to update the position if changed val position = IntSetting.PERFORMANCE_OVERLAY_POSITION.int From ae9972b6beb962e9d02180cc8507d801bac069cd Mon Sep 17 00:00:00 2001 From: Cobalt <60624944+cobalt2727@users.noreply.github.com> Date: Sun, 15 Mar 2026 13:29:30 -0500 Subject: [PATCH 07/98] Qt compat fix (again) (#1895) * fix compilation on older QT6 * fix indent my C++ is very rusty * fix indents again * Fixed formatting * fix capitalization error --------- Co-authored-by: OpenSauce04 --- src/citra_qt/configuration/configure_motion_touch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/citra_qt/configuration/configure_motion_touch.cpp b/src/citra_qt/configuration/configure_motion_touch.cpp index 4d8e52a30..6d2806897 100644 --- a/src/citra_qt/configuration/configure_motion_touch.cpp +++ b/src/citra_qt/configuration/configure_motion_touch.cpp @@ -231,7 +231,7 @@ void ConfigureMotionTouch::ConnectEvents() { } }); #if QT_VERSION < QT_VERSION_CHECK(6, 7, 0) - connect(ui->touchpad_checkbox, &QCheckBox::StateChanged, this, [this]() { UpdateUiDisplay(); }); + connect(ui->touchpad_checkbox, &QCheckBox::stateChanged, this, [this]() { UpdateUiDisplay(); }); #else connect(ui->touchpad_checkbox, &QCheckBox::checkStateChanged, this, [this]() { UpdateUiDisplay(); }); From 3d5ba09eb1e17bc2d72d4a71eb44a7a568ab31e5 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Tue, 17 Mar 2026 13:15:33 +0100 Subject: [PATCH 08/98] android: Fix launching applications through intent data in vanilla build (#1896) * android: Fix launching applications through intent data in vanilla build * GameHelper.kt: Use Uri.scheme where applicable --------- Co-authored-by: OpenSauce04 --- .../citra_emu/fragments/EmulationFragment.kt | 46 ++++++++++++------ .../org/citra/citra_emu/utils/FileUtil.kt | 4 ++ .../org/citra/citra_emu/utils/GameHelper.kt | 6 ++- src/common/file_util.cpp | 48 +++++++++++++++++++ 4 files changed, 89 insertions(+), 15 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index 091ffd5ee..35899ce7f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -18,6 +18,7 @@ import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper +import android.os.ParcelFileDescriptor import android.os.SystemClock import android.text.Editable import android.text.TextWatcher @@ -73,6 +74,7 @@ import org.citra.citra_emu.features.settings.model.SettingsViewModel import org.citra.citra_emu.features.settings.ui.SettingsActivity import org.citra.citra_emu.features.settings.utils.SettingsFile import org.citra.citra_emu.model.Game +import org.citra.citra_emu.utils.BuildUtil import org.citra.citra_emu.utils.DirectoryInitialization import org.citra.citra_emu.utils.DirectoryInitialization.DirectoryInitializationState import org.citra.citra_emu.utils.EmulationMenuSettings @@ -108,6 +110,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram private val onPause = Runnable{ togglePause() } private val onShutdown = Runnable{ emulationState.stop() } + // Only used if a game is passed through intent on google play variant + private var gameFd: Int? = null + override fun onAttach(context: Context) { super.onAttach(context) if (context is EmulationActivity) { @@ -125,27 +130,34 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram super.onCreate(savedInstanceState) val intent = requireActivity().intent - val intentUri: Uri? = intent.data + var intentUri: Uri? = intent.data val oldIntentInfo = Pair( intent.getStringExtra("SelectedGame"), intent.getStringExtra("SelectedTitle") ) var intentGame: Game? = null + intentUri = if (intentUri == null && oldIntentInfo.first != null) { + Uri.parse(oldIntentInfo.first) + } else { + intentUri + } if (intentUri != null) { - intentGame = if (Game.extensions.contains(FileUtil.getExtension(intentUri))) { - // isInstalled, addedToLibrary and mediaType do not matter here - GameHelper.getGame(intentUri, isInstalled = false, addedToLibrary = false, mediaType = Game.MediaType.GAME_CARD) - } else { - null - } - } else if (oldIntentInfo.first != null) { - val gameUri = Uri.parse(oldIntentInfo.first) - intentGame = if (Game.extensions.contains(FileUtil.getExtension(gameUri))) { - // isInstalled, addedToLibrary and mediaType do not matter here - GameHelper.getGame(gameUri, isInstalled = false, addedToLibrary = false, mediaType = Game.MediaType.GAME_CARD) - } else { - null + if (!BuildUtil.isGooglePlayBuild) { + // We need to build a special path as the incoming URI may be SAF exclusive + Log.warning("[EmulationFragment] Cannot determine native path of URI \"" + + intentUri.toString() + "\", using file descriptor instead.") + gameFd = requireContext().contentResolver.openFileDescriptor(intentUri, "r")?.detachFd() + intentUri = if (gameFd != null) { + Uri.parse("fd://" + gameFd.toString()) + } else { + null + } } + intentGame = + intentUri?.let { + // isInstalled, addedToLibrary and mediaType do not matter here + GameHelper.getGame(it, isInstalled = false, addedToLibrary = false, mediaType = Game.MediaType.GAME_CARD) + } } val insertedCartridge = preferences.getString("insertedCartridge", "") @@ -163,6 +175,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram return } + Log.info("[EmulationFragment] Starting application " + game.path) + // So this fragment doesn't restart on configuration changes; i.e. rotation. retainInstance = true emulationState = EmulationState(game.path) @@ -528,6 +542,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram override fun onDestroy() { EmulationLifecycleUtil.removeHook(onPause) EmulationLifecycleUtil.removeHook(onShutdown) + if (gameFd != null) { + ParcelFileDescriptor.adoptFd(gameFd!!).close() + gameFd = null + } super.onDestroy() } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt index 86b82c1dd..29020c99d 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt @@ -222,6 +222,10 @@ object FileUtil { var filename = "" var c: Cursor? = null try { + if (uri.scheme == "fd") { + return "" + } + if (uri.scheme == "file") { BuildUtil.assertNotGooglePlay() val file = File(uri.path!!); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt index e3d871aa2..f711b6224 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt @@ -75,7 +75,11 @@ object GameHelper { if (BuildUtil.isGooglePlayBuild || FileUtil.isNativePath(filePath)) { gameInfo = GameInfo(filePath) } else { - nativePath = "!" + NativeLibrary.getNativePath(uri); + nativePath = if (uri.scheme == "fd") { + uri.toString() + } else { + "!" + NativeLibrary.getNativePath(uri) + }; gameInfo = GameInfo(nativePath) } diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index 95b5dda5b..52f406226 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -122,6 +122,16 @@ typedef struct stat file_stat_t; #define FERROR ferror #define FFLUSH std::fflush +#ifdef _MSC_VER +#define DUP_FD _dup +#define FDOPEN _fdopen +#define CLOSE_FD _close +#else +#define DUP_FD dup +#define FDOPEN fdopen +#define CLOSE_FD close +#endif + #endif // This namespace has various generic functions related to files and paths. @@ -1262,6 +1272,44 @@ void IOFile::Swap(IOFile& other) noexcept { bool IOFile::Open() { Close(); + // Any filename with the format fd:// represents a file that + // must be opened by duplicating the provided file_descriptor. This is used + // on Android vanilla builds when the ROM absolute path is not known. + if (filename.starts_with("fd://")) { + +#if !defined(HAVE_LIBRETRO_VFS) + const std::string fd_str = filename.substr(5); + + // Check that fd_str is not empty and contains only digits + if (fd_str.empty() || !std::all_of(fd_str.begin(), fd_str.end(), ::isdigit)) { + m_good = false; + return false; + } + + int fd = std::stoi(fd_str); + + int dup_fd = DUP_FD(fd); + if (dup_fd == -1) { + m_good = false; + return false; + } + + m_file = FDOPEN(dup_fd, openmode.c_str()); + if (!m_file) { + CLOSE_FD(dup_fd); + m_good = false; + return false; + } + + m_good = true; + return true; +#else + // TODO: Add support for libretro vfs when needed. + m_good = false; + return false; +#endif + } + #ifdef _WIN32 // Open with FILE_SHARE_READ, FILE_SHARE_WRITE and FILE_SHARE_DELETE // flags. This mimics linux behaviour as much as possible, which From 2ff04dccba58de0b5dc999643aaf0d2c30b76541 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 17 Mar 2026 12:19:49 +0000 Subject: [PATCH 09/98] Removed confusing punctuation from "Failed to obtain loader" log message --- src/citra_qt/citra_qt.cpp | 2 +- src/core/core.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index f0aba2c31..f6faec9c5 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -1290,7 +1290,7 @@ bool GMainWindow::LoadROM(const QString& filename) { if (result != Core::System::ResultStatus::Success) { switch (result) { case Core::System::ResultStatus::ErrorGetLoader: - LOG_CRITICAL(Frontend, "Failed to obtain loader for {}!", filename.toStdString()); + LOG_CRITICAL(Frontend, "Failed to obtain loader for {}", filename.toStdString()); QMessageBox::critical( this, tr("Invalid App Format"), tr("Your app format is not supported.
Please follow the guides to redump your " diff --git a/src/core/core.cpp b/src/core/core.cpp index e7b5868f8..42cba3160 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -303,7 +303,7 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st app_loader = Loader::GetLoader(filepath); } if (!app_loader) { - LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath); + LOG_CRITICAL(Core, "Failed to obtain loader for {}", filepath); return ResultStatus::ErrorGetLoader; } From ab39df3ff047b2a8ae962fad51f8c83d5d995d4e Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Tue, 17 Mar 2026 19:24:30 +0100 Subject: [PATCH 10/98] android: Handle asynchronous screen disconnects (#1903) --- .../citra_emu/display/SecondaryDisplay.kt | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt b/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt index d9c75f690..d09daab41 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt @@ -6,18 +6,15 @@ package org.citra.citra_emu.display import android.app.Presentation import android.content.Context -import android.graphics.SurfaceTexture import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay import android.os.Bundle import android.view.Display import android.view.MotionEvent -import android.view.Surface import android.view.SurfaceHolder import android.view.SurfaceView import android.view.WindowManager import org.citra.citra_emu.features.settings.model.IntSetting -import org.citra.citra_emu.display.SecondaryDisplayLayout import org.citra.citra_emu.NativeLibrary class SecondaryDisplay(val context: Context) : DisplayManager.DisplayListener { @@ -66,6 +63,11 @@ class SecondaryDisplay(val context: Context) : DisplayManager.DisplayListener { } fun updateDisplay() { + // return early if the parent context is dead or dying + if (context is android.app.Activity && (context.isFinishing || context.isDestroyed)) { + return + } + // decide if we are going to the external display or the internal one var display = getExternalDisplay(context) if (display == null || @@ -78,12 +80,25 @@ class SecondaryDisplay(val context: Context) : DisplayManager.DisplayListener { // otherwise, make a new presentation releasePresentation() - pres = SecondaryDisplayPresentation(context, display!!, this) - pres?.show() + + try { + pres = SecondaryDisplayPresentation(context, display!!, this) + pres?.show() + } + // catch BadTokenException and InvalidDisplayException, + // the display became invalid asynchronously, so we can assign to null + // until onDisplayAdded/Removed/Changed is called and logic retriggered + catch (_: WindowManager.BadTokenException) { + pres = null + } catch (_: WindowManager.InvalidDisplayException) { + pres = null + } } fun releasePresentation() { - pres?.dismiss() + try { + pres?.dismiss() + } catch (_: Exception) { } pres = null } From f721a474e45f9e79a63e072fbc80eb0f206b196e Mon Sep 17 00:00:00 2001 From: David Griswold Date: Thu, 19 Mar 2026 05:46:56 -0700 Subject: [PATCH 11/98] force android emu_window to update height and width on surface change, solving aspect ratio issues on some screens (#1907) --- src/android/app/src/main/jni/emu_window/emu_window.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index 8458a4f2b..26cd2da56 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -25,6 +25,8 @@ bool EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) { render_window = surface; window_info.type = Frontend::WindowSystemType::Android; window_info.render_surface = surface; + window_width = ANativeWindow_getWidth(surface); + window_height = ANativeWindow_getHeight(surface); StopPresenting(); OnFramebufferSizeChanged(); From c55435b78d93ea56462fb85b8c724bfd72d9eb33 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Thu, 19 Mar 2026 13:48:58 +0100 Subject: [PATCH 12/98] android: Fix lifecycle bugs on SetupFragment (#1902) * android: Attempt fixing lifecycle bugs on SetupFragment * android: Fixed setup page number being lost on recreation * Move the registerForActivityResult to MainActivity * Code cleanup * ViewUtils.kt: Added missing guard clause in showView * Fixed permission buttons appearing to duplicate during setup * ViewUtils.kt: Updated license header --------- Co-authored-by: OpenSauce04 --- .../citra_emu/fragments/SetupFragment.kt | 183 ++++++++++-------- .../citra/citra_emu/ui/main/MainActivity.kt | 29 ++- .../org/citra/citra_emu/utils/ViewUtils.kt | 6 +- .../citra_emu/viewmodel/HomeViewModel.kt | 18 +- 4 files changed, 146 insertions(+), 90 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt index f4cefc94f..17bd32dc4 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt @@ -23,7 +23,6 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -32,7 +31,6 @@ import androidx.preference.PreferenceManager import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.snackbar.Snackbar import com.google.android.material.transition.MaterialFadeThrough -import org.citra.citra_emu.BuildConfig import org.citra.citra_emu.CitraApplication import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.R @@ -92,23 +90,20 @@ class SetupFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { mainActivity = requireActivity() as MainActivity - homeViewModel.setNavigationVisibility(visible = false, animated = false) - - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - if (binding.viewPager2.currentItem > 0) { - pageBackward() - } else { - requireActivity().finish() - } - } + homeViewModel.selectedCitraDirectoryLiveData.observe(viewLifecycleOwner) { uri -> + if (uri == null) { + return@observe } - ) - - requireActivity().window.navigationBarColor = - ContextCompat.getColor(requireContext(), android.R.color.transparent) + onOpenCitraDirectory(uri) + homeViewModel.selectedCitraDirectory = null + } + homeViewModel.selectedGamesDirectoryLiveData.observe(viewLifecycleOwner) { uri -> + if (uri == null) { + return@observe + } + onGetGamesDirectory(uri) + homeViewModel.selectedGamesDirectory = null + } pages = mutableListOf() pages.apply { @@ -320,7 +315,7 @@ class SetupFragment : Fragment() { R.string.select_citra_user_folder_description, buttonAction = { pageButtonCallback = it - PermissionsHandler.compatibleSelectDirectory(openCitraDirectory) + PermissionsHandler.compatibleSelectDirectory(mainActivity.setupOpenCitraDirectory) }, buttonState = { if (PermissionsHandler.hasWriteAccess(requireContext())) { @@ -342,9 +337,9 @@ class SetupFragment : Fragment() { R.drawable.ic_controller, R.string.games, R.string.games_description, - buttonAction = { + buttonAction = { pageButtonCallback = it - getGamesDirectory.launch( + mainActivity.setupGetGamesDirectory.launch( Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data ) }, @@ -409,27 +404,33 @@ class SetupFragment : Fragment() { } binding.viewPager2.registerOnPageChangeCallback(object : OnPageChangeCallback() { - var previousPosition: Int = 0 override fun onPageSelected(position: Int) { super.onPageSelected(position) - - if (position == 1 && previousPosition == 0) { - ViewUtils.showView(binding.buttonNext) - ViewUtils.showView(binding.buttonBack) - } else if (position == 0 && previousPosition == 1) { - ViewUtils.hideView(binding.buttonBack) - ViewUtils.hideView(binding.buttonNext) - } else if (position == pages.size - 1 && previousPosition == pages.size - 2) { - ViewUtils.hideView(binding.buttonNext) - } else if (position == pages.size - 2 && previousPosition == pages.size - 1) { - ViewUtils.showView(binding.buttonNext) - } - - previousPosition = position + updateNavigationButtons(position) } }) + homeViewModel.setNavigationVisibility(visible = false, animated = false) + + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (binding.viewPager2.currentItem > 0) { + pageBackward() + } else { + requireActivity().finish() + } + } + } + ) + + binding.viewPager2.currentItem = homeViewModel.setupCurrentPage + + requireActivity().window.navigationBarColor = + ContextCompat.getColor(requireContext(), android.R.color.transparent) + binding.buttonNext.setOnClickListener { val index = binding.viewPager2.currentItem val currentPage = pages[index] @@ -479,29 +480,23 @@ class SetupFragment : Fragment() { } binding.buttonBack.setOnClickListener { pageBackward() } - if (savedInstanceState != null) { - val nextIsVisible = savedInstanceState.getBoolean(KEY_NEXT_VISIBILITY) - val backIsVisible = savedInstanceState.getBoolean(KEY_BACK_VISIBILITY) - hasBeenWarned = savedInstanceState.getBooleanArray(KEY_HAS_BEEN_WARNED)!! - - if (nextIsVisible) { - binding.buttonNext.visibility = View.VISIBLE - } - if (backIsVisible) { - binding.buttonBack.visibility = View.VISIBLE - } - } else { + if (savedInstanceState == null) { hasBeenWarned = BooleanArray(pages.size) + } else { + hasBeenWarned = savedInstanceState.getBooleanArray(KEY_HAS_BEEN_WARNED) ?: BooleanArray(pages.size) } + updateNavigationButtons(binding.viewPager2.currentItem) + setInsets() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putBoolean(KEY_NEXT_VISIBILITY, binding.buttonNext.isVisible) - outState.putBoolean(KEY_BACK_VISIBILITY, binding.buttonBack.isVisible) - outState.putBooleanArray(KEY_HAS_BEEN_WARNED, hasBeenWarned) + + if (::hasBeenWarned.isInitialized) { + outState.putBooleanArray(KEY_HAS_BEEN_WARNED, hasBeenWarned) + } } override fun onDestroyView() { @@ -510,15 +505,39 @@ class SetupFragment : Fragment() { } private lateinit var pageButtonCallback: SetupCallback - private val checkForButtonState: () -> Unit = { - val page = pages[binding.viewPager2.currentItem] - page.pageButtons?.forEach { - if (it.buttonState() == ButtonState.BUTTON_ACTION_COMPLETE) { - pageButtonCallback.onStepCompleted(it.titleId, pageFullyCompleted = false) - } - if (page.pageSteps() == PageState.PAGE_STEPS_COMPLETE) { - pageButtonCallback.onStepCompleted(0, pageFullyCompleted = true) + private fun updateNavigationButtons(position: Int) { + if (position == 0) { + ViewUtils.hideView(binding.buttonBack) + } else { + ViewUtils.showView(binding.buttonBack) + } + + if (position == 0 || position == pages.size - 1) { + ViewUtils.hideView(binding.buttonNext) + } else { + ViewUtils.showView(binding.buttonNext) + } + } + + private val checkForButtonState: () -> Unit = { + val currentIndex = binding.viewPager2.currentItem + val page = pages[currentIndex] + + val isPageComplete = page.pageSteps() == PageState.PAGE_STEPS_COMPLETE + + if (isPageComplete) { + binding.viewPager2.adapter?.notifyItemChanged(currentIndex) + ViewUtils.showView(binding.buttonNext) + } else { + page.pageButtons?.forEach { + if (it.buttonState() == ButtonState.BUTTON_ACTION_COMPLETE) { + if (this::pageButtonCallback.isInitialized) { + pageButtonCallback.onStepCompleted(it.titleId, pageFullyCompleted = false) + } else { + binding.viewPager2.adapter?.notifyItemChanged(currentIndex) + } + } } } } @@ -559,13 +578,7 @@ class SetupFragment : Fragment() { showPermissionDeniedSnackbar() } - private val openCitraDirectory = registerForActivityResult( - ActivityResultContracts.OpenDocumentTree() - ) { result: Uri? -> - if (result == null) { - return@registerForActivityResult - } - + private fun onOpenCitraDirectory(result: Uri) { if (!BuildUtil.isGooglePlayBuild) { if (NativeLibrary.getNativePath(result) == "") { SelectUserDirectoryDialogFragment.newInstance( @@ -573,34 +586,30 @@ class SetupFragment : Fragment() { R.string.invalid_selection, R.string.invalid_user_directory ).show(mainActivity.supportFragmentManager, SelectUserDirectoryDialogFragment.TAG) - return@registerForActivityResult + return } } - CitraDirectoryHelper(requireActivity(), true).showCitraDirectoryDialog(result, pageButtonCallback, checkForButtonState) + CitraDirectoryHelper(requireActivity(), true).showCitraDirectoryDialog(result, + null, checkForButtonState) } - private val getGamesDirectory = - registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result -> - if (result == null) { - return@registerForActivityResult - } + private fun onGetGamesDirectory(result: Uri) { + requireActivity().contentResolver.takePersistableUriPermission( + result, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) - requireActivity().contentResolver.takePersistableUriPermission( - result, - Intent.FLAG_GRANT_READ_URI_PERMISSION - ) + // When a new directory is picked, we currently will reset the existing games + // database. This effectively means that only one game directory is supported. + preferences.edit() + .putString(GameHelper.KEY_GAME_PATH, result.toString()) + .apply() - // When a new directory is picked, we currently will reset the existing games - // database. This effectively means that only one game directory is supported. - preferences.edit() - .putString(GameHelper.KEY_GAME_PATH, result.toString()) - .apply() + homeViewModel.setGamesDir(requireActivity(), result.path!!) - homeViewModel.setGamesDir(requireActivity(), result.path!!) - - checkForButtonState.invoke() - } + checkForButtonState.invoke() + } private fun finishSetup() { preferences.edit() @@ -611,10 +620,12 @@ class SetupFragment : Fragment() { fun pageForward() { binding.viewPager2.currentItem = binding.viewPager2.currentItem + 1 + homeViewModel.setupCurrentPage = binding.viewPager2.currentItem } fun pageBackward() { binding.viewPager2.currentItem = binding.viewPager2.currentItem - 1 + homeViewModel.setupCurrentPage = binding.viewPager2.currentItem } fun setPageWarned(page: Int) { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt index c3d3673b4..91df60632 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt @@ -76,6 +76,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider { override var themeId: Int = 0 + companion object { + const val KEY_SETUP_CURRENT_PAGE = "SetupCurrentPage" + } + override fun onCreate(savedInstanceState: Bundle?) { RefreshRateUtil.enforceRefreshRate(this) @@ -136,7 +140,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment - setUpNavigation(navHostFragment.navController) + setUpNavigation(savedInstanceState, navHostFragment.navController) (binding.navigationView as NavigationBarView).setOnItemReselectedListener { when (it.itemId) { R.id.gamesFragment -> { @@ -188,6 +192,14 @@ class MainActivity : AppCompatActivity(), ThemeProvider { setInsets() } + override fun onSaveInstanceState(outState: Bundle) { + // Save the user's current game state. + outState.putInt(KEY_SETUP_CURRENT_PAGE, homeViewModel.setupCurrentPage) + + // Always call the superclass so it can save the view hierarchy state. + super.onSaveInstanceState(outState) + } + override fun onResume() { checkUserPermissions() @@ -263,11 +275,12 @@ class MainActivity : AppCompatActivity(), ThemeProvider { (binding.navigationView as NavigationBarView).setupWithNavController(navController) } - private fun setUpNavigation(navController: NavController) { + private fun setUpNavigation(savedInstanceState: Bundle?, navController: NavController) { val firstTimeSetup = PreferenceManager.getDefaultSharedPreferences(applicationContext) .getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true) if (firstTimeSetup && !homeViewModel.navigatedToSetup) { + homeViewModel.setupCurrentPage = savedInstanceState?.getInt(KEY_SETUP_CURRENT_PAGE) ?: 0 navController.navigate(R.id.firstTimeSetupFragment) homeViewModel.navigatedToSetup = true } else { @@ -424,4 +437,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider { .build() ) } + + val setupOpenCitraDirectory = registerForActivityResult( + ActivityResultContracts.OpenDocumentTree(), + ) { result: Uri? -> + homeViewModel.selectedCitraDirectory = result + } + + val setupGetGamesDirectory = registerForActivityResult( + ActivityResultContracts.OpenDocumentTree() + ) { result: Uri? -> + homeViewModel.selectedGamesDirectory = result + } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/ViewUtils.kt index 828561579..f9647b631 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/ViewUtils.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -9,6 +9,10 @@ import android.view.ViewGroup object ViewUtils { fun showView(view: View, length: Long = 300) { + if (view.visibility == View.VISIBLE) { + return + } + view.apply { alpha = 0f visibility = View.VISIBLE diff --git a/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/HomeViewModel.kt b/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/HomeViewModel.kt index 32b2449fb..739075522 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/HomeViewModel.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/HomeViewModel.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -7,6 +7,8 @@ package org.citra.citra_emu.viewmodel import android.content.res.Resources import android.net.Uri import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.preference.PreferenceManager @@ -62,6 +64,20 @@ class HomeViewModel : ViewModel() { var navigatedToSetup = false + var setupCurrentPage = 0 + + private val _selectedCitraDirectory = MutableLiveData() + val selectedCitraDirectoryLiveData: LiveData = _selectedCitraDirectory + var selectedCitraDirectory: Uri? + get() = _selectedCitraDirectory.value + set(value) { _selectedCitraDirectory.value = value } + + private val _selectedGamesDirectory = MutableLiveData() + val selectedGamesDirectoryLiveData: LiveData = _selectedGamesDirectory + var selectedGamesDirectory: Uri? + get() = _selectedGamesDirectory.value + set(value) { _selectedGamesDirectory.value = value } + fun setNavigationVisibility(visible: Boolean, animated: Boolean) { if (_navigationVisible.value.first == visible) { return From dc91e8803e59f153fc678ae1dc3735919521cc5f Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Thu, 19 Mar 2026 14:36:28 +0000 Subject: [PATCH 13/98] Updated compatibility data --- dist/compatibility_list | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/compatibility_list b/dist/compatibility_list index eadcdfb84..d9f1126e4 160000 --- a/dist/compatibility_list +++ b/dist/compatibility_list @@ -1 +1 @@ -Subproject commit eadcdfb84b6f3b95734e867d99fe16a9e8db717f +Subproject commit d9f1126e42b606d02ecc89b10cb9a336a3b2f5a3 From 7a60160f68f1d94804a570c8d84e49b587afb3d9 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Thu, 19 Mar 2026 14:50:43 +0000 Subject: [PATCH 14/98] Updated translations via Transifex --- dist/languages/ca_ES_valencia.ts | 30 +- dist/languages/da_DK.ts | 30 +- dist/languages/de.ts | 30 +- dist/languages/el.ts | 399 +++++++++--------- dist/languages/es_ES.ts | 30 +- dist/languages/fi.ts | 30 +- dist/languages/fr.ts | 30 +- dist/languages/hu_HU.ts | 30 +- dist/languages/id.ts | 30 +- dist/languages/it.ts | 47 ++- dist/languages/ja_JP.ts | 30 +- dist/languages/ko_KR.ts | 30 +- dist/languages/lt_LT.ts | 30 +- dist/languages/nb.ts | 30 +- dist/languages/nl.ts | 30 +- dist/languages/pl_PL.ts | 79 ++-- dist/languages/pt_BR.ts | 39 +- dist/languages/ro_RO.ts | 30 +- dist/languages/ru_RU.ts | 30 +- dist/languages/sv.ts | 39 +- dist/languages/tr_TR.ts | 30 +- dist/languages/vi_VN.ts | 30 +- dist/languages/zh_CN.ts | 30 +- dist/languages/zh_TW.ts | 30 +- .../res/values-b+ca+ES+valencia/strings.xml | 102 ++++- .../src/main/res/values-b+da+DK/strings.xml | 1 - .../src/main/res/values-b+es+ES/strings.xml | 4 +- .../src/main/res/values-b+pl+PL/strings.xml | 15 +- .../src/main/res/values-b+pt+BR/strings.xml | 25 +- .../src/main/res/values-b+tr+TR/strings.xml | 1 - .../src/main/res/values-b+zh+CN/strings.xml | 1 - .../app/src/main/res/values-de/strings.xml | 1 - .../app/src/main/res/values-fr/strings.xml | 2 +- .../app/src/main/res/values-it/strings.xml | 2 +- .../app/src/main/res/values-sv/strings.xml | 2 +- 35 files changed, 743 insertions(+), 586 deletions(-) diff --git a/dist/languages/ca_ES_valencia.ts b/dist/languages/ca_ES_valencia.ts index e2853b1f7..ca856867c 100644 --- a/dist/languages/ca_ES_valencia.ts +++ b/dist/languages/ca_ES_valencia.ts @@ -2290,9 +2290,9 @@ Desitja ignorar l'error i continuar? - - - + + + Configure Configurar @@ -2383,7 +2383,7 @@ Desitja ignorar l'error i continuar? - + Test Provar @@ -2415,7 +2415,7 @@ Desitja ignorar l'error i continuar? - + Information Informació @@ -2430,52 +2430,52 @@ Desitja ignorar l'error i continuar? [pulsa un botó] - + After pressing OK, tap the touchpad on the controller you want to track. Després de polsar "Acceptar", toca el panell tàctil del comandament que desitja usar. - + [press touchpad] [pressiona el panell tàctil] - + Testing Provant - + Configuring Configurant - + Test Successful Prova Exitosa - + Successfully received data from the server. Dades rebudes del servidor amb èxit. - + Test Failed Prova Fallida - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. No s'han pogut rebre dades vàlides del servidor.<br>Assegura't que el servidor estiga configurat correctament i que la direcció i el port són correctes. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. La prova de UDP o la configuració de calibratge està en marxa.<br>Per favor, espera a que estes acaben. diff --git a/dist/languages/da_DK.ts b/dist/languages/da_DK.ts index c4b990066..e2859afdf 100644 --- a/dist/languages/da_DK.ts +++ b/dist/languages/da_DK.ts @@ -2292,9 +2292,9 @@ Vil du ignorere fejlen og fortsætte? - - - + + + Configure Konfigurer @@ -2385,7 +2385,7 @@ Vil du ignorere fejlen og fortsætte? - + Test Test @@ -2417,7 +2417,7 @@ Vil du ignorere fejlen og fortsætte? - + Information Information @@ -2432,52 +2432,52 @@ Vil du ignorere fejlen og fortsætte? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Tester - + Configuring Konfigurerer - + Test Successful Testen var succesfuld - + Successfully received data from the server. Data blev succesfuldt modtaget fra serveren. - + Test Failed Testen fejlede - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kunne ikke modtage gyldig data fra serveren.<br>Kontroller venligst om server er sat op korrekt og at adressen og porten er rigtig. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-test eller konfiguration af kalibrering er i gang.<br>Vent venligst til de er fuldført. diff --git a/dist/languages/de.ts b/dist/languages/de.ts index 99717701d..386c3a75c 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -2292,9 +2292,9 @@ Möchtest du den Fehler ignorieren und fortfahren? - - - + + + Configure Konfiguration @@ -2385,7 +2385,7 @@ Möchtest du den Fehler ignorieren und fortfahren? - + Test Test @@ -2417,7 +2417,7 @@ Möchtest du den Fehler ignorieren und fortfahren? - + Information Information @@ -2432,52 +2432,52 @@ Möchtest du den Fehler ignorieren und fortfahren? [drücke eine Taste] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Test läuft - + Configuring Wird konfiguriert - + Test Successful Test erfolgreich - + Successfully received data from the server. Daten wurden erfolgreich vom Server empfangen. - + Test Failed Test gescheitert - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Keine gültigen Daten vom Server empfangen. <br>Bitte stelle sicher, dass der Server korrekt eingerichtet ist und sowohl die Serveradresse, als auch der Port richtig sind. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-Test oder Kalibrierung werden gerade ausgeführt.<br>Bitte warte, bis der Test abgeschlossen sind. diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 5bcd5fa68..d0a810058 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -132,7 +132,7 @@ p, li { white-space: pre-wrap; } Touch the top left corner <br>of your touchpad. - Αγγίξτε την επάνω αριστερή γωνία <br>της επιφάνειας αφής σας. + Αγγίξτε την πάνω αριστερή γωνία <br>της επιφάνειας αφής σας. @@ -314,7 +314,7 @@ This would ban both their forum username and their IP address. LLE multi-core - LLE πολυπύρηνο + LLE πολλαπλών πυρήνων @@ -329,7 +329,7 @@ This would ban both their forum username and their IP address. <html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html> - + <html><head/><body><p>Αυτό το μετεπεξεργαστικό εφέ προσαρμόζει την ταχύτητα του ήχου για να ταιριάξει με την ταχύτητα εξομοίωσης και βοηθά στην αποτροπή το «κόμπιασμα» του ήχου. Αυτό ωστόσο αυξάνει την καθυστέρηση του ήχου.</p></body></html> @@ -743,12 +743,12 @@ Would you like to ignore the error and continue? CPU - + CPU Use global clock speed - Χρήση παγκόσμιας ταχύτητας χρονισμού + Χρήση καθολικής ταχύτητας χρονισμού @@ -838,7 +838,7 @@ Would you like to ignore the error and continue? Validation layer not available - + Το επίπεδο επικύρωσης δεν είναι διαθέσιμο @@ -985,47 +985,47 @@ Would you like to ignore the error and continue? 2x Native (800x480) - + Εγγενής 2x (800x480) 3x Native (1200x720) - + Εγγενής 3x (1200x720) 4x Native (1600x960) - + Εγγενής 4x (1600x960) 5x Native (2000x1200) - + Εγγενής 5x (2000x1200) 6x Native (2400x1440) - + Εγγενής 6x (2400x1440) 7x Native (2800x1680) - + Εγγενής 7x (2800x1680) 8x Native (3200x1920) - + Εγγενής 8x (3200x1920) 9x Native (3600x2160) - + Εγγενής 9x (3600x2160) 10x Native (4000x2400) - + Εγγενής 10x (4000x2400) @@ -1040,7 +1040,7 @@ Would you like to ignore the error and continue? Enable Linear Filtering - + Ενεργοποίηση γραμμικού φιλτραρίσματος @@ -1070,7 +1070,7 @@ Would you like to ignore the error and continue? ScaleForce - + ScaleForce @@ -1085,7 +1085,7 @@ Would you like to ignore the error and continue? Stereoscopy - + Στερεοσκοπία @@ -1095,7 +1095,7 @@ Would you like to ignore the error and continue? Off - + Ανενεργή @@ -1110,12 +1110,12 @@ Would you like to ignore the error and continue? Anaglyph - + Ανάγλυφη Interlaced - + Πεπλεγμένη @@ -1145,12 +1145,12 @@ Would you like to ignore the error and continue? Left Eye (default) - Αριστερό Μάτι (προκαθορισμένη) + Αριστερό μάτι (προεπιλογή) Right Eye - Δεξί Μάτι + Δεξί μάτι @@ -1165,7 +1165,7 @@ Would you like to ignore the error and continue? Swap Eyes - + Εναλλαγή ματιών @@ -1200,7 +1200,7 @@ Would you like to ignore the error and continue? Preload custom textures - + Προφόρτωση προσαρμοσμένων υφών @@ -1283,7 +1283,7 @@ Would you like to ignore the error and continue? Use global emulation speed - + Χρήση καθολικής ταχύτητας εξομοίωσης @@ -1298,7 +1298,7 @@ Would you like to ignore the error and continue? Turbo Speed Limit: - + Όριο ταχύτητας Turbo: @@ -1308,12 +1308,12 @@ Would you like to ignore the error and continue? Use global screenshot path - + Χρήση καθολικής διαδρομής στιγμιότυπων Set screenshot path: - + Ορισμός διαδρομής στιγμιότυπων: @@ -1405,7 +1405,7 @@ Would you like to ignore the error and continue? SPIR-V shader generation - + Δημιουργία shader SPIR-V @@ -1430,7 +1430,7 @@ Would you like to ignore the error and continue? Enable hardware shader - + Ενεργοποίηση shader υλικού @@ -1450,7 +1450,7 @@ Would you like to ignore the error and continue? Enable shader JIT - + Ενεργοποίηση JIT shader @@ -1490,7 +1490,7 @@ Would you like to ignore the error and continue? Application Controlled - + Έλεγχος από εφαρμογή @@ -1500,7 +1500,7 @@ Would you like to ignore the error and continue? Linear - + Γραμμική @@ -1525,17 +1525,17 @@ Would you like to ignore the error and continue? <html><head/><body><p>When enabled, this setting detects when the refresh rate of the screen is below that of the 3DS, and when it is, disables VSync automatically to avoid emulation speed being forced below 100%.</p></body></html> - + <html><head/><body><p>Όταν είναι ενεργοποιημένη, αυτή η ρύθμιση εντοπίζει πότε ο ρυθμός ανανέωσης της οθόνης είναι χαμηλότερος από αυτόν του 3DS και, όταν είναι, απενεργοποιεί αυτόματα το VSync, προκειμένου να μην επιβληθεί ταχύτητα εξομοίωσης κάτω από 100%.</p></body></html> Enable display refresh rate detection - + Ενεργοποίηση εντοπισμού του ρυθμού ανανέωσης οθόνης Use global - + Χρήση καθολικής ρύθμισης @@ -1589,13 +1589,13 @@ Would you like to ignore the error and continue? Toggle Turbo Mode - + (Απ)ενεργοποίηση λειτουργίας Turbo Toggle Per-Application Speed - + (Απ)ενεργοποίηση ταχύτητας ανά εφαρμογή @@ -1627,12 +1627,12 @@ Would you like to ignore the error and continue? Clear - Απαλοιφή + Απαλοιφή The default key sequence is already assigned to: %1 - + Η προεπιλεγμένη ακολουθία πλήκτρων χρησιμοποιείται ήδη για: %1 @@ -1722,7 +1722,7 @@ Would you like to ignore the error and continue? Up: - Επάνω: + Πάνω: @@ -1768,12 +1768,12 @@ Would you like to ignore the error and continue? Power: - + Κουμπί ισχύος: Circle Mod: - Τροποποίηση κύκλου: + Circle Mod: @@ -1819,7 +1819,7 @@ Would you like to ignore the error and continue? Diagonals - + Διαγώνια @@ -1945,7 +1945,7 @@ Would you like to ignore the error and continue? Enter the name for the new profile. - Εισαγάγετε το όνομα του νέου προφίλ, + Εισαγάγετε το όνομα του νέου προφίλ. @@ -1975,7 +1975,7 @@ Would you like to ignore the error and continue? Profile name already exists. Please choose a different name. - Το όνομα του προφίλ υπάρχει ήδη. Παρακαλώ επιλέξτε ένα άλλο όνομα. + Το όνομα του προφίλ υπάρχει ήδη. Επιλέξτε ένα άλλο όνομα. @@ -2034,7 +2034,7 @@ Would you like to ignore the error and continue? Rotate screens upright - + Κατακόρυφη περιστροφή οθονών @@ -2049,12 +2049,12 @@ Would you like to ignore the error and continue? Screen Gap - + Κενό μεταξύ οθονών Large Screen Proportion - + Διαστάσεις μεγάλης οθόνης @@ -2064,42 +2064,42 @@ Would you like to ignore the error and continue? Upper Right - + Πάνω δεξιά Middle Right - + Μέσο δεξιά Bottom Right (default) - + Κάτω δεξιά (προεπιλογή) Upper Left - + Πάνω αριστερά Middle Left - + Μέσο αριστερά Bottom Left - + Κάτω αριστερά Above large screen - + Πάνω από τη μεγάλη οθόνη Below large screen - + Κάτω από τη μεγάλη οθόνη @@ -2132,7 +2132,7 @@ Would you like to ignore the error and continue? px - + px @@ -2166,7 +2166,7 @@ Would you like to ignore the error and continue? Single Screen Layout - + Διάταξη μονής οθόνης @@ -2252,7 +2252,7 @@ Would you like to ignore the error and continue? No Layout Selected - + Δεν έχουν επιλεχθεί διατάξεις @@ -2292,9 +2292,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Διαμόρφωση @@ -2385,7 +2385,7 @@ Would you like to ignore the error and continue? - + Test Δοκιμή @@ -2417,7 +2417,7 @@ Would you like to ignore the error and continue? - + Information Πληροφορίες @@ -2432,54 +2432,54 @@ Would you like to ignore the error and continue? [πατήστε το κουμπί] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Δοκιμή - + Configuring Διαμόρφωση - + Test Successful Επιτυχής δοκιμή - + Successfully received data from the server. Επιτυχής λήψη δεδομένων από τον διακομιστή. - + Test Failed Αποτυχία δοκιμής - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. - Δεν ήταν δυνατή η λήψη έγκυρων δεδομένων από τον διακομιστή.<br>Παρακαλώ βεβαιωθείτε ότι ο διακομιστής έχει διαμορφωθεί σωστά και ότι η διεύθυνση και η θύρα είναι σωστές. + Δεν ήταν δυνατή η λήψη έγκυρων δεδομένων από τον διακομιστή.<br> Βεβαιωθείτε ότι ο διακομιστής έχει διαμορφωθεί σωστά και ότι η διεύθυνση και η θύρα είναι σωστές. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. - Η δοκιμή UDP ή η διαμόρφωση βαθμονόμησης βρίσκεται σε εξέλιξη.<br>Παρακαλώ περιμένετε να ολοκληρωθούν. + Η δοκιμή UDP ή η διαμόρφωση βαθμονόμησης βρίσκεται σε εξέλιξη.<br>Περιμένετε να ολοκληρωθούν. @@ -2487,7 +2487,7 @@ Would you like to ignore the error and continue? Dialog - + Παράθυρο διαλόγου @@ -2522,7 +2522,7 @@ Would you like to ignore the error and continue? Reset Per-Application Settings - + Επαναφορά ρυθμίσεων ανά εφαρμογή @@ -2643,12 +2643,12 @@ Would you like to ignore the error and continue? Compress installed CIA content - + Συμπίεση εγκατεστημένου περιεχομένου CIA <html><head/><body><p>Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled.</p></body></html> - + <html><head/><body><p>Συμπιέζει το περιεχόμενο των αρχείων CIA όταν εγκαθίσταται στην εξομοιωμένη κάρτα SD. Επηρεάζει μόνο το περιεχόμενο CIA που εγκαθίσταται όσο είναι ενεργοποιημένη η ρύθμιση.</p></body></html> @@ -2943,7 +2943,7 @@ installed applications. Play Coins - + Play Coins @@ -2979,7 +2979,7 @@ installed applications. 3GX Plugin Loader - + Φόρτωση αρθρώματος 3GX @@ -2994,7 +2994,7 @@ installed applications. Real Console Unique Data - + Μοναδικά δεδομένα πραγματικής κονσόλας @@ -3004,7 +3004,7 @@ installed applications. Unlink - + Αποσύνδεση @@ -3037,7 +3037,7 @@ installed applications. System settings are available only when applications is not running. - + Οι ρυθμίσεις συστήματος είναι διαθέσιμες μόνο όταν δεν εκτελούνται εφαρμογές. @@ -3577,7 +3577,7 @@ installed applications. Isle of Man - Νήσος Μαν + Νήσος του Μαν @@ -3748,7 +3748,7 @@ installed applications. Console ID: 0x%1 - ID κονσόλας: 0x%1 + Αναγνωριστικό κονσόλας: 0x%1 @@ -3771,7 +3771,7 @@ installed applications. This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + Αυτή η ενέργεια θα αντικαταστήσει την τρέχουσα διεύθυνση MAC σας με μια νέα. Αυτό δεν προτείνεται αν λάβατε τη διεύθυνση MAC από την πραγματική σας κονσόλα μέσω του εργαλείου ρύθμισης. Θέλετε να συνεχίσετε; @@ -3781,7 +3781,7 @@ installed applications. Invalid country for configured region - + Μη έγκυρη χώρα για τη ρυθμισμένη περιοχή @@ -3791,27 +3791,27 @@ installed applications. Status: Loaded - + Κατάσταση: Φορτώθηκε Status: Loaded (Invalid Signature) - + Κατάσταση: Φορτώθηκε (μη έγκυρη υπογραφή) Status: Loaded (Region Changed) - + Κατάσταση: Φορτώθηκε (αλλαγή περιοχής) Status: Not Found - + Κατάσταση: Δεν βρέθηκε Status: Invalid - + Κατάσταση: Μη έγκυρο @@ -3824,7 +3824,7 @@ installed applications. Configure Touchscreen Mappings - Ρύθμιση αντιστοιχίσεων οθόνης αφής + Διαμόρφωση αντιστοιχίσεων οθόνης αφής @@ -4012,7 +4012,7 @@ Drag points to change position, or double-click table cells to edit values. Single line mode - + Λειτουργία μονής γραμμής @@ -4022,7 +4022,7 @@ Drag points to change position, or double-click table cells to edit values. Show advanced frame time info - + Εμφάνιση προηγμένων πληροφορίων χρόνου καρέ @@ -4068,7 +4068,7 @@ Drag points to change position, or double-click table cells to edit values. <html><head/><body><p>Server address of the host</p></body></html> - + <html><head/><body><p>Διεύθυνση διακομιστή οικοδεσπότη</p></body></html> @@ -4166,13 +4166,13 @@ Drag points to change position, or double-click table cells to edit values. Bitrate: - + Ρυθμός bit: bps - + bps @@ -4230,7 +4230,7 @@ Please check your FFmpeg installation used for compilation. Warning - Προειδοποίηση + Προειδοποίηση @@ -4240,12 +4240,17 @@ When run this way, the app may be missing certain functionality such as camera e It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + Το εκτελέσιμο αρχείο `azahar` εκτελείται απευθείας και όχι μέσω του πακέτου Azahar.app. + +Όταν γίνεται εκτέλεση με αυτόν τον τρόπο, η εφαρμογή ενδέχεται να μην έχει ορισμένες λειτουργίες, όπως εξομοίωση της κάμερας. + +Προτείνεται η εκτέλεση του Azahar με χρήση της εντολής `open` , π.χ.: +`open ./Azahar.app` No Suitable Vulkan Devices Detected - + Δεν εντοπίστηκαν κατάλληλες συσκευές Vulkan @@ -4255,7 +4260,7 @@ It is recommended to instead run Azahar using the `open` command, e.g.: Current Artic traffic speed. Higher values indicate bigger transfer loads. - + Η τρέχουσα ταχύτητα κίνησης του Artic. Οι υψηλότερες τιμές υποδεικνύουν μεγαλύτερους φόρτους μεταφορών. @@ -4267,7 +4272,7 @@ It is recommended to instead run Azahar using the `open` command, e.g.: How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - + Πόσα καρέ ανά δευτερόλεπτο εμφανίζει επί του παρόντος η εφαρμογή. Αυτό θα διαφέρει από εφαρμογή σε εφαρμογή και από σκηνικό σε σκηνικό. @@ -4311,12 +4316,12 @@ It is recommended to instead run Azahar using the `open` command, e.g.: Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + Η μορφή της εφαρμογής σας δεν υποστηρίζεται.<br/>Ακολουθήστε τους οδηγούς για να κάνετε εκ νέου αποτύπωση των <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>κασετών</a> ή των <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>εγκατεστημένων τίτλων</a> σας. App Corrupted - + Κατεστραμμένη εφαρμογή @@ -4326,7 +4331,7 @@ It is recommended to instead run Azahar using the `open` command, e.g.: App Encrypted - + Κρυπτογραφημένη εφαρμογή @@ -4341,7 +4346,7 @@ It is recommended to instead run Azahar using the `open` command, e.g.: GBA Virtual Console is not supported by Azahar. - + Η GBA Virtual Console δεν υποστηρίζεται από το Azahar. @@ -4447,7 +4452,7 @@ It is recommended to instead run Azahar using the `open` command, e.g.: Do you want to launch the application in fullscreen? - + Θέλετε να εκκινήσετε την εφαρμογή σε πλήρη οθόνη; @@ -4550,7 +4555,7 @@ Refer to the log for details. Enter Azahar Artic Setup Tool address: - + Εισαγάγετε τη διεύθυνση του εργαλείου ρύθμισης Azahar Artic: @@ -4566,7 +4571,7 @@ Refer to the log for details. Setup is possible. - + Η ρύθμιση είναι δυνατή. @@ -4640,7 +4645,7 @@ Reinstall the files anyway? Unable to open File - Δεν είναι δυνατό το άνοιγμα του αρχείου + Αδυναμία ανοίγματος του αρχείου @@ -4670,7 +4675,7 @@ Reinstall the files anyway? CIA Encrypted - + Κρυπτογραφημένο CIA @@ -4680,12 +4685,12 @@ Reinstall the files anyway? Unable to find File - + Αδυναμία εύρεσης του αρχείου Could not find %1 - + Δεν ήταν δυνατή η εύρεση του «%1» @@ -4698,22 +4703,22 @@ Reinstall the files anyway? Failed to compress some files, check log for details. - + Η συμπίεση ορισμένων αρχείων απέτυχε, ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. Failed to decompress some files, check log for details. - + Η αποσυμπίεση ορισμένων αρχείων απέτυχε, ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. All files have been compressed successfully. - + Όλα τα αρχεία έχουν συμπιεστεί επιτυχώς. All files have been decompressed successfully. - + Όλα τα αρχεία έχουν αποσυμπιεστεί επιτυχώς. @@ -4728,7 +4733,7 @@ Reinstall the files anyway? Successfully uninstalled '%1'. - + Έγινε επιτυχώς κατάργηση της εγκατάστασης του «%1». @@ -4750,24 +4755,26 @@ Reinstall the files anyway? Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - + Προειδοποίηση: Οι αποθηκεύσεις κατάστασης (savestates) ΔΕΝ αποτελούν υποκατάστατο της αποθήκευσης δεδομένων εντός των εφαρμογών και δεν θεωρούνται αξιόπιστες. + +Χρησιμοποιήστε τες με δική σας ευθύνη! Error opening amiibo data file - + Σφάλμα κατά το άνοιγμα του αρχείου δεδομένων Amiibo A tag is already in use. - + Μια ετικέτα χρησιμοποιείται ήδη. Application is not looking for amiibos. - + Η εφαρμογή δεν αναζητά Amiibo. @@ -4782,7 +4789,7 @@ Use at your own risk! Unable to open amiibo file "%1" for reading. - + Δεν είναι δυνατό το άνοιγμα του αρχείου Amiibo «%1» για ανάγνωση. @@ -4809,7 +4816,7 @@ Use at your own risk! Application will unpause - + Η εφαρμογή θα συνεχιστεί @@ -4819,7 +4826,7 @@ Use at your own risk! Invalid Screenshot Directory - + Μη έγκυρος κατάλογος στιγμιότυπων @@ -4847,37 +4854,37 @@ To view a guide on how to install FFmpeg, press Help. Load 3DS ROM Files - + Φόρτωση αρχείων ROM 3DS 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + Αρχεία ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) 3DS Compressed ROM File (*.%1) - + Συμπιεσμένο αρχείο ROM 3DS (*.%1) Save 3DS Compressed ROM File - + Αποθήκευση αρχείου συμπιεσμένης ROM 3DS Select Output 3DS Compressed ROM Folder - + Επιλογή φακέλου εξόδου συμπιεσμένης ROM 3DS Load 3DS Compressed ROM Files - + Φόρτωση αρχείων συμπιεσμένων ROM 3DS 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + Συμπιεσμένα αρχεία ROM 3DS (*.zcia *zcci *z3dsx *zcxi) @@ -4897,7 +4904,7 @@ To view a guide on how to install FFmpeg, press Help. Select FFmpeg Directory - + Επιλογή καταλόγου FFmpeg @@ -4907,12 +4914,12 @@ To view a guide on how to install FFmpeg, press Help. FFmpeg has been sucessfully installed. - + Το FFmpeg έχει εγκατασταθεί επιτυχώς. Installation of FFmpeg failed. Check the log file for details. - + Η εγκατάσταση του FFmpeg απέτυχε. Ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. @@ -4942,7 +4949,7 @@ To view a guide on how to install FFmpeg, press Help. (Accessing SystemSaveData) - + (Πρόσβαση στα SystemSaveData) @@ -4992,7 +4999,7 @@ To view a guide on how to install FFmpeg, press Help. Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Καρέ: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) @@ -5073,7 +5080,7 @@ To view a guide on how to install FFmpeg, press Help. The application is still running. Would you like to stop emulation? - + Η εφαρμογή εκτελείται ακόμα. Θέλετε να διακόψετε την εξομοίωση; @@ -5177,7 +5184,7 @@ Would you like to download it? Error while initializing OpenGL! - + Σφάλμα κατά την αρχικοποίηση του OpenGL! @@ -5197,7 +5204,7 @@ Would you like to download it? Error while initializing OpenGL ES 3.2! - + Σφάλμα κατά την αρχικοποίηση του OpenGL ES 3.2! @@ -5235,12 +5242,12 @@ Would you like to download it? Play time - + Χρόνος παιχνιδιού Favorite - + Αγαπημένο @@ -5285,17 +5292,17 @@ Would you like to download it? Texture Dump Location - + Τοποθεσία αποτύπωσης υφών Custom Texture Location - + Τοποθεσία προσαρμοσμένων υφών Mods Location - + Τοποθεσία τροποποιήσεων @@ -5325,12 +5332,12 @@ Would you like to download it? Uninstall - + Κατάργηση Everything - + Όλα @@ -5360,7 +5367,7 @@ Would you like to download it? Add to Desktop - + Προσθήκη στην επιφάνεια εργασίας @@ -5409,7 +5416,7 @@ This will delete the application if installed, as well as any installed updates Are you sure you want to uninstall '%1'? - + Θέλετε σίγουρα να καταργήσετε την εγκατάσταση του «%1»; @@ -5429,17 +5436,17 @@ This will delete the application if installed, as well as any installed updates Remove Application Directory - + Αφαίρεση καταλόγου εφαρμογής Move Up - + Μετακίνηση προς τα πάνω Move Down - + Μετακίνηση προς τα κάτω @@ -5449,7 +5456,7 @@ This will delete the application if installed, as well as any installed updates Clear - Απαλοιφή + Απαλοιφή @@ -5479,7 +5486,8 @@ any workarounds needed. App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Η εφαρμογή εμφανίζει μικρά προβλήματα γραφικών ή ήχου και είναι λειτουργικό από την αρχή έως το τέλος. Ενδέχεται να χρειαστούν μερικές +προσωρινές λύσεις. @@ -5490,7 +5498,8 @@ workarounds. App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Η εφαρμογή εμφανίζει σημαντικά προβλήματα γραφικών ή ήχου, αλλά είναι λειτουργική από την αρχή έως το τέλος με +προσωρινές λύσεις. @@ -5501,7 +5510,8 @@ workarounds. App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Η εφαρμογή λειτουργεί, αλλά με σημαντικά προβλήματα γραφικών ή ήχου. Δεν είναι δυνατή η συνέχεια σε συγκεκριμένες περιοχές λόγω των προβλημάτων, +ακόμα και με προσωρινές λύσεις. @@ -5522,7 +5532,7 @@ Screen. The app crashes when attempting to startup. - + Η εφαρμογή καταρρέει κατά την απόπειρα εκκίνησης. @@ -5532,7 +5542,7 @@ Screen. The app has not yet been tested. - + Η εφαρμογή δεν έχει δοκιμαστεί ακόμα. @@ -6009,7 +6019,7 @@ Screen. (Leave blank for open room) - + (Αφήστε το κενό για ανοικτό δωμάτιο) @@ -6579,7 +6589,7 @@ Debug Message: Browse Public Rooms - + Περιήγηση σε δημόσια δωμάτια @@ -6609,12 +6619,12 @@ Debug Message: Open Log Folder - + Άνοιγμα φακέλου αρχείων καταγραφής Opens the Azahar Log folder - + Ανοίγει τον φάκελο των αρχείων καταγραφής του Azahar @@ -6654,32 +6664,32 @@ Debug Message: Top Right - + Πάνω δεξιά Middle Right - + Μέσο δεξιά Bottom Right - + Κάτω δεξιά Top Left - + Πάνω αριστερά Middle Left - + Μέσο αριστερά Bottom Left - + Κάτω αριστερά @@ -6835,7 +6845,7 @@ Debug Message: Current running application will be stopped. - + Η τρέχουσα εφαρμογή θα διακοπεί. @@ -6873,7 +6883,7 @@ Debug Message: Application used in this movie is not in Applications list. - + Η εφαρμογή που χρησιμοποιείται σε αυτό το βίντεο δεν βρίσκεται στη λίστα εφαρμογών. @@ -6907,7 +6917,7 @@ Debug Message: Current running application will be restarted. - + Η τρέχουσα εφαρμογή θα επανεκκινηθεί. @@ -6917,7 +6927,7 @@ Debug Message: Recording will start once you boot an application. - + Η εγγραφή θα ξεκινήσει μόλις εκκινήσετε μια εφαρμογή. @@ -6961,7 +6971,7 @@ Debug Message: Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: - Αποτυχία ενημέρωσης πληροφοριών δωματίου. Παρακαλώ ελέγξτε τη σύνδεση διαδικτύου σας και δοκιμάστε να δημιουργήσετε ξανά το δωμάτιο. + Αποτυχία ενημέρωσης πληροφοριών δωματίου. Ελέγξτε τη σύνδεση διαδικτύου σας και δοκιμάστε να δημιουργήσετε ξανά το δωμάτιο. Μήνυμα ελέγχου σφαλμάτων: @@ -6998,17 +7008,17 @@ Debug Message: Username is not valid. Must be 4 to 20 alphanumeric characters. - + Το όνομα χρήστη δεν είναι έγκυρο. Πρέπει να αποτελείται από 4 έως 20 αλφαριθμητικούς χαρακτήρες. Room name is not valid. Must be 4 to 20 alphanumeric characters. - + Το όνομα δωματίου δεν είναι έγκυρο. Πρέπει να αποτελείται από 4 έως 20 αλφαριθμητικούς χαρακτήρες. Username is already in use or not valid. Please choose another. - + Το όνομα χρήστη χρησιμοποιείται ήδη ή δεν είναι έγκυρο. Επιλέξτε κάποιο άλλο. @@ -7048,12 +7058,12 @@ Debug Message: The host of the room has banned you. Speak with the host to unban you or try a different room. - + Ο οικοδεσπότης του δωματίου σάς έχει αποκλείσει. Μιλήστε με τον οικοδεσπότη για να αναιρέσει τον αποκλεισμό σας ή δοκιμάστε ένα άλλο δωμάτιο. Version mismatch! Please update to the latest version of Azahar. If the problem persists, contact the room host and ask them to update the server. - + Αναντιστοιχία έκδοσης! Κάντε ενημέρωση στην πιο πρόσφατη έκδοση του Azahar. Εάν το πρόβλημα παραμένει, επικοινωνήστε με τον οικοδεσπότη του δωματίου και ζητήστε του να ενημερώσει τον διακομιστή. @@ -7073,12 +7083,12 @@ Debug Message: You have been kicked by the room host. - + Έχετε αποβληθεί από τον οικοδεσπότη του δωματίου. MAC address is already in use. Please choose another. - + Η διεύθυνση MAC χρησιμοποιείται ήδη. Επιλέξτε κάποια άλλη. @@ -7090,7 +7100,7 @@ Please go to Emulation > Configure > System to regenerate your Console ID. You do not have enough permission to perform this action. - + Δεν διαθέτετε επαρκή δικαιώματα για να εκτελέσετε αυτήν την ενέργεια. @@ -7119,7 +7129,7 @@ They may have left the room. unknown - + άγνωστο @@ -7134,7 +7144,7 @@ They may have left the room. custom - + προσαρμοσμένο @@ -7540,7 +7550,8 @@ They may have left the room. Would you like to migrate your data for use in Azahar? (This may take a while; The old data will not be deleted) - + Θέλετε να μεταφέρετε τα δεδομένα σας για χρήση στο Azahar? +(Αυτή η διαδικασία ενδέχεται να διαρκέσει αρκετή ώρα· τα παλιά δεδομένα δεν θα διαγραφούν) @@ -7549,7 +7560,7 @@ They may have left the room. Migration - + Μεταφορά @@ -7592,7 +7603,8 @@ They may have left the room. You can manually re-trigger this prompt by deleting the new user data directory: %1 - + Μπορείτε να εμφανίσετε ξανά αυτό το μήνυμα προτροπής διαγράφοντας τον νέο κατάλογο δεδομένων χρήστη: +%1 @@ -7600,7 +7612,10 @@ They may have left the room. If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: %1 - + Τα δεδομένα μεταφέρθηκαν επιτυχώς. + +Εάν θέλετε να εκκαθαρίσετε τα αρχεία που απέμειναν στην τοποθεσία των παλιών δεδομένων, μπορείτε να το κάνετε διαγράφοντας τον παρακάτω κατάλογο: +%1 diff --git a/dist/languages/es_ES.ts b/dist/languages/es_ES.ts index 4d4817877..9ff0a37a7 100644 --- a/dist/languages/es_ES.ts +++ b/dist/languages/es_ES.ts @@ -2292,9 +2292,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Configuración @@ -2385,7 +2385,7 @@ Would you like to ignore the error and continue? - + Test Probar @@ -2417,7 +2417,7 @@ Would you like to ignore the error and continue? - + Information Información @@ -2432,52 +2432,52 @@ Would you like to ignore the error and continue? [pulsa un botón] - + After pressing OK, tap the touchpad on the controller you want to track. Después de pulsar "Aceptar", toque el panel táctil del mando que desea usar. - + [press touchpad] [presione el panel táctil] - + Testing Probando - + Configuring Configurando - + Test Successful Prueba Exitosa - + Successfully received data from the server. Datos recibidos del servidor con éxito. - + Test Failed Prueba Fallida - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. No se han podido recibir datos válidos del servidor.<br>Asegúrese de qué el servidor esté configurado correctamente y que la dirección y el puerto son correctos. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. La prueba de UDP o la configuración de calibración está en marcha.<br>Por favor, espera a que éstas terminen. diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 73d32dee4..aa3f3768e 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -2285,9 +2285,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Konfiguroi @@ -2378,7 +2378,7 @@ Would you like to ignore the error and continue? - + Test Testi @@ -2410,7 +2410,7 @@ Would you like to ignore the error and continue? - + Information Informaatio @@ -2425,52 +2425,52 @@ Would you like to ignore the error and continue? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Testaus - + Configuring Konfigurointi - + Test Successful Testi Onnistui - + Successfully received data from the server. Tieto saatu palvelimelta onnistuneesti. - + Test Failed Testi Epäonnistui - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Sopivaa tietoa ei voitu vastaanottaa palvelimelta.<br>Varmista, että palvelin on asetettu oikein, ja että osoite ja portti ovat oikeat. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index ce182207b..5c34e7dd2 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -2292,9 +2292,9 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - - - + + + Configure Configurer @@ -2385,7 +2385,7 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - + Test Test @@ -2417,7 +2417,7 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - + Information Information @@ -2432,52 +2432,52 @@ Souhaitez vous ignorer l'erreur et poursuivre ? [appuyez sur le bouton] - + After pressing OK, tap the touchpad on the controller you want to track. Après avoir appuyé sur OK, appuyez sur le pavé tactile de la manette que vous souhaitez traquer. - + [press touchpad] [appuyez sur le pavé tactile] - + Testing Test en cours - + Configuring Configuration - + Test Successful Test réussi - + Successfully received data from the server. Données reçues depuis le serveur avec succès. - + Test Failed Échec du test - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Impossible de recevoir des données valides depuis le serveur.<br>Vérifiez que le serveur est correctement configuré et que l'adresse et le port sont corrects. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Test UDP ou configuration de la calibration en cours.<br>Veuillez attendre qu'ils se terminent. diff --git a/dist/languages/hu_HU.ts b/dist/languages/hu_HU.ts index aaaf6a96a..c3824bd23 100644 --- a/dist/languages/hu_HU.ts +++ b/dist/languages/hu_HU.ts @@ -2284,9 +2284,9 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - - - + + + Configure Konfigurálás @@ -2377,7 +2377,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - + Test Teszt @@ -2409,7 +2409,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - + Information Információ @@ -2424,52 +2424,52 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? [nyomj egy gombot] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Tesztelés - + Configuring Konfigurálás - + Test Successful Teszt sikeres - + Successfully received data from the server. Az adatok sikeresen beérkeztek a kiszolgálótól. - + Test Failed Teszt sikertelen - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nem lehetett érvényes adatot fogadni a szervertől. <br>Ellenőrizd, hogy a szerver megfelelően van-e beállítva, valamint a cím és a port helyes. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. diff --git a/dist/languages/id.ts b/dist/languages/id.ts index ba4a8392b..8ff58e96b 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -2286,9 +2286,9 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - - - + + + Configure Pengaturan @@ -2379,7 +2379,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - + Test Tes @@ -2411,7 +2411,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - + Information Informasi @@ -2426,52 +2426,52 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Pengujian - + Configuring Mengatur - + Test Successful Pengujian Berhasil - + Successfully received data from the server. Berhasil Menerima Data Dari Server. - + Test Failed Pengujian Gagal - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Tidak bisa menerima data valid dari server <br>Tolong pastikan bahwa server telah di atur dengan benar dan alamat serta port-nya sudah benar. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Pengaturan pengujian atau penyesuaian UDP sedang dalam proses.<br>Tolong tunggu sampai selesai. diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 49f43a353..a0edbeae0 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -1155,7 +1155,7 @@ Desideri ignorare l'errore e continuare? Disable Right Eye Rendering - Disattiva rendering occhio destro + Disabilita il rendering dell'occhio destro @@ -2257,7 +2257,7 @@ Desideri ignorare l'errore e continuare? Please select at least one layout option to cycle through. - Seleziona almeno un layout da includere nel ciclo. + Seleziona almeno un layout da includere nella rotazione. @@ -2292,9 +2292,9 @@ Desideri ignorare l'errore e continuare? - - - + + + Configure Configura @@ -2385,7 +2385,7 @@ Desideri ignorare l'errore e continuare? - + Test Test @@ -2417,7 +2417,7 @@ Desideri ignorare l'errore e continuare? - + Information Informazioni @@ -2432,52 +2432,52 @@ Desideri ignorare l'errore e continuare? [premi pulsante] - + After pressing OK, tap the touchpad on the controller you want to track. Dopo aver premuto OK, tocca il touchpad sul controller che desideri tracciare. - + [press touchpad] [premi il touchpad] - + Testing Prova - + Configuring Configurazione - + Test Successful Test riuscito - + Successfully received data from the server. Dati ricevuti con successo dal server. - + Test Failed Test fallito - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Impossibile ricevere informazioni valide dal server.<br>Verifica che il server sia configurato correttamente e che l'indirizzo e la porta siano corretti. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Test UDP o configurazione della calibrazione in corso.<br>Si prega di attendere fino al loro termine. @@ -4231,7 +4231,7 @@ Verifica l'installazione di FFmpeg usata per la compilazione. Warning - Attenzione + Attenzione @@ -4241,7 +4241,12 @@ When run this way, the app may be missing certain functionality such as camera e It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + L'eseguibile `azahar` è stato avviato direttamente invece che tramite il bundle Azahar.app. + +Quando avviata in questo modo, all'app potrebbero mancare alcune funzionalità, come l'emulazione della fotocamera. + +Si consiglia invece di avviare Azahar utilizzando il comando `open`, ad esempio: +`open ./Azahar.app` @@ -4251,7 +4256,7 @@ It is recommended to instead run Azahar using the `open` command, e.g.: Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - L'inizializzazione di Vulkan ha fallito durante il boot.<br/>La tua GPU potrebbe non supportare Vulkan 1.1, oppure non hai i driver più recenti. + L'inizializzazione di Vulkan è fallita durante l'avvio.<br/>La tua GPU potrebbe non supportare Vulkan 1.1, oppure non stai usando i driver più recenti. @@ -4828,7 +4833,7 @@ Usali a tuo rischio e pericolo. Cannot create specified screenshot directory. Screenshot path is set back to its default value. - Impossibile creare la cartella screenshot specificata. Il percorso è stato ripristinato a quello predefinito. + Impossibile creare la cartella degli screenshot specificata. Il percorso è stato ripristinato a quello predefinito. diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 19522b7d8..1e5141f11 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -2291,9 +2291,9 @@ Would you like to ignore the error and continue? - - - + + + Configure 設定 @@ -2384,7 +2384,7 @@ Would you like to ignore the error and continue? - + Test テスト @@ -2416,7 +2416,7 @@ Would you like to ignore the error and continue? - + Information 情報 @@ -2431,52 +2431,52 @@ Would you like to ignore the error and continue? [ボタン入力] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing テスト中... - + Configuring 設定中... - + Test Successful テスト成功 - + Successfully received data from the server. サーバーからデータを正常に受信しました - + Test Failed テスト失敗 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. サーバーから有効なデータを受信できませんでした。<br>サーバーが正しく設定されていることを確認した後、アドレスとポートが正しいことを確認してください - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDPテスト中またはキャリブレーション設定中です。完了までお待ちください diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 706764ff9..28bd61b38 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -2286,9 +2286,9 @@ Would you like to ignore the error and continue? - - - + + + Configure 설정 @@ -2379,7 +2379,7 @@ Would you like to ignore the error and continue? - + Test 테스트 @@ -2411,7 +2411,7 @@ Would you like to ignore the error and continue? - + Information 정보 @@ -2426,52 +2426,52 @@ Would you like to ignore the error and continue? [버튼 누르기] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing 테스팅 - + Configuring 설정중 - + Test Successful 테스트 성공 - + Successfully received data from the server. 서버로 부터 데이터를 받은데 성공했습니다. - + Test Failed 테스트 실패 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 서버로 부터 유효한 정보를 받지 못했습니다.<br>서버가 올바르게 설정됐는지 주소와 포트가 정확한지 확인하세요. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP Test 또는 캘리브레이션 설정이 진행중입니다.<br>설정이 끝날때까지 기다려주세요. diff --git a/dist/languages/lt_LT.ts b/dist/languages/lt_LT.ts index 193e7f029..81388699c 100644 --- a/dist/languages/lt_LT.ts +++ b/dist/languages/lt_LT.ts @@ -2283,9 +2283,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Konfigūruoti @@ -2376,7 +2376,7 @@ Would you like to ignore the error and continue? - + Test Testuoti @@ -2408,7 +2408,7 @@ Would you like to ignore the error and continue? - + Information Informacija @@ -2423,52 +2423,52 @@ Would you like to ignore the error and continue? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Testuojama - + Configuring Konfigūruojama - + Test Successful Testavimas pavyko - + Successfully received data from the server. Sėkmingai gauti duomenys iš serverio. - + Test Failed Testavimas nepavyko - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nepavyko gauti duomenų iš serverio. <br> Prašome patikrinti, ar serveris yra teisingai sukonfigūruotas ir adresas / įvadas yra teisingi. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Vyksta UDP testavimas ar kalibracija. <br> Prašome palaukti kol procesai bus užbaigti. diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 25e9cebd7..ddb05216f 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -2285,9 +2285,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Konfigurer @@ -2378,7 +2378,7 @@ Would you like to ignore the error and continue? - + Test Test @@ -2410,7 +2410,7 @@ Would you like to ignore the error and continue? - + Information Informasjon @@ -2425,52 +2425,52 @@ Would you like to ignore the error and continue? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Testing - + Configuring Konfigurerer - + Test Successful Test Vellykket - + Successfully received data from the server. Mottatt data fra serveren vellykket. - + Test Failed Test Mislyktes - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kunne ikke motta gyldige data fra serveren.<br>Kontroller at serveren er riktig konfigurert, og adressen og porten er riktige. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP Test eller kalibreringskonfigurasjon pågår.<br>Vennligst vent på at de skal fullføre. diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index ab5b41965..24acb0061 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -2286,9 +2286,9 @@ Wilt u de fout negeren en doorgaan? - - - + + + Configure Configureren @@ -2379,7 +2379,7 @@ Wilt u de fout negeren en doorgaan? - + Test Test @@ -2411,7 +2411,7 @@ Wilt u de fout negeren en doorgaan? - + Information Informatie @@ -2426,52 +2426,52 @@ Wilt u de fout negeren en doorgaan? [druk op een knop]. - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Testen - + Configuring Configureren - + Test Successful Test Geslaagd - + Successfully received data from the server. Gegevens met succes ontvangen van de server. - + Test Failed Test Mislukt - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kan geen valide data ontvangen van de server. <br> Verifieer dat de server correct opgezet is en dat het adres en de port correct zijn. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP Test of calibratie is bezig.<br> Wacht tot deze klaar zijn. diff --git a/dist/languages/pl_PL.ts b/dist/languages/pl_PL.ts index 826fdfb11..c45f22cb4 100644 --- a/dist/languages/pl_PL.ts +++ b/dist/languages/pl_PL.ts @@ -808,12 +808,12 @@ Czy chcesz zignorować błąd i kontynuować? <html><head/><body><p>Toggles the unique data console type (Old 3DS ↔ New 3DS) to be able to download the opposite system firmware type from system settings.</p></body></html> - + <html><head/><body><p>Przełącza unikalny typ konsoli danych (Old 3DS ↔ New 3DS), aby umożliwić pobranie oprogramowania układowego przeciwnego typu z ustawień systemowych.</p></body></html> Toggle unique data console type - + Przełącz typ indywidualnych danych konsoli @@ -2044,7 +2044,7 @@ Czy chcesz zignorować błąd i kontynuować? Customize layout cycling - + Dostosuj układ cyklu @@ -2197,67 +2197,67 @@ Czy chcesz zignorować błąd i kontynuować? Configure Layout Cycling - + Konfiguracja układu cyklu Screen Layout Cycling Customization - + Dostosowanie cyklu ekranu Select which screen layout options should be cycled with the "Toggle Screen Layout" hotkey - + Wybierz opcje układu ekranu, które mają być przełączane za pomocą skrótu klawiszowego „Przełącz układ ekranu”. Use Global Value - + Użyj ogólną wartość Default - Domyślny + Domyślny Single Screen - + Pojedynczy ekran Large Screen - Duży Ekran + Duży Ekran Side by Side - Obok Siebie + Obok Siebie Separate Windows - + Oddzielne okna Hybrid - + Hybrydowy Custom - Własny + Własny No Layout Selected - + Brak wybranego układu Please select at least one layout option to cycle through. - + Wybierz co najmniej jedną opcję układu, aby przełączać się między nimi. @@ -2292,9 +2292,9 @@ Czy chcesz zignorować błąd i kontynuować? - - - + + + Configure Skonfiguruj... @@ -2326,12 +2326,12 @@ Czy chcesz zignorować błąd i kontynuować? Map touchpads on controllers like the DualSense directly to touch - + Mapuj touchpady na kontrolerach takich jak DualSense bezpośrednio na ekran dotykowy. Use controller touchpad - + Użyj panelu dotykowego kontrolera @@ -2385,7 +2385,7 @@ Czy chcesz zignorować błąd i kontynuować? - + Test Przetestuj @@ -2417,7 +2417,7 @@ Czy chcesz zignorować błąd i kontynuować? - + Information Informacje @@ -2432,52 +2432,52 @@ Czy chcesz zignorować błąd i kontynuować? [naciśnij przycisk] - + After pressing OK, tap the touchpad on the controller you want to track. - + Po naciśnięciu przycisku OK dotknij panelu dotykowego kontrolera, który chcesz śledzić. - + [press touchpad] - + [naciśnij touchpad] - + Testing Testowanie - + Configuring Konfiguracja - + Test Successful Test Udany - + Successfully received data from the server. Poprawnie odebrano dane z serwera. - + Test Failed Test Nieudany - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nie udało się otrzymać danych z serwera.<br>Sprawdź czy twój serwer jest prawidłowo ustawiony oraz czy podałeś prawidłowy adres i port. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Test UDP lub kalibracja jest właśnie wykonywana. <br>Poczekaj, aż zostaną zakończone. @@ -4233,7 +4233,7 @@ Sprawdź instalację FFmpeg używaną do kompilacji. Warning - Ostrzeżenie + Ostrzeżenie @@ -4243,7 +4243,12 @@ When run this way, the app may be missing certain functionality such as camera e It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + Plik wykonywalny „azahar” jest uruchamiany bezpośrednio, a nie za pośrednictwem pakietu Azahar.app. + +W przypadku uruchomienia w ten sposób aplikacja może nie posiadać niektórych funkcji, takich jak emulacja aparatu. + +Zaleca się uruchamianie Azahar za pomocą polecenia "open”, np.: +"open ./Azahar.app” diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index bc7e6ac9c..1dde81f91 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -2292,9 +2292,9 @@ Gostaria de ignorar o erro e continuar? - - - + + + Configure Configurar @@ -2385,7 +2385,7 @@ Gostaria de ignorar o erro e continuar? - + Test Testar @@ -2417,7 +2417,7 @@ Gostaria de ignorar o erro e continuar? - + Information Informação @@ -2432,52 +2432,52 @@ Gostaria de ignorar o erro e continuar? [pressione o botão] - + After pressing OK, tap the touchpad on the controller you want to track. Após pressionar OK, toque no touchpad do controle que você deseja rastrear. - + [press touchpad] [pressione o touchpad] - + Testing Testando - + Configuring Configurando - + Test Successful Teste concluído com êxito - + Successfully received data from the server. Dados recebidos do servidor com êxito. - + Test Failed Falha no teste - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Não foi possível receber dados válidos do servidor.<br>Verifique se o servidor foi configurado corretamente e o endereço e porta estão corretos. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. O teste UDP ou a configuração de calibração está em curso.<br>Aguarde até a conclusão deles. @@ -4232,7 +4232,7 @@ Por favor, verifique a instalação do FFmpeg usada para compilação. Warning - + Aviso @@ -4242,7 +4242,12 @@ When run this way, the app may be missing certain functionality such as camera e It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + O executável `azahar` está sendo iniciado diretamente, em vez de ser através do pacote Azahar.app. + +Dessa forma, o aplicativo pode apresentar falhas em certas funcionalidades, como a emulação de câmera. + +Recomenda-se, em vez disso, iniciar o Azahar usando o comando open, por exemplo: +`open ./Azahar.app` diff --git a/dist/languages/ro_RO.ts b/dist/languages/ro_RO.ts index 55f7db548..30bdd17e9 100644 --- a/dist/languages/ro_RO.ts +++ b/dist/languages/ro_RO.ts @@ -2286,9 +2286,9 @@ Doriți să ignorați eroarea și să continuați? - - - + + + Configure Configurare @@ -2379,7 +2379,7 @@ Doriți să ignorați eroarea și să continuați? - + Test Test @@ -2411,7 +2411,7 @@ Doriți să ignorați eroarea și să continuați? - + Information Informații @@ -2426,52 +2426,52 @@ Doriți să ignorați eroarea și să continuați? [apăsați butonul] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Testând - + Configuring Configurând - + Test Successful Testare Reușită - + Successfully received data from the server. Date primite de la server cu succes. - + Test Failed Testare Eșuată - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nu s-au putut primi date valide la server.<br>Verificați dacă serverul este configurat în mod corect și dacă adresa și portul sunt corecte. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Proba UDP sau configurarea de calibrare este în curs.<br>Așteptați terminarea acestora. diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 28ec15fa5..a32154e16 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -2292,9 +2292,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Настройка @@ -2385,7 +2385,7 @@ Would you like to ignore the error and continue? - + Test Проверить @@ -2417,7 +2417,7 @@ Would you like to ignore the error and continue? - + Information Информация @@ -2432,52 +2432,52 @@ Would you like to ignore the error and continue? [нажмите кнопку] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Проверка - + Configuring Настройка - + Test Successful Проверка прошла успешно - + Successfully received data from the server. Данные с сервера успешно получены. - + Test Failed Проверка не пройдена - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Не удалось получить корректные данные от сервера.<br>Убедитесь в правильной настройке сервера, в правильности адреса и порта. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Выполняется проверка UDP или настройка калибровки.<br>Дождитесь окончания. diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index eb772402a..71ca19c60 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -2292,9 +2292,9 @@ Vill du ignorera felet och fortsätta? - - - + + + Configure Konfigurera @@ -2385,7 +2385,7 @@ Vill du ignorera felet och fortsätta? - + Test Testa @@ -2417,7 +2417,7 @@ Vill du ignorera felet och fortsätta? - + Information Information @@ -2432,52 +2432,52 @@ Vill du ignorera felet och fortsätta? [tryck på knappen] - + After pressing OK, tap the touchpad on the controller you want to track. När du har tryckt på OK trycker du på pekplattan på den kontroller som du vill spåra. - + [press touchpad] [tryck på pekplatta] - + Testing Testar - + Configuring Konfigurering - + Test Successful Testet lyckades - + Successfully received data from the server. Har tagit emot data från servern. - + Test Failed Testet misslyckades - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kunde inte ta emot giltiga data från servern.<br>Kontrollera att servern är korrekt konfigurerad och att adress och port är korrekta. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-test eller kalibreringskonfiguration pågår.<br>Vänta tills de är klara. @@ -4233,7 +4233,7 @@ Kontrollera din FFmpeg-installation som användes för kompilering. Warning - Varning + Varning @@ -4243,7 +4243,12 @@ When run this way, the app may be missing certain functionality such as camera e It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + Den körbara filen `azahar` körs direkt istället för via Azahar.app-paketet. + +När appen körs på detta sätt kan vissa funktioner, såsom kameraemulering, saknas. + +Det rekommenderas istället att köra Azahar med kommandot `open`, t.ex.: +`open ./Azahar.app` diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index f2cc8eda9..3ddc4f815 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -2292,9 +2292,9 @@ Hataya aldırmayıp devam etmek ister misiniz? - - - + + + Configure Yapılandır @@ -2385,7 +2385,7 @@ Hataya aldırmayıp devam etmek ister misiniz? - + Test Test @@ -2417,7 +2417,7 @@ Hataya aldırmayıp devam etmek ister misiniz? - + Information Bilgi @@ -2432,52 +2432,52 @@ Hataya aldırmayıp devam etmek ister misiniz? [butona basın] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Test Ediliyor - + Configuring Ayarlanıyor - + Test Successful Test Başarılı - + Successfully received data from the server. Veri sunucudan başarıyla alındı. - + Test Failed Test Başarısız - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Sunucudan geçerli veri alınamıyor.<br>Lütfen sunucunun düzgün kurulduğundan, adres ve portun doğru girildiğinden emin olun. - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP Testi ya da kalibrasyonu hala devam ediyor.<br> Lütfen bitmesini bekleyin. diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 28443940b..5da5fbee5 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -2285,9 +2285,9 @@ Would you like to ignore the error and continue? - - - + + + Configure Cấu hình @@ -2378,7 +2378,7 @@ Would you like to ignore the error and continue? - + Test Kiểm tra @@ -2410,7 +2410,7 @@ Would you like to ignore the error and continue? - + Information Thông tin @@ -2425,52 +2425,52 @@ Would you like to ignore the error and continue? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing Đang kiểm tra - + Configuring Thiết lập - + Test Successful Kiểm tra thành công - + Successfully received data from the server. Đã nhận dữ liệu từ máy chủ thành công. - + Test Failed Kiểm thử thất bại - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Không thể nhận dữ liệu nào từ máy chủ.<br>Vui lòng kiểm tra máy chủ đã được thiết đặt đúng, kiểm tra địa chỉ và cổng kết nối là chính xác. - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Kiểm tra UDP hoặc quá trình đang hiệu chuẩn.<br>Vui lòng đợi quá trình này hoàn tất. diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 897a76a20..47cc54ee8 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -2292,9 +2292,9 @@ Would you like to ignore the error and continue? - - - + + + Configure 设置 @@ -2385,7 +2385,7 @@ Would you like to ignore the error and continue? - + Test 测试 @@ -2417,7 +2417,7 @@ Would you like to ignore the error and continue? - + Information 信息 @@ -2432,52 +2432,52 @@ Would you like to ignore the error and continue? [请按一个键] - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing 测试中 - + Configuring 设置中 - + Test Successful 测试成功 - + Successfully received data from the server. 已成功从服务器接收数据。 - + Test Failed 测试失败 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 无法从服务器接收数据。<br>请验证服务器是否正在运行,以及地址和端口是否配置正确。 - + Azahar Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP 测试或触摸校准正在进行中。<br>请等待它们完成。 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index c98038426..9d55706f5 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -2286,9 +2286,9 @@ Would you like to ignore the error and continue? - - - + + + Configure 設定 @@ -2379,7 +2379,7 @@ Would you like to ignore the error and continue? - + Test 測試 @@ -2411,7 +2411,7 @@ Would you like to ignore the error and continue? - + Information 說明 @@ -2426,52 +2426,52 @@ Would you like to ignore the error and continue? - + After pressing OK, tap the touchpad on the controller you want to track. - + [press touchpad] - + Testing 測試中 - + Configuring 設定中 - + Test Successful 測試成功 - + Successfully received data from the server. 已成功從伺服器接收資料。 - + Test Failed 測試失敗 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 無法從伺服器接收有效資料。<br>請檢查伺服器,並確認地址和連接埠輸入正確。 - + Azahar - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. 正在進行 UDP 測試或校正。<br>請等候其完成。 diff --git a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml index e2a923706..c19261dc7 100644 --- a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml +++ b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml @@ -66,10 +66,14 @@ Concedir permís Saltar-se la concessió del permís de notificacions? Azahar no et podrà notificar sobre informació important. + Falten permisos + Azahar necessita permís per a administrar fitxers en este dispositiu per a poder emmagatzemar i administrar les dades d\'usuari de 3DS.\n\nPer favor, atorgue el permís abans de continuar. Càmera Concedix el permís de càmera per a emular la càmera de la 3DS. Micròfon Concedix el permís de micròfon per a emular el micròfon de la 3DS. + Sistema de fitxers + Concedix el permís de sistema d\'arxius a baix per a permetre que Azahar emmagatzeme arxius. Permís denegat Vols saltar la selecció de la carpeta d\'aplicacions? El software no es mostrarà a la llista d\'aplicacions si no se selecciona cap carpeta. @@ -89,6 +93,9 @@ No pots saltar la configuració de la carpeta d\'usuari Aquest pas és necessari perquè Azahar funcione. Selecciona un directori i després podràs continuar. Has perdut els permisos d\'escriptura en el teu directori de dades d\'usuari, on es guarden les partides guardades i altra informació. Això pot ocórrer després d\'algunes actualitzacions d\'aplicacions o d\'Android. Torna a seleccionar el directori per a recuperar els permisos i poder continuar. + Selecció no vàlida + La selecció del directori d\'usuari no és vàlida.\nTorna a seleccionar el directori d\'usuari, assegurant-te de navegar fins ell des de l\'arrel de l\'emmagatzematge del dispositiu. + Azahar ha perdut el permís per a administrar fitxers en este dispositiu. Això pot ocórrer després d\'alguna actualització de l\'aplicació o d\'Android. Torna a concedir este permís en la següent pantalla per a continuar usant l\'aplicació. Configuració de tema Configura les teues preferències de temes per a Azahar. Establir tema @@ -100,9 +107,18 @@ Acabats d\'afegir Instal·lats + + Mapatge de Comandament Automàtic + Aplica l\'assignació de comandament estàndard per a tots els botons i eixos + Pressiona este botó en el teu comandament! + Botons de 3DS amb el botó A ressaltat + Netejar Totes les Assignacions + Això eliminarà totes els assignacions del comandament actual. Pad circular Palanca C Tecles de drecera + Si la tecla \"Habilitar tecles d\'accés ràpid\" està assignada, s\'ha de pressionar eixa tecla a més de la tecla d\'accés ràpid assignada + Habilitar tecles d\'accés ràpid Botons de darrere Botó de darrere Pad de control @@ -110,6 +126,8 @@ És possible que alguns controladors no puguen assignar el D-pad com un eix. Si aquest és el cas, utilitza la secció D-Pad (botons). D-Pad (Botó) Assigna només el D-pad a aquests si tens problemes amb les assignacions de botons del D-Pad (Eix). + Eix Vertical + Eix Horitzontal Amunt Avall Esquerra @@ -118,6 +136,8 @@ Pulsa o mou un botó/palanca. Assignació de botons Prem o mou una entrada per enllaçar-la a %1$s. + Pressiona A DALT en el teu joystick. + Pressiona DRETA en el teu joystick. HOME Intercanviar Pantalles Turbo @@ -156,6 +176,8 @@ Nom d\'usuari/a Mode New 3DS Usar Applets LLE (si están instal·lades) + Aplicar modificació de regió lliure a les aplicacions instal·lades. + Modifica la regió de les aplicacions instal·lades perquè siguen de regió lliure, de manera que sempre apareguen en el menú Home. Habilite els mòduls LLE necessaris per a les funcions en línia (si estan instal·lats) Habilita els mòduls LLE necessaris per al mode multijugador en línia, accés a la eShop, etc. Rellotge @@ -211,23 +233,30 @@ Usa SPIR-V en vez de GLSL per a emetre el fragment de ombrejador utilitzat per a emular PICA. Desativar l\'optimitzador SPIR-V Desactiva la passada d\'optimització SPIR-V reduint considerablement el quequeig i afectant poc el rendiment. + Activar compilació de ombrejadors asíncrona Compila els ombrejats en segón pla per a reduir les aturades durant la partida. S\'esperen errors gràfics temporals quan estigue activat. Filtre Linear Activa el filtre linear, que fa que els gràfics del joc es vegen més suaus. + Escalat a múltiples sencers + Escala les pantalles amb un multiplicador enter de la pantalla original de 3DS. Per a dissenys amb dos grandàries de pantalla diferents, la pantalla més gran s\'escala amb un multiplicador enter. Filtre de Textures Millora l\'aspecte visual de les aplicacions aplicant un filtre a les textures. Els filtres compatibles són Anime4K, Ultrafast, Bicubic, ScaleForce, xBRZ Freescale i MMPX. + Endarrerir fil de renderitzat del joc Retarda el fil de renderitzat del joc en enviar dades a la GPU. Ajuda a solucionar problemes de rendiment en les (poques) aplicacions amb velocitats de fotogrames dinàmiques. Avançat Mostreig de Textures Sobreescriu el filtre de mostreig usat en jocs. Pot ser útil en uns certs casos de jocs amb baix rendiment en pujar la resolució. Si no estàs segur, possa\'l en Controlat per Joc. Multiplicació Precisa Usa multiplicacions més precises en els ombrejos de Hardware, que podrien arreglar uns certs problemes gràfics. Quan s\'active, el rendiment es reduirà. + Activar Emulació Asíncrona de la GPU Usa un fil separat per a emular la GPU de manera asíncrona. Quan s\'active, el rendiment millorarà. Límit de velocitat Quan s\'active, la velocitat d\'emulació estarà limitada a un percentatge determinat de la velocitat normal. Quan es desactive, la velocitat d\'emulació no tindrà límit i la tecla d\'accés ràpid de velocitat turbo no funcionarà. Limitar percentatge de velocitat Especifica el valor al qual es limita la velocitat d\'emulació. Amb el valor per defecte del 100%, l\'emulació es limitarà a la velocitat normal. Els valors alts o baixos incrementaran o reduiran el límit de velocitat. + Ocultar les imatges de 3DS en Android + Evita que Android indexe les imatges de la càmera, captures de pantalla i textures personalitzades de la 3DS i les mostre en la galeria. És possible que hages de reiniciar el dispositiu després de canviar esta configuració perquè tinga efecte. Límit de Velocitat Turbo Límit de velocitat d\'emulació utilitzat mentres la tecla d\'accés ràpid turbo està activa. Expandir a l\'àrea de retallada @@ -249,10 +278,18 @@ S\'esperen errors gràfics temporals quan estigue activat.
Avís: Modificar estes configuracions reduiran la velocitat d\'emulació. Estereoscopia Mode 3D Estereoscòpic + Seleccione el mode 3D estereoscòpic per a renderitzat 3D. Els modes costat a costat són els més comuns en l\'actualitat. Els modes Anaglifo i Entrellaçat sempre s\'apliquen a totes les pantalles connectades. Profunditat Especifica el valor del regulador 3D. Hauria d\'estar posat a més enllà del 0% quan el Mode 3D Estereoscòpic està activat.\nNota: Els valors de profunditat superiors al 100% no són possibles en hardware real i poden causar problemes gràfics. Desactivar Renderitzat d\'Ull Dret Millora enormement el rendiment en algunes aplicacions, però pot provocar parpellejos en unes altres. + Intercanviar Ulls + Intercanvia quin ull es mostra en cada costat. Combinat amb el mode Costat a Costat, permet veure en 3D creuant els ulls! + Renderitzat 3D Estereoscòpic + Decidix si s\'activa el 3D estereoscòpic i en quines pantalles. Les opcions de pantalla única només són rellevants quan es connecten diverses pantalles. + Activat (totes les pantalles) + Activat (només pantalla principal) + Activat (només pantalla secundària) Cardboard VR Grandària de la pantalla Cardboard Escala la pantalla a un percentatge de la seua grandària original. @@ -277,6 +314,7 @@ S\'esperen errors gràfics temporals quan estigue activat. Volum Extensió d\'Àudio Estén l\'àudio per a reduir les aturades. Quan s\'active, la latència d\'àudio s\'incrementarà i reduirà un poc el rendiment. + Activar àudio en temps real Ajusta la velocitat de reproducció d\'àudio per a compensar les caigudes en la velocitat d\'emulació de quadres. Això significa que l\'àudio es reproduirà a velocitat completa fins i tot quan la velocitat de quadres del joc siga baixa. Pot causar problemes de desincronització d\'àudio. Dispositiu d\'entrada d\'àudio Mode d\'eixida de l\'àudio @@ -288,14 +326,19 @@ S\'esperen errors gràfics temporals quan estigue activat. Usa el hardware per a emular els ombrejadors de 3DS. Quan s\'active, el rendiment millorarà notablement. Velocitat de rellotge de la CPU Activar Sincronització Vertical + Sincronitza la freqüència de fotogrames del joc amb la freqüència d\'actualització del teu dispositiu. Pot causar latència d\'entrada addicional, però pot reduir el tearing en alguns casos. Renderitzador de depuració Arxiva informació addicional gràfica relacionada amb la depuració. Quan està activada, el rendiment dels jocs serà reduït considerablement + Guardar l\'eixida del registre en cada missatge Envia immediatament el registre de depuració a un arxiu. Usa-ho si Azahar falla i es talla l\'eixida del registre. + Inici diferit amb mòduls LLE Retarda l\'inici de l\'aplicació quan els mòduls LLE estan habilitats. Operacions asíncrones deterministes Fa que les operacions asíncrones siguen deterministes per a la depuració. Habilitar esta opció pot causar bloquejos. Activar Servidor RPC Activa el servidor RPC en el port 45987. Això permet llegir/escriure de manera remota la memòria emulada. + Canviar tipus de consola en les dades úniques de consola + Permet alternar el tipus de consola (Old 3DS ↔ New 3DS) per a poder descarregar el firmware del sistema oposat des de la configuració del sistema. Activar Ombreig JIT Usar el motor JIT en lloc de l\'intèrpret per a l\'emulació del ombrejador de software. @@ -306,6 +349,8 @@ S\'esperen errors gràfics temporals quan estigue activat. Horitzontal invertida Vertical Vertical invertida + Cicle d\'Estils + Selecciona quins estils es poden ciclar amb la tecla d\'accés ràpid Per omissió 16:9 4:3 @@ -326,7 +371,6 @@ S\'esperen errors gràfics temporals quan estigue activat. Més Informació Tancar Restablir valors de fàbrica - cartutxos de joc i/o títols instal·lats.]]> Per omissió Cap Auto @@ -413,6 +457,13 @@ S\'esperen errors gràfics temporals quan estigue activat. Per omissió Per defecte del sistema (espill) Estil Personalitzat + Color de fons + El color que apareix darrere de les pantalles durant l\'emulació, representat com un valor RGB. + Roig + Verd + Azul + Opacitat personalitzada de la segona pantalla + L\'opacitat de la segona pantalla de 3DS en usar la pantalla personalitzada. Útil si la segona pantalla esta posicionada en la part superior de la primera pantalla. Posició de Pantalla Xicoteta On hauria d\'aparéixer la pantalla xicoteta en relació amb la gran en Proporció de Pantalla Gran? Amunt a la dreta @@ -508,8 +559,13 @@ S\'esperen errors gràfics temporals quan estigue activat. Error Fatal Ha ocorregut un error fatal. Mira el registre per a més detalls.\nSeguir amb l\'emulació podria resultar en diversos penges i problemes. Aplicació cifrada no suportada + Mode de sistema no vàlid + Les aplicacions exclusives de New 3DS no es poden carregar sense activar el mode New 3DS. + Preparant ombrejadors + Construint%s + Jugar Desinstal·lar Aplicació @@ -532,11 +588,37 @@ S\'esperen errors gràfics temporals quan estigue activat. ID: Fitxer: Tipus: + Inserir Cartutx + Expulsar Cartutx + Mostrar informació de rendiment Informació de rendiment Activar informació de rendiment Configura la informació de rendiment + Mostrar FPS + Mostra els fotogrames per segon actuals. + Mostrar duració de fotogrames + Mostra la duració actual de cada fotograma. + Mostrar velocitat + Mostra el percentatge de velocitat d\'emulació actual. + Mostrar l\'ús de memòria de l\'aplicació + Mostra la quantitat de memòria RAM que esta usant l\'emulador. + Mostrar memòria disponible + Mostra la quantitat de memòria RAM que esta disponible. + Mostrar la temperatura de la bateria + Mostra la temperatura actual de la bateria en Celsius i Fahrenheit. + Posició de la informació + Tria on la informació de rendiment serà mostrada en la pantalla. + Dalt a l\'esquerra + Dalt a la dreta + Avall a l\'esquerra + Avall a la dreta + Dalt al centre + Avall al centre + Fons de la informació + Agrega un fons darrere de la informació per a fer-la més llegible. + Trucs Afegir trucs @@ -639,6 +721,7 @@ S\'esperen errors gràfics temporals quan estigue activat. De costat a costat + De costat a costat ample complet Anàglifo Entrellaçat Entrellaçat invers @@ -827,4 +910,19 @@ S\'esperen errors gràfics temporals quan estigue activat. Guardat ràpid - %1$tF %1$tR Guardat ràpid no disponible. - + + Comprimir + Comprimint... + Descomprimir + Descomprimint... + Compressió completada amb èxit. + Compressió no suportada amb este fitxer. + Este fitxer ja està comprimit. + Va fallar la compressió. + Descompressió completada amb èxit. + Descompressió no suportada amb este fitxer. + Este fitxer no està comprimit. + Va fallar la descompressió. + Les aplicacions ja instal·lades no es poden comprimir ni descomprimir. + + diff --git a/src/android/app/src/main/res/values-b+da+DK/strings.xml b/src/android/app/src/main/res/values-b+da+DK/strings.xml index ad918f0a7..562bec31b 100644 --- a/src/android/app/src/main/res/values-b+da+DK/strings.xml +++ b/src/android/app/src/main/res/values-b+da+DK/strings.xml @@ -355,7 +355,6 @@ Lær mere Luk Nulstil til standard - spilkassetter eller installerede titler.]]> Standard Ingen Auto diff --git a/src/android/app/src/main/res/values-b+es+ES/strings.xml b/src/android/app/src/main/res/values-b+es+ES/strings.xml index a77cf724a..985a249fe 100644 --- a/src/android/app/src/main/res/values-b+es+ES/strings.xml +++ b/src/android/app/src/main/res/values-b+es+ES/strings.xml @@ -463,8 +463,8 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Rojo Verde Azul - Opacidad personalizado de la segunda pantalla - La opacidad de la segunda pantalla de 3DS al usar el pantalla personalizado. Útil si la segunda pantalla ésta posicionada en la parte superior de la primera pantalla. + Opacidad personalizada de la segunda pantalla + La opacidad de la segunda pantalla de 3DS al usar la pantalla personalizada. Útil si la segunda pantalla ésta posicionada en la parte superior de la primera pantalla. Posición Pantalla Pequeña ¿Dónde debería aparecer la pantalla pequeña en relación con la grande en Disposicion de Pantalla Grande? Arriba a la Derecha diff --git a/src/android/app/src/main/res/values-b+pl+PL/strings.xml b/src/android/app/src/main/res/values-b+pl+PL/strings.xml index 460a12431..6f19169a5 100644 --- a/src/android/app/src/main/res/values-b+pl+PL/strings.xml +++ b/src/android/app/src/main/res/values-b+pl+PL/strings.xml @@ -107,9 +107,18 @@ Ostatnio dodane Zainstalowane + + Auto-mapowanie Kontrolera + Zastosuj standardowe mapowanie gamepada dla wszystkich przycisków i osi. + Naciśnij ten przycisk na kontrolerze! + Przycisk kierunkowy 3DS z zaznaczonym przyciskiem A + Wyczyść wszystkie mapowania + Spowoduje to usunięcie wszystkich bieżących mapowań kontrolera. Analog C-Stick Skróty klawiszowe + Jeśli opcja \"Włącz skrót klawiszowy” jest włączona, należy nacisnąć ten klawisz oprócz przypisanego skrótu klawiszowego. + Włącz skrót klawiszowy Spusty Spust Krzyżak @@ -327,6 +336,8 @@ Sprawia, że operacje asynchroniczne są deterministyczne dla debugowania. Włączenie tej opcji może powodować zawieszanie się gry. Włącz serwer RPC Włącza serwer RPC na porcie 45987. Pozwala to na zdalny odczyt/zapis pamięci gościa. Nie włączaj tej opcji, jeśli nie wiesz, co robisz. + Przełącz typ indywidualnych danych konsoli + Przełącza unikalny typ konsoli danych (Old 3DS ↔ New 3DS), aby umożliwić pobranie oprogramowania układowego przeciwnego typu z ustawień systemowych. Aktywuj Shader JIT Używa silnika JIT zamiast interpretera do programowej emulacji shaderów. @@ -337,6 +348,8 @@ Odwrócony widok Ekran Odwrócony Ekran + Układy do cyklu + Które układy są przełączane za pomocą skrótu do układu cyklu Domyślny 16:9 4:3 @@ -357,7 +370,7 @@ Dowiedz się więcej Zamknij Przywróć ustawienia domyślne - kartridże z grami lub zainstalowane tytuły.]]> + kartridże z grami lub zainstalowane tytuły.]]> Domyślne Brak Automatyczne diff --git a/src/android/app/src/main/res/values-b+pt+BR/strings.xml b/src/android/app/src/main/res/values-b+pt+BR/strings.xml index 1055be5e3..f71991483 100644 --- a/src/android/app/src/main/res/values-b+pt+BR/strings.xml +++ b/src/android/app/src/main/res/values-b+pt+BR/strings.xml @@ -3,7 +3,7 @@ Este software irá executar aplicativos feitos para o console portátil Nintendo 3DS. Nenhum jogo está incluído.\n\nAntes de começar a emulação, selecione uma pasta para armazenar os dados do usuário do Azahar.\n\nO que é isto:\nWiki - Dados e armazenamento do usuário do Azahar para Android Notificações do emulador Azahar 3DS - Azahar está Executando + Azahar em Execução Em seguida, você precisará selecionar uma pasta de Aplicativos. O Azahar exibirá todas as ROMs de 3DS dentro da pasta selecionada no aplicativo.\n\nROMs, atualizações e DLC no formato CIA precisarão ser instaladas separadamente clicando no ícone da pasta e selecionando Instalar CIA. @@ -23,8 +23,8 @@ Drivers personalizados não suportados O carregamento de driver personalizado não é suportado atualmente para este dispositivo.\nVerifique esta opção novamente no futuro para ver se o suporte foi adicionado! Nenhum arquivo de log encontrado - Selecione a Pasta de Aplicativos - Permitir que o Azahar preencha a lista de aplicativos + Selecionar Pasta de Aplicativos + Permite que o Azahar preencha a lista de aplicativos Sobre Um emulador de 3DS de código aberto Versão da compilação, créditos e mais @@ -107,9 +107,18 @@ Recentemente adicionado Instalado + + Mapeamento Automático do Controle + Aplicar mapeamento padrão do controle para todos os botões e eixos + Pressione este botão no seu controle! + Botões de face em diamante do 3DS com o botão A destacado + Limpar Todos os Mapeamentos + Isso removerá todos os mapeamentos de controle atuais. Analógico Direcional C-Stick Teclas de atalho + Se a tecla \"Ativar Atalho\" estiver mapeada, ela deve ser pressionada em conjunto com o atalho mapeado + Ativar Atalho Gatilhos Gatilho Direcional D-Pad @@ -228,6 +237,8 @@ Compila shaders em segundo plano para reduzir travamentos durante o jogo. Quando ativado, espere falhas gráficas temporárias Filtragem Linear Ativa a filtragem linear, que suaviza o visual do jogo. + Escala Inteira + Garante que a tela maior em todos os layouts tenha uma escala inteira de 240px de altura, correspondente à tela original do 3DS. Filtro de texturas Aprimora o visual dos aplicativos ao aplicar filtros às texturas. Os filtros compatíveis são: Anime4K Ultrafast, Bicúbico, ScaleForce, xBRZ Freescale e MMPX. Atrasar Thread de Renderização do Aplicativo @@ -325,6 +336,8 @@ Torna as operações assíncronas determinísticas para depuração. Ativar essa opção pode causar congelamentos. Ativar servidor RPC Ativa o servidor RPC na porta 45987. Isso permite ler e escrever remotamente a memória do sistema emulado. + Alternar tipo de console de dados únicos + Alterna o tipo de console de dados únicos (Old 3DS ↔ New 3DS) para permitir o download do firmware do sistema oposto nas configurações do sistema. Ativar Shader JIT Usa o mecanismo JIT em vez do interpretador para a emulação de shaders por software. @@ -335,6 +348,8 @@ Paisagem Reversa Retrato Retrato Reverso + Layouts para Alternar + Quais layouts são percorridos pela tecla de atalho \"Alternar Layout\" Padrão 16:9 4:3 @@ -355,7 +370,7 @@ Saber mais Fechar Redefinir para o Padrão - cartuchos de jogos ou títulos instalados.]]> + cartuchos de jogo ou títulos instalados.]]> Padrão Nenhum Automático @@ -472,7 +487,7 @@ Posição Y Largura Altura - Trocar Disposições + Alternar Layout Trocar telas Girar Tela para Posição Vertical Redefinir sobreposição diff --git a/src/android/app/src/main/res/values-b+tr+TR/strings.xml b/src/android/app/src/main/res/values-b+tr+TR/strings.xml index da2a72592..bf540bdbb 100644 --- a/src/android/app/src/main/res/values-b+tr+TR/strings.xml +++ b/src/android/app/src/main/res/values-b+tr+TR/strings.xml @@ -306,7 +306,6 @@ Daha Fazla Öğren Kapat Varsayılanlara Sıfırla - oyun kartuşlarınızı veya yüklü başlıklarınızıyeniden yüklemek için kılavuzları izleyin.]]> Varsayılan Otomatik Kapalı diff --git a/src/android/app/src/main/res/values-b+zh+CN/strings.xml b/src/android/app/src/main/res/values-b+zh+CN/strings.xml index f9c07aa30..74ad152d7 100644 --- a/src/android/app/src/main/res/values-b+zh+CN/strings.xml +++ b/src/android/app/src/main/res/values-b+zh+CN/strings.xml @@ -334,7 +334,6 @@ 了解更多 关闭 恢复默认 - 游戏卡带或已安装的应用。]]> 默认 自动 diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index a2d812a84..a49ae0cff 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -325,7 +325,6 @@ Mehr erfahren Schließen Auf Standard zurücksetzen - Karten oder Downloadtitel)erneut zu dumpen.]]> Standard Keine Auto diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 9c36dcc6f..93d855876 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -370,7 +370,7 @@ En savoir plus Fermer Par défaut - cartouches de jeu ou les jeux installés.]]> + cartouches ou titres installés.]]> Par défaut Aucun Auto diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 847041389..1e631674e 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -370,7 +370,7 @@ Scopri di più Chiudi Reimposta - cartuccie di gioco o titoli installati.]]> + cartuccie di gioco o titoli installati.]]> Standard Nessuno Auto diff --git a/src/android/app/src/main/res/values-sv/strings.xml b/src/android/app/src/main/res/values-sv/strings.xml index fdc0ba794..037bb610c 100644 --- a/src/android/app/src/main/res/values-sv/strings.xml +++ b/src/android/app/src/main/res/values-sv/strings.xml @@ -370,7 +370,7 @@ Lär dig mer Stäng Återställ till standard - spelkassetter igen eller installerade titlar.]]> + spelkassetter eller installerade titlarna.]]> Standard Ingen Auto From 64cb0b57fb6cb327f3ff31ac6b6b060e3c42e5f1 Mon Sep 17 00:00:00 2001 From: David Griswold Date: Fri, 20 Mar 2026 08:49:41 +0300 Subject: [PATCH 15/98] nullptr check on update_surface --- src/android/app/src/main/jni/emu_window/emu_window.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index 26cd2da56..881e54ece 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -25,9 +25,10 @@ bool EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) { render_window = surface; window_info.type = Frontend::WindowSystemType::Android; window_info.render_surface = surface; - window_width = ANativeWindow_getWidth(surface); - window_height = ANativeWindow_getHeight(surface); - + if (surface != nullptr) { + window_width = ANativeWindow_getWidth(surface); + window_height = ANativeWindow_getHeight(surface); + } StopPresenting(); OnFramebufferSizeChanged(); return true; From 8bcb8a225a5a6dbff4dbd8dfa71133c0b5d1ac46 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Fri, 20 Mar 2026 12:42:47 +0000 Subject: [PATCH 16/98] Updated translations via Transifex --- .../app/src/main/res/values-b+ca+ES+valencia/strings.xml | 1 + src/android/app/src/main/res/values-it/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml index c19261dc7..1a242f551 100644 --- a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml +++ b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml @@ -371,6 +371,7 @@ S\'esperen errors gràfics temporals quan estigue activat. Més Informació Tancar Restablir valors de fàbrica + cartutxos de joc i/o títols instal·lats.]]> Per omissió Cap Auto diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 1e631674e..46ee04737 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -80,7 +80,7 @@ Permessi Cartella dati (La cartella utente è richiesta)]]> - Concedere autorizzazioni opzionali per utilizzare specifiche funzionalità dell\'emulatore + Concedi permessi facoltativi per utilizzare funzionalità specifiche dell\'emulatore Aiuto Salta Annulla @@ -95,7 +95,7 @@ Hai perso i permessi di scrittura sulla tua cartella dei dati utente, dove sono memorizzati i salvataggi e altre informazioni. Questo può accadere dopo alcuni aggiornamenti app o Android. Seleziona nuovamente la cartella per ripristinare i permessi e continuare. Selezione non valida La cartella utente selezionata non è valida.\nSelezionala di nuovo assicurandoti di partire dalla memoria principale del dispositivo. - Azahar ha perso l\'autorizzazione a gestire i file su questo dispositivo. Ciò può accadere dopo alcuni aggiornamenti di app o Android. Si prega di concedere nuovamente questa autorizzazione nella schermata successiva per continuare a utilizzare l\'app. + Azahar ha perso l\'autorizzazione a gestire i file su questo dispositivo. Ciò può accadere dopo alcuni aggiornamenti dell\' app o di Android. Si prega di concedere nuovamente questa autorizzazione nella schermata successiva per continuare a utilizzare l\'app. Impostazioni tema Configura le impostazioni del tema di Azahar. Imposta tema From 04a543290a9ef45dbbd7e3499939baebf35c760f Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Fri, 20 Mar 2026 14:11:04 +0000 Subject: [PATCH 17/98] Added AI policy document --- .github/PULL_REQUEST_TEMPLATE.md | 2 ++ AI-POLICY.md | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 AI-POLICY.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d23923c94..66091f2c0 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,5 @@ +- [ ] I have read the [Azahar AI Policy document](https://github.com/azahar-emu/azahar/blob/master/AI-POLICY.md) and have disclosed any use of AI if applicable under those terms. + --- Preparing Shaders Building %s + Delete Shader Cache + Select which graphics API to delete the shader cache + Deleting shader cache for title, please wait… + Shader cache deleted Play From e8c75b4107c94e932241de6af648f6ee212e8ddf Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Sat, 11 Apr 2026 16:56:09 -0400 Subject: [PATCH 53/98] libretro: vulkan: wait before ticking (#2004) Ensure the scheduler worker thread has finished processing all dispatched command chunks before the rasterizer cache's garbage collector destroys sentenced surfaces. --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index abab77c4e..f772fa5f5 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -140,6 +140,7 @@ RasterizerVulkan::RasterizerVulkan(Memory::MemorySystem& memory, Pica::PicaCore& RasterizerVulkan::~RasterizerVulkan() = default; void RasterizerVulkan::TickFrame() { + scheduler.WaitWorker(); res_cache.TickFrame(); } From 336d871a7f5e85c35271e9542234213813746493 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 12 Apr 2026 19:57:55 +0200 Subject: [PATCH 54/98] core: Add CMAKE option to disable built-in keyblob (#2024) * core: Add CMAKE option to disable built-in keyblob * Additional assurance against accidental inclusion of default_keys.h * default_keys.h: Make default_keys_enc constexpr * default_keys.h: Make default_keys_enc_size constexpr --------- Co-authored-by: OpenSauce04 --- CMakeLists.txt | 2 + src/CMakeLists.txt | 3 ++ .../configuration/configure_system.cpp | 4 ++ src/core/CMakeLists.txt | 5 ++- src/core/hw/aes/key.cpp | 10 ++++- src/core/hw/default_keys.h | 10 ++++- src/core/hw/rsa/rsa.h | 14 +++++-- src/core/hw/unique_data.cpp | 39 ++++++++++++++++--- src/core/hw/unique_data.h | 2 + 9 files changed, 75 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f785b5d0c..28a9b115c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,6 +137,8 @@ option(ENABLE_SSE42 "Enable SSE4.2 optimizations on x86_64" ON) option(ENABLE_DEVELOPER_OPTIONS "Enable functionality targeted at emulator developers" OFF) +option(ENABLE_BUILTIN_KEYBLOB "Enable the inclusion of the default crypto keys blob" ON) + # Compile options CMAKE_DEPENDENT_OPTION(COMPILE_WITH_DWARF "Add DWARF debugging information" ${IS_DEBUG_BUILD} "MINGW" OFF) option(ENABLE_LTO "Enable link time optimization" ${DEFAULT_ENABLE_LTO}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0da8bbe3..15799c0c4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -183,6 +183,9 @@ endif() if(ENABLE_DEVELOPER_OPTIONS) add_compile_definitions(ENABLE_DEVELOPER_OPTIONS) endif() +if(ENABLE_BUILTIN_KEYBLOB) + add_compile_definitions(ENABLE_BUILTIN_KEYBLOB) +endif() add_subdirectory(common) add_subdirectory(core) diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp index 9ed8bebfa..6b47a28d1 100644 --- a/src/citra_qt/configuration/configure_system.cpp +++ b/src/citra_qt/configuration/configure_system.cpp @@ -670,12 +670,16 @@ void ConfigureSystem::RefreshSecureDataStatus() { return tr("Status: Loaded (Invalid Signature)"); case HW::UniqueData::SecureDataLoadStatus::RegionChanged: return tr("Status: Loaded (Region Changed)"); + case HW::UniqueData::SecureDataLoadStatus::CannotValidateSignature: + return tr("Status: Loaded (Cannot Validate Signature)"); case HW::UniqueData::SecureDataLoadStatus::NotFound: return tr("Status: Not Found"); case HW::UniqueData::SecureDataLoadStatus::Invalid: return tr("Status: Invalid"); case HW::UniqueData::SecureDataLoadStatus::IOError: return tr("Status: IO Error"); + case HW::UniqueData::SecureDataLoadStatus::NoCryptoKeys: + return tr("Status: Missing Crypto Keys"); default: return QString(); } diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 79ed4695a..ec7a45bfe 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -464,7 +464,6 @@ add_library(citra_core STATIC hw/aes/key.h hw/ecc.cpp hw/ecc.h - hw/default_keys.h hw/rsa/rsa.cpp hw/rsa/rsa.h hw/unique_data.cpp @@ -502,6 +501,10 @@ add_library(citra_core STATIC tracer/recorder.h ) +if (ENABLE_BUILTIN_KEYBLOB) + target_sources(citra_core PRIVATE hw/default_keys.h) +endif() + create_target_directory_groups(citra_core) target_link_libraries(citra_core PUBLIC citra_common PRIVATE audio_core network video_core) diff --git a/src/core/hw/aes/key.cpp b/src/core/hw/aes/key.cpp index 2e46de838..80aa84d36 100644 --- a/src/core/hw/aes/key.cpp +++ b/src/core/hw/aes/key.cpp @@ -18,7 +18,9 @@ #include "core/hle/service/fs/archive.h" #include "core/hw/aes/arithmetic128.h" #include "core/hw/aes/key.h" +#ifdef ENABLE_BUILTIN_KEYBLOB #include "core/hw/default_keys.h" +#endif // ENABLE_BUILTIN_KEYBLOB #include "core/hw/rsa/rsa.h" #include "core/loader/loader.h" @@ -130,8 +132,8 @@ std::array, NumDlpNfcKeyYs> dlp_nfc_key_y_slots; std::array nfc_secrets; AESIV nfc_iv; -AESKey otp_key; -AESIV otp_iv; +AESKey otp_key{}; +AESIV otp_iv{}; // gets xor'd with the mac address to produce the final iv AESIV dlp_checksum_mod_iv; @@ -297,6 +299,7 @@ std::istringstream GetKeysStream() { if (file.is_open()) { return std::istringstream(std::string(std::istreambuf_iterator(file), {})); } else { +#ifdef ENABLE_BUILTIN_KEYBLOB // The key data is encrypted in the source to prevent easy access to it for unintended // purposes. std::vector kiv(16); @@ -304,6 +307,9 @@ std::istringstream GetKeysStream() { CryptoPP::CBC_Mode::Decryption(kiv.data(), kiv.size(), kiv.data()) .ProcessData(reinterpret_cast(s.data()), default_keys_enc, s.size()); return std::istringstream(s); +#else + return std::istringstream(""); +#endif // ENABLE_BUILTIN_KEYBLOB } } diff --git a/src/core/hw/default_keys.h b/src/core/hw/default_keys.h index 554b74ae1..22fdcdc64 100644 --- a/src/core/hw/default_keys.h +++ b/src/core/hw/default_keys.h @@ -2,7 +2,13 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -unsigned char default_keys_enc[] = { +#pragma once + +#ifndef ENABLE_BUILTIN_KEYBLOB +#error Attempting to include default_keys.h, but ENABLE_BUILTIN_KEYBLOB is disabled. +#endif + +constexpr unsigned char default_keys_enc[] = { 0x4E, 0x81, 0xE9, 0x54, 0xCC, 0xDE, 0xFD, 0x56, 0x7D, 0xD2, 0x72, 0xE6, 0xD9, 0xCD, 0x8E, 0x11, 0xE1, 0x7F, 0x74, 0xF4, 0xFC, 0x54, 0xA6, 0xA4, 0x27, 0xC2, 0xD7, 0x50, 0xEA, 0xE7, 0xBE, 0xC9, 0xA7, 0x5E, 0xE0, 0x2E, 0x4A, 0xBE, 0xF5, 0xD5, 0x0D, 0x22, 0x76, 0x2E, 0xB6, 0x80, 0xD8, 0x54, @@ -468,4 +474,4 @@ unsigned char default_keys_enc[] = { 0x14, 0x79, 0xD0, 0xA8, 0x3C, 0xB3, 0x46, 0xC3, 0xDA, 0x6C, 0x0C, 0xEC, 0x2A, 0xB2, 0x9B, 0x21, 0xB2, 0xAD, 0x8C, 0x0C, 0x85, 0x9A, 0x8D, 0x7C, 0x10, 0xEA, 0x51, 0x1D, 0x2D, 0xDE, 0x7D, 0x8F}; -const long int default_keys_enc_size = sizeof(default_keys_enc); +constexpr long int default_keys_enc_size = sizeof(default_keys_enc); diff --git a/src/core/hw/rsa/rsa.h b/src/core/hw/rsa/rsa.h index b6dd2c1ca..54e944caa 100644 --- a/src/core/hw/rsa/rsa.h +++ b/src/core/hw/rsa/rsa.h @@ -1,4 +1,4 @@ -// Copyright 2020 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -14,7 +14,8 @@ class RsaSlot { public: RsaSlot() = default; RsaSlot(std::vector exponent, std::vector modulus) - : init(true), exponent(std::move(exponent)), modulus(std::move(modulus)) {} + : init_exponent(true), init_modulus(true), exponent(std::move(exponent)), + modulus(std::move(modulus)) {} std::vector ModularExponentiation(std::span message, int out_size_bytes = -1) const; @@ -25,11 +26,12 @@ public: explicit operator bool() const { // TODO(B3N30): Maybe check if exponent and modulus are vailid - return init; + return init_exponent && init_modulus; } void SetExponent(const std::vector& e) { exponent = e; + init_exponent = true; } const std::vector& GetExponent() const { @@ -38,6 +40,7 @@ public: void SetModulus(const std::vector& m) { modulus = m; + init_modulus = true; } const std::vector& GetModulus() const { @@ -46,6 +49,7 @@ public: void SetPrivateD(const std::vector& d) { private_d = d; + init_private_d = true; } const std::vector& GetPrivateD() const { @@ -53,7 +57,9 @@ public: } private: - bool init = false; + bool init_exponent = false; + bool init_modulus = false; + bool init_private_d = false; std::vector exponent; std::vector modulus; std::vector private_d; diff --git a/src/core/hw/unique_data.cpp b/src/core/hw/unique_data.cpp index 8d7ac9035..4ebc2091a 100644 --- a/src/core/hw/unique_data.cpp +++ b/src/core/hw/unique_data.cpp @@ -27,13 +27,17 @@ static MovableSedFull movable; static bool movable_signature_valid = false; bool SecureInfoA::VerifySignature() const { - return HW::RSA::GetSecureInfoSlot().Verify( - std::span(reinterpret_cast(&body), sizeof(body)), signature); + auto sec_info_slot = HW::RSA::GetSecureInfoSlot(); + return sec_info_slot && + sec_info_slot.Verify( + std::span(reinterpret_cast(&body), sizeof(body)), signature); } bool LocalFriendCodeSeedB::VerifySignature() const { - return HW::RSA::GetLocalFriendCodeSeedSlot().Verify( - std::span(reinterpret_cast(&body), sizeof(body)), signature); + auto lfcs_slot = HW::RSA::GetLocalFriendCodeSeedSlot(); + return lfcs_slot && + HW::RSA::GetLocalFriendCodeSeedSlot().Verify( + std::span(reinterpret_cast(&body), sizeof(body)), signature); } bool MovableSed::VerifySignature() const { @@ -42,6 +46,9 @@ bool MovableSed::VerifySignature() const { SecureDataLoadStatus LoadSecureInfoA() { if (secure_info_a.IsValid()) { + if (!HW::RSA::GetSecureInfoSlot()) { + return SecureDataLoadStatus::CannotValidateSignature; + } return secure_info_a_signature_valid ? SecureDataLoadStatus::Loaded : (secure_info_a_region_changed ? SecureDataLoadStatus::RegionChanged @@ -63,8 +70,11 @@ SecureDataLoadStatus LoadSecureInfoA() { return SecureDataLoadStatus::IOError; } - HW::AES::InitKeys(); secure_info_a_region_changed = false; + HW::AES::InitKeys(); + if (!HW::RSA::GetSecureInfoSlot()) { + return SecureDataLoadStatus::CannotValidateSignature; + } secure_info_a_signature_valid = secure_info_a.VerifySignature(); if (!secure_info_a_signature_valid) { // Check if the file has been region changed @@ -93,6 +103,9 @@ SecureDataLoadStatus LoadSecureInfoA() { SecureDataLoadStatus LoadLocalFriendCodeSeedB() { if (local_friend_code_seed_b.IsValid()) { + if (!HW::RSA::GetLocalFriendCodeSeedSlot()) { + return SecureDataLoadStatus::CannotValidateSignature; + } return local_friend_code_seed_b_signature_valid ? SecureDataLoadStatus::Loaded : SecureDataLoadStatus::InvalidSignature; } @@ -114,6 +127,9 @@ SecureDataLoadStatus LoadLocalFriendCodeSeedB() { } HW::AES::InitKeys(); + if (!HW::RSA::GetLocalFriendCodeSeedSlot()) { + return SecureDataLoadStatus::CannotValidateSignature; + } local_friend_code_seed_b_signature_valid = local_friend_code_seed_b.VerifySignature(); if (!local_friend_code_seed_b_signature_valid) { LOG_WARNING(HW, "LocalFriendCodeSeed_B signature check failed"); @@ -128,10 +144,17 @@ SecureDataLoadStatus LoadOTP() { return SecureDataLoadStatus::Loaded; } + auto is_all_zero = [](const auto& arr) { + return std::all_of(arr.begin(), arr.end(), [](auto x) { return x == 0; }); + }; + const std::string filepath = GetOTPPath(); HW::AES::InitKeys(); auto otp_keyiv = HW::AES::GetOTPKeyIV(); + if (is_all_zero(otp_keyiv.first) || is_all_zero(otp_keyiv.second)) { + return SecureDataLoadStatus::NoCryptoKeys; + } auto loader_status = otp.Load(filepath, otp_keyiv.first, otp_keyiv.second); if (loader_status != Loader::ResultStatus::Success) { @@ -169,6 +192,9 @@ SecureDataLoadStatus LoadOTP() { SecureDataLoadStatus LoadMovable() { if (movable.IsValid()) { + if (!HW::RSA::GetLocalFriendCodeSeedSlot()) { + return SecureDataLoadStatus::CannotValidateSignature; + } return movable_signature_valid ? SecureDataLoadStatus::Loaded : SecureDataLoadStatus::InvalidSignature; } @@ -193,6 +219,9 @@ SecureDataLoadStatus LoadMovable() { } HW::AES::InitKeys(); + if (!HW::RSA::GetLocalFriendCodeSeedSlot()) { + return SecureDataLoadStatus::CannotValidateSignature; + } movable_signature_valid = movable.VerifySignature(); if (!movable_signature_valid) { LOG_WARNING(HW, "movable.sed signature check failed"); diff --git a/src/core/hw/unique_data.h b/src/core/hw/unique_data.h index dd3a4bb8b..3b4f8efbe 100644 --- a/src/core/hw/unique_data.h +++ b/src/core/hw/unique_data.h @@ -136,10 +136,12 @@ enum class SecureDataLoadStatus { Loaded = 0, InvalidSignature = 1, RegionChanged = 2, + CannotValidateSignature = 3, NotFound = -1, Invalid = -2, IOError = -3, + NoCryptoKeys = -4, }; SecureDataLoadStatus LoadSecureInfoA(); From 6d230d28da3e1029bcd4c10baeb828c92b800aed Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Mon, 13 Apr 2026 12:52:27 +0200 Subject: [PATCH 55/98] Revert "qt: Try to fix Discord Rich Presence not updating correctly (#2013)" This reverts commit 5983a23d388dded09342ada9974e55b66e6c901e. --- src/core/core.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 6d7f7d009..0132e24bd 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -511,8 +511,6 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, Kernel::MemoryMode memory_mode, u32 num_cores) { LOG_DEBUG(HW_Memory, "initialized OK"); - is_powered_on = true; - memory = std::make_unique(*this); timing = std::make_unique(num_cores, Settings::values.cpu_clock_percentage.GetValue(), @@ -596,6 +594,8 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, LOG_DEBUG(Core, "Initialized OK"); + is_powered_on = true; + return ResultStatus::Success; } @@ -689,6 +689,9 @@ void System::RegisterImageInterface(std::shared_ptr im void System::Shutdown(bool is_deserializing) { + // Shutdown emulation session + is_powered_on = false; + gpu.reset(); if (!is_deserializing) { lle_modules.clear(); @@ -722,9 +725,6 @@ void System::Shutdown(bool is_deserializing) { SetInfoLEDColor({}); LOG_DEBUG(Core, "Shutdown OK"); - - // Shutdown emulation session - is_powered_on = false; } void System::Reset() { From 4dbe0fd497dba6c586045d52800402437e8d8553 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Mon, 13 Apr 2026 13:17:31 +0200 Subject: [PATCH 56/98] qt: Properly fix discord rich presence --- src/citra_qt/citra_qt.cpp | 27 +++++++++++++++------------ src/citra_qt/citra_qt.h | 2 +- src/citra_qt/discord.h | 6 +++--- src/citra_qt/discord_impl.cpp | 3 +-- src/citra_qt/discord_impl.h | 4 ++-- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 8c2d373c7..bf8d18bf9 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -366,7 +366,7 @@ GMainWindow::GMainWindow(Core::System& system_) #ifdef USE_DISCORD_PRESENCE SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); - discord_rpc->Update(); + discord_rpc->Update(false); #endif play_time_manager = std::make_unique(); @@ -975,7 +975,7 @@ void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) { OnPauseGame(); } else if (!emu_thread->IsRunning() && auto_paused && state == Qt::ApplicationActive) { auto_paused = false; - OnStartGame(); + OnResumeGame(false); } } if (UISettings::values.mute_when_in_background) { @@ -1530,7 +1530,7 @@ void GMainWindow::BootGame(const QString& filename) { ShowFullscreen(); } - OnStartGame(); + OnResumeGame(true); } void GMainWindow::ShutdownGame() { @@ -1583,7 +1583,7 @@ void GMainWindow::ShutdownGame() { OnCloseMovie(); #ifdef USE_DISCORD_PRESENCE - discord_rpc->Update(); + discord_rpc->Update(false); #endif #ifdef __unix__ Common::Linux::StopGamemode(); @@ -2508,7 +2508,7 @@ void GMainWindow::OnMenuRecentFile() { } } -void GMainWindow::OnStartGame() { +void GMainWindow::OnResumeGame(bool first_start) { qt_cameras->ResumeCameras(); PreventOSSleep(); @@ -2525,9 +2525,12 @@ void GMainWindow::OnStartGame() { play_time_manager->SetProgramId(game_title_id); play_time_manager->Start(); + if (first_start) { #ifdef USE_DISCORD_PRESENCE - discord_rpc->Update(); + discord_rpc->Update(true); #endif + } + #ifdef __unix__ Common::Linux::StartGamemode(); #endif @@ -2563,7 +2566,7 @@ void GMainWindow::OnPauseContinueGame() { if (emu_thread->IsRunning() && !system.frame_limiter.IsFrameAdvancing()) { OnPauseGame(); } else { - OnStartGame(); + OnResumeGame(false); } } } @@ -2865,6 +2868,7 @@ void GMainWindow::OnConfigure() { #ifdef USE_DISCORD_PRESENCE if (UISettings::values.enable_discord_presence.GetValue() != old_discord_presence) { SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); + discord_rpc->Update(system.IsPoweredOn()); } #endif #ifdef __unix__ @@ -3032,7 +3036,7 @@ void GMainWindow::OnCloseMovie() { } if (was_running) { - OnStartGame(); + OnResumeGame(false); } } @@ -3054,7 +3058,7 @@ void GMainWindow::OnSaveMovie() { } if (was_running) { - OnStartGame(); + OnResumeGame(false); } } @@ -3098,7 +3102,7 @@ void GMainWindow::OnCaptureScreenshot() { screenshot_window->CaptureScreenshot( UISettings::values.screenshot_resolution_factor.GetValue(), QString::fromStdString(path)); - OnStartGame(); + OnResumeGame(false); } } @@ -3501,7 +3505,7 @@ void GMainWindow::OnStopVideoDumping() { ShutdownGame(); } else if (game_paused_for_dumping) { game_paused_for_dumping = false; - OnStartGame(); + OnResumeGame(false); } }); future_watcher->setFuture(future); @@ -4235,7 +4239,6 @@ void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) { } else { discord_rpc = std::make_unique(); } - discord_rpc->Update(); } #endif diff --git a/src/citra_qt/citra_qt.h b/src/citra_qt/citra_qt.h index f0092cc19..01dcaabfb 100644 --- a/src/citra_qt/citra_qt.h +++ b/src/citra_qt/citra_qt.h @@ -231,7 +231,7 @@ private: void ShowFFmpegErrorMessage(); private slots: - void OnStartGame(); + void OnResumeGame(bool first_start); void OnRestartGame(); void OnPauseGame(); void OnPauseContinueGame(); diff --git a/src/citra_qt/discord.h b/src/citra_qt/discord.h index a867cc4d6..37d800b71 100644 --- a/src/citra_qt/discord.h +++ b/src/citra_qt/discord.h @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -11,7 +11,7 @@ public: virtual ~DiscordInterface() = default; virtual void Pause() = 0; - virtual void Update() = 0; + virtual void Update(bool is_powered_on) = 0; }; class NullImpl : public DiscordInterface { @@ -19,7 +19,7 @@ public: ~NullImpl() = default; void Pause() override {} - void Update() override {} + void Update(bool is_powered_on) override {} }; } // namespace DiscordRPC diff --git a/src/citra_qt/discord_impl.cpp b/src/citra_qt/discord_impl.cpp index bef83c3b4..ed8ea6081 100644 --- a/src/citra_qt/discord_impl.cpp +++ b/src/citra_qt/discord_impl.cpp @@ -30,12 +30,11 @@ void DiscordImpl::Pause() { Discord_ClearPresence(); } -void DiscordImpl::Update() { +void DiscordImpl::Update(bool is_powered_on) { s64 start_time = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()) .count(); std::string title; - const bool is_powered_on = system.IsPoweredOn(); if (is_powered_on) { system.GetAppLoader().ReadTitle(title); } diff --git a/src/citra_qt/discord_impl.h b/src/citra_qt/discord_impl.h index 25bee0696..f2b94ad16 100644 --- a/src/citra_qt/discord_impl.h +++ b/src/citra_qt/discord_impl.h @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -18,7 +18,7 @@ public: ~DiscordImpl() override; void Pause() override; - void Update() override; + void Update(bool is_powered_on) override; private: const Core::System& system; From 727377c012e4dbe3fe162e6ca423942fdd599e94 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Mon, 13 Apr 2026 13:41:37 +0200 Subject: [PATCH 57/98] discord rpc: Change how info is displayed --- src/citra_qt/discord_impl.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/citra_qt/discord_impl.cpp b/src/citra_qt/discord_impl.cpp index ed8ea6081..3a79c0c25 100644 --- a/src/citra_qt/discord_impl.cpp +++ b/src/citra_qt/discord_impl.cpp @@ -34,9 +34,17 @@ void DiscordImpl::Update(bool is_powered_on) { s64 start_time = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()) .count(); + auto truncate = [](const std::string& str, std::size_t maxLen = 128) -> std::string { + if (str.length() <= maxLen) { + return str; + } + return str.substr(0, maxLen - 3) + "..."; + }; + std::string title; if (is_powered_on) { system.GetAppLoader().ReadTitle(title); + title = truncate("Playing: " + title); } DiscordRichPresence presence{}; @@ -44,9 +52,6 @@ void DiscordImpl::Update(bool is_powered_on) { presence.largeImageText = "An open source emulator for the Nintendo 3DS"; if (is_powered_on) { presence.state = title.c_str(); - presence.details = "Currently in game"; - } else { - presence.details = "Not in game"; } presence.startTimestamp = start_time; Discord_UpdatePresence(&presence); From 1edc5de18e91971878234da0dbd693041ca87905 Mon Sep 17 00:00:00 2001 From: bug <45903641+inssekt@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:49:31 +0100 Subject: [PATCH 58/98] android: Stop emulation state if activity destroyed and fix relaunching from intents (#2000) --- .../citra_emu/activities/EmulationActivity.kt | 24 +++++++++++++++++++ .../citra_emu/fragments/EmulationFragment.kt | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt index ba3156754..957b98611 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt @@ -145,6 +145,30 @@ class EmulationActivity : AppCompatActivity() { NativeLibrary.playTimeManagerStart(game.titleId) } + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + + NativeLibrary.stopEmulation() + NativeLibrary.playTimeManagerStop() + + isEmulationReady = false + isRotationBlocked = true + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED + emulationViewModel.setEmulationStarted(false) + + val game = intent.extras?.let { extras -> + BundleCompat.getParcelable(extras, "game", Game::class.java) + } + if (game != null) { + NativeLibrary.playTimeManagerStart(game.titleId) + } + + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment + navHostFragment.navController.setGraph(R.navigation.emulation_navigation, intent.extras) + } + // On some devices, the system bars will not disappear on first boot or after some // rotations. Here we set full screen immersive repeatedly in onResume and in // onWindowFocusChanged to prevent the unwanted status bar state. diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index 785438526..e1c1fc076 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -543,6 +543,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram } override fun onDestroy() { + if (::emulationState.isInitialized && requireActivity().isFinishing) { + emulationState.stop() + } EmulationLifecycleUtil.removeHook(onPause) EmulationLifecycleUtil.removeHook(onShutdown) if (gameFd != null) { From f1cd5f5ff4fdb6bee3b51c58c63620f4096af2ad Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Tue, 14 Apr 2026 19:26:22 +0200 Subject: [PATCH 59/98] video_core: fix color blend min/max mode in OpenGL (#2038) * video_core: fix check for fragment color blend emulation * video_core: Fix typo in gl fragment shader gen --- .../shader/generator/glsl_fs_shader_gen.cpp | 29 ++++++++++++------- .../shader/generator/pica_fs_config.cpp | 27 +++++++---------- .../shader/generator/pica_fs_config.h | 23 ++++++++++----- 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/video_core/shader/generator/glsl_fs_shader_gen.cpp b/src/video_core/shader/generator/glsl_fs_shader_gen.cpp index 7d7ae63bb..8ff5ac9d4 100644 --- a/src/video_core/shader/generator/glsl_fs_shader_gen.cpp +++ b/src/video_core/shader/generator/glsl_fs_shader_gen.cpp @@ -895,7 +895,11 @@ void FragmentModule::WriteLogicOp() { } void FragmentModule::WriteBlending() { - if (!config.EmulateBlend() || profile.is_vulkan) [[likely]] { + bool requires_rgb_minmax_emulation = + config.framebuffer.requested_rgb_blend.RequiresMinMaxEmulation(); + bool requires_alpha_minmax_emulation = + config.framebuffer.requested_alpha_blend.RequiresMinMaxEmulation(); + if (!requires_rgb_minmax_emulation && !requires_alpha_minmax_emulation) [[likely]] { return; } @@ -937,23 +941,25 @@ void FragmentModule::WriteBlending() { return "vec4(1.f)"; } }; + + // At this point, the blend equation can only be min or max. const auto get_func = [](Pica::FramebufferRegs::BlendEquation eq) { return eq == Pica::FramebufferRegs::BlendEquation::Min ? "min" : "max"; }; - if (config.framebuffer.rgb_blend.eq != Pica::FramebufferRegs::BlendEquation::Add) { + if (requires_rgb_minmax_emulation) { out += fmt::format( "combiner_output.rgb = {}(source_color.rgb * ({}).rgb, dest_color.rgb * ({}).rgb);\n", - get_func(config.framebuffer.rgb_blend.eq), - get_factor(config.framebuffer.rgb_blend.src_factor), - get_factor(config.framebuffer.rgb_blend.dst_factor)); + get_func(config.framebuffer.requested_rgb_blend.eq), + get_factor(config.framebuffer.requested_rgb_blend.src_factor), + get_factor(config.framebuffer.requested_rgb_blend.dst_factor)); } - if (config.framebuffer.alpha_blend.eq != Pica::FramebufferRegs::BlendEquation::Add) { + if (requires_alpha_minmax_emulation) { out += fmt::format("combiner_output.a = {}(source_color.a * ({}).a, dest_color.a * ({}).a);\n", - get_func(config.framebuffer.alpha_blend.eq), - get_factor(config.framebuffer.alpha_blend.src_factor), - get_factor(config.framebuffer.alpha_blend.dst_factor)); + get_func(config.framebuffer.requested_alpha_blend.eq), + get_factor(config.framebuffer.requested_alpha_blend.src_factor), + get_factor(config.framebuffer.requested_alpha_blend.dst_factor)); } } @@ -1239,7 +1245,8 @@ void FragmentModule::DefineExtensions() { use_fragment_shader_barycentric = false; } } - if (config.EmulateBlend() && !profile.is_vulkan) { + if (config.framebuffer.requested_rgb_blend.RequiresMinMaxEmulation() || + config.framebuffer.requested_alpha_blend.RequiresMinMaxEmulation()) [[unlikely]] { if (profile.has_gl_ext_framebuffer_fetch) { out += "#extension GL_EXT_shader_framebuffer_fetch : enable\n"; out += "#define destFactor color\n"; @@ -1338,7 +1345,7 @@ void FragmentModule::DefineBindingsGL() { out += "layout(binding = 6) uniform sampler2D tex_normal;\n"; } if (use_blend_fallback) { - out += "layout(location = 7) uniform sampler2D tex_color;\n"; + out += "layout(binding = 7) uniform sampler2D tex_color;\n"; } // Shadow textures diff --git a/src/video_core/shader/generator/pica_fs_config.cpp b/src/video_core/shader/generator/pica_fs_config.cpp index 0f3854ce8..c584b99a0 100644 --- a/src/video_core/shader/generator/pica_fs_config.cpp +++ b/src/video_core/shader/generator/pica_fs_config.cpp @@ -21,13 +21,13 @@ FramebufferConfig::FramebufferConfig(const Pica::RegsInternal& regs) { logic_op.Assign(Pica::FramebufferRegs::LogicOp::Copy); if (alphablend_enable) { - rgb_blend.eq = output_merger.alpha_blending.blend_equation_rgb.Value(); - rgb_blend.src_factor = output_merger.alpha_blending.factor_source_rgb; - rgb_blend.dst_factor = output_merger.alpha_blending.factor_dest_rgb; + requested_rgb_blend.eq = output_merger.alpha_blending.blend_equation_rgb.Value(); + requested_rgb_blend.src_factor = output_merger.alpha_blending.factor_source_rgb; + requested_rgb_blend.dst_factor = output_merger.alpha_blending.factor_dest_rgb; - alpha_blend.eq = output_merger.alpha_blending.blend_equation_a.Value(); - alpha_blend.src_factor = output_merger.alpha_blending.factor_source_a; - alpha_blend.dst_factor = output_merger.alpha_blending.factor_dest_a; + requested_alpha_blend.eq = output_merger.alpha_blending.blend_equation_a.Value(); + requested_alpha_blend.src_factor = output_merger.alpha_blending.factor_source_a; + requested_alpha_blend.dst_factor = output_merger.alpha_blending.factor_dest_a; } } @@ -37,17 +37,10 @@ void FramebufferConfig::ApplyProfile(const Profile& profile) { logic_op.Assign(requested_logic_op); } - // Min/max blend emulation - if (!profile.has_blend_minmax_factor && alphablend_enable) { - if (rgb_blend.eq != Pica::FramebufferRegs::BlendEquation::Min && - rgb_blend.eq != Pica::FramebufferRegs::BlendEquation::Max) { - rgb_blend = {}; - } - - if (alpha_blend.eq != Pica::FramebufferRegs::BlendEquation::Min && - alpha_blend.eq != Pica::FramebufferRegs::BlendEquation::Max) { - alpha_blend = {}; - } + // Check if we don't need blend min/max emulation. + if ((profile.has_blend_minmax_factor || profile.is_vulkan) && alphablend_enable) { + requested_rgb_blend.SetMinMaxEmulationDisabled(); + requested_alpha_blend.SetMinMaxEmulationDisabled(); } } diff --git a/src/video_core/shader/generator/pica_fs_config.h b/src/video_core/shader/generator/pica_fs_config.h index 736880a5b..f0e2fe718 100644 --- a/src/video_core/shader/generator/pica_fs_config.h +++ b/src/video_core/shader/generator/pica_fs_config.h @@ -43,6 +43,17 @@ struct BlendConfig { // fields FIELD_HASH(eq), FIELD_HASH(src_factor), FIELD_HASH(dst_factor)); } + + void SetMinMaxEmulationDisabled() { + // If we don't need min/max emulation, set the blend equation + // to "-1" as a clear marker that this config is disabled. + eq = static_cast(UINT32_MAX); + } + + bool RequiresMinMaxEmulation() { + return eq == Pica::FramebufferRegs::BlendEquation::Min || + eq == Pica::FramebufferRegs::BlendEquation::Max; + } }; static_assert(std::has_unique_object_representations_v); @@ -58,8 +69,8 @@ struct FramebufferConfig { BitField<10, 1, u32> shadow_rendering; BitField<11, 1, u32> alphablend_enable; }; - BlendConfig rgb_blend{}; - BlendConfig alpha_blend{}; + BlendConfig requested_rgb_blend{}; + BlendConfig requested_alpha_blend{}; Pica::FramebufferRegs::LogicOp requested_logic_op{}; @@ -78,7 +89,8 @@ struct FramebufferConfig { // fields FIELD_HASH(alpha_test_func), FIELD_HASH(scissor_test_mode), FIELD_HASH(depthmap_enable), FIELD_HASH(logic_op), FIELD_HASH(shadow_rendering), FIELD_HASH(alphablend_enable), - FIELD_HASH(rgb_blend), FIELD_HASH(alpha_blend), FIELD_HASH(requested_logic_op), + FIELD_HASH(requested_rgb_blend), FIELD_HASH(requested_alpha_blend), + FIELD_HASH(requested_logic_op), // nested layout BlendConfig::StructHash()); @@ -387,11 +399,6 @@ struct FSConfig { return (stage_index < 4) && ((texture.combiner_buffer_input >> 4) & (1 << stage_index)); } - [[nodiscard]] bool EmulateBlend() const { - return framebuffer.rgb_blend.eq != Pica::FramebufferRegs::BlendEquation::Add || - framebuffer.alpha_blend.eq != Pica::FramebufferRegs::BlendEquation::Add; - } - [[nodiscard]] bool UsesSpirvIncompatibleConfig() const { const auto texture0_type = texture.texture0_type.Value(); return texture0_type == Pica::TexturingRegs::TextureConfig::ShadowCube || From 52b1e01a6f01557098c3c41180b6743f759bacea Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 14 Apr 2026 20:15:37 +0100 Subject: [PATCH 60/98] Updated translations via Transifex --- dist/languages/ca_ES_valencia.ts | 415 +- dist/languages/da_DK.ts | 415 +- dist/languages/de.ts | 647 +- dist/languages/el.ts | 415 +- dist/languages/es_419.ts | 7815 +++++++++++++++++ dist/languages/es_ES.ts | 415 +- dist/languages/fi.ts | 415 +- dist/languages/fr.ts | 415 +- dist/languages/hu_HU.ts | 415 +- dist/languages/id.ts | 415 +- dist/languages/it.ts | 417 +- dist/languages/ja_JP.ts | 415 +- dist/languages/ko_KR.ts | 415 +- dist/languages/lt_LT.ts | 415 +- dist/languages/nb.ts | 839 +- dist/languages/nl.ts | 415 +- dist/languages/pl_PL.ts | 415 +- dist/languages/pt_BR.ts | 415 +- dist/languages/ro_RO.ts | 415 +- dist/languages/ru_RU.ts | 415 +- dist/languages/sv.ts | 415 +- dist/languages/tr_TR.ts | 415 +- dist/languages/vi_VN.ts | 415 +- dist/languages/zh_CN.ts | 415 +- dist/languages/zh_TW.ts | 415 +- .../res/values-b+ca+ES+valencia/strings.xml | 4 + .../src/main/res/values-b+es+ES/strings.xml | 4 + .../src/main/res/values-b+pl+PL/strings.xml | 1 - .../src/main/res/values-b+pt+BR/strings.xml | 1 - .../app/src/main/res/values-de/strings.xml | 35 + .../src/main/res/values-es_419/strings.xml | 333 + .../app/src/main/res/values-fr/strings.xml | 4 + .../app/src/main/res/values-it/strings.xml | 4 + .../app/src/main/res/values-nb/strings.xml | 2 +- .../app/src/main/res/values-sv/strings.xml | 1 - 35 files changed, 13575 insertions(+), 5247 deletions(-) create mode 100644 dist/languages/es_419.ts create mode 100644 src/android/app/src/main/res/values-es_419/strings.xml diff --git a/dist/languages/ca_ES_valencia.ts b/dist/languages/ca_ES_valencia.ts index ca856867c..d72e8669b 100644 --- a/dist/languages/ca_ES_valencia.ts +++ b/dist/languages/ca_ES_valencia.ts @@ -3805,19 +3805,29 @@ a les aplicacions instal·lades. + Status: Loaded (Cannot Validate Signature) + Estat: Carregat (Firma No Verificable) + + + Status: Not Found Estat: No Trobat - + Status: Invalid Estat: Invàlid - + Status: IO Error Estat: Error Entrada/Eixida + + + Status: Missing Crypto Keys + Estat: Falten Claus Criptogràfiques + ConfigureTouchFromButton @@ -4229,12 +4239,12 @@ Per favor, comprove la instal·lació de FFmpeg usada per a la compilació. GMainWindow - + Warning Advertència - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4248,511 +4258,506 @@ En executar-se d'esta manera, és possible que l'aplicació no tinga c Es recomana executar Azahar amb el comando `*open`, per exemple: `*open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Dispositius compatibles amb Vulkan no trobats. - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - L'inici de Vulkan va fallar durant l'inici.<br/>El teu GPU, o no suporta Vulkan 1.1, o no té els últims drivers gràfics. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Velocitat actual del trànsit Artic. Valors més alts indiquen major càrrega de transferència. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. La velocitat d'emulació actual. Valors majors o menors de 100% indiquen que la velocitat d'emulació funciona més ràpida o lentament que en una 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Els fotogrames per segon que està mostrant el joc. Variaran d'aplicació en aplicació i d'escena a escena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. El temps que porta emular un fotograma de 3DS, sense tindre en compte el limitador de fotogrames, ni la sincronització vertical. Per a una emulació òptima, este valor no ha de superar els 16.67 ms. - + + Emulated notification LED + LED de notificació emulada + + + MicroProfile (unavailable) MicroProfile (no disponible) - + Clear Recent Files Netejar Fitxers Recents - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar està executant una aplicació - - + + Invalid App Format Format d'aplicació invàlid - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. El teu format d'aplicació no és vàlid.<br/>Per favor, seguix les instruccions per a tornar a bolcar les teues <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartutxos de joc</a> i/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títols instal·lats</a>. - + App Corrupted Aplicació corrupta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. La teua aplicació està corrupta. <br/>Per favor, seguix les instruccions per a tornar a bolcar les teues <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartutxos de joc</a> i/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títols instal·lats</a>. - + App Encrypted Aplicació encriptada - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> La teua aplicació està encriptada. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Per favor visita el nostre blog per a més informació.</a> - + Unsupported App Aplicació no suportada - + GBA Virtual Console is not supported by Azahar. Consola Virtual de GBA no està suportada per Azahar. - - + + Artic Server Artic Server - + Invalid system mode Mode de sistema no vàlid - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Les aplicacions exclusives de New 3DS no es poden carregar sense activar el mode New 3DS. - + Error while loading App! Error en carregar l'aplicació! - + An unknown error occurred. Please see the log for more details. Un error desconegut ha ocorregut. Per favor, mira el log per a més detalls. - + CIA must be installed before usage El CIA ha d'estar instal·lat abans d'usar-se - + Before using this CIA, you must install it. Do you want to install it now? Abans d'usar este CIA, has d'instal·lar-ho. Vols instal·lar-ho ara? - + Quick Load Càrrega Ràpida - + Quick Save Guardat Ràpid - - + + Slot %1 Ranura %1 - + %2 %3 %2 %3 - + Quick Save - %1 Guardat Ràpid - %1 - + Quick Load - %1 Càrrega Ràpida - %1 - + Slot %1 - %2 %3 Ranura %1 - %2 %3 - + Error Opening %1 Folder Error en obrir la carpeta %1 - - + + Folder does not exist! La carpeta no existix! - + Remove Play Time Data Llevar Dades de Temps de Joc - + Reset play time? Reiniciar temps de joc? - - - - + + + + Create Shortcut Crear drecera - + Do you want to launch the application in fullscreen? Desitja llançar esta aplicació en pantalla completa? - + Successfully created a shortcut to %1 Drecera a %1 creat amb èxit - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Aixó crearà una drecera a la AppImage actual. Pot no funcionar bé si actualitzes. Continuar? - + Failed to create a shortcut to %1 Fallada en crear una drecera a %1 - + Create Icon Crear icona - + Cannot create icon file. Path "%1" does not exist and cannot be created. No es va poder crear un arxiu d'icona. La ruta "%1" no existix i no pot ser creada. - + Dumping... Bolcant... - - + + Cancel Cancel·lar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. No es va poder bolcar el RomFS base. Comprove el registre per a més detalls. - + Error Opening %1 Error en obrir %1 - + Select Directory Seleccionar directori - + Properties Propietats - + The application properties could not be loaded. Les propietats de l'aplicació no han pogut ser carregades. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executable 3DS(%1);;Tots els arxius(*.*) - + Load File Carregar Fitxer - - + + Set Up System Files Configurar Fitxers del Sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necessita fitxers d'una consola real per poder utilitzar algunes de les seues funcions.<br>Pots obtindre els fitxers amb la <a href=https://github.com/azahar-emu/ArticSetupTool>ferramenta de configuració Azahar</a><br>Notes:<ul><li><b>Aquesta operació instal·larà fitxers únics de la consola a Azahar, no compartisques les teues carpetes d'usuari o nand<br>després de completar el procés de configuració!</b></li><li>Després de la configuració, Azahar s'enllaçarà a la consola que ha executat la ferramenta de configuració. Pots desvincular la<br>consola més tard des de la pestanya "Fitxers de sistema" del menú d'opcions de l'emulador.</li><li>No et connectes en línia amb Azahar i la consola 3DS al mateix temps després de configurar els arxius del sistema,<br>ja que això podria causar problemes.</li><li>La configuració de Old 3DS és necessària perquè funcione la configuració de New 3DS (configurar els dos modes és recomanat).</li><li>Els dos modes de configuració funcionaran independentment del model de la consola que execute la ferramenta de configuració.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Introduïx la direcció de la ferramenta de configuració: - + <br>Choose setup mode: <br>Tria mode de configuració: - + (ℹ️) Old 3DS setup (ℹ️) Configuració Old 3DS - - + + Setup is possible. La configuració és possible. - + (⚠) New 3DS setup (⚠) Configuració New 3DS - + Old 3DS setup is required first. La configuració Old 3DS es neccessaria abans. - + (✅) Old 3DS setup (✅) Configuració Old 3DS - - + + Setup completed. Configuració completada. - + (ℹ️) New 3DS setup (ℹ️) Configuració New 3DS - + (✅) New 3DS setup (✅) Configuració New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Els fitxers de sistema per al mode seleccionat ja estan configurats. Vols reinstal·lar els arxius de totes maneres? - + Load Files Carregar Fitxers - + 3DS Installation File (*.cia *.zcia) Fitxers d'Instalació de 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tots els fitxers (*.*) - + Connect to Artic Base Connectar amb Artic Base - + Enter Artic Base server address: Introduïx la direcció del servidor Artic Base - + %1 has been installed successfully. %1 s'ha instal·lat amb èxit. - + Unable to open File No es va poder obrir el Fitxer - + Could not open %1 No es va poder obrir %1 - + Installation aborted Instal·lació interrompuda - + The installation of %1 was aborted. Please see the log for more details La instal·lació de %1 ha sigut avortada.\n Per favor, mira el log per a més informació. - + Invalid File Fitxer no vàlid - + %1 is not a valid CIA %1 no és un CIA vàlid. - + CIA Encrypted CIA encriptat - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> El teu fitxer CIA està encriptat. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Per favor visita el nostre blog per a més informació.</a> - + Unable to find File No es pot trobar el Fitxer - + Could not find %1 No es va poder trobar %1 - - + + Z3DS Compression Compressió Z3DS - + Failed to compress some files, check log for details. No es van poder comprimir alguns arxius, mira el registre per a més detalls. - + Failed to decompress some files, check log for details. No es van poder descomprimir alguns arxius, mira el registre per a més detalls. - + All files have been compressed successfully. Tots els fitxers s'han comprimit amb èxit. - + All files have been decompressed successfully. Tots els fitxers s'han descomprimit amb èxit. - + Uninstalling '%1'... Desinstal·lant '%1'... - + Failed to uninstall '%1'. Va fallar la desinstal·lació de '%1'. - + Successfully uninstalled '%1'. '%1' desinstal·lat amb èxit. - + File not found Fitxer no trobat - + File "%1" not found Fitxer "%1" no trobat - + Savestates Estats - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4761,86 +4766,86 @@ Use at your own risk! Usa'ls sota el teu propi risc! - - - + + + Error opening amiibo data file Error en obrir els fitxers de dades de l'Amiibo - + A tag is already in use. Ja està en ús una etiqueta. - + Application is not looking for amiibos. L'aplicació no està buscant amiibos. - + Amiibo File (%1);; All Files (*.*) Fitxer d'Amiibo (%1);; Tots els arxius (*.*) - + Load Amiibo Carregar Amiibo - + Unable to open amiibo file "%1" for reading. No es va poder obrir el fitxer amiibo "%1" per a la seua lectura. - + Record Movie Gravar Pel·lícula - + Movie recording cancelled. Gravació de pel·lícula cancel·lada. - - + + Movie Saved Pel·lícula Guardada - - + + The movie is successfully saved. Pel·lícula guardada amb èxit. - + Application will unpause L'aplicació es resumirà - + The application will be unpaused, and the next frame will be captured. Is this okay? L'aplicació es resumirà, i el següent fotograma serà capturat. Estàs d'acord? - + Invalid Screenshot Directory Directori de captures de pantalla no vàlid - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. No es pot crear el directori de captures de pantalla. La ruta de captures de pantalla torna al seu valor per omissió. - + Could not load video dumper No es va poder carregar el bolcador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4853,265 +4858,265 @@ Per a instal·lar FFmpeg en Azahar, polsa Obrir i tria el directori de FFmpeg. Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda. - + Load 3DS ROM Files Carregar ROM de 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Fitxers ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Fitxer ROM 3DS comprimit (*.%1) - + Save 3DS Compressed ROM File Desar fitxer 3DS comprimit - + Select Output 3DS Compressed ROM Folder Seleccione la carpeta d'eixida comprimida dels ROMs 3DS - + Load 3DS Compressed ROM Files Carregar fitxers 3DS comprimits - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Fitxer ROM 3DS comprimit (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Fitxer ROM 3DS (*.%1) - + Save 3DS ROM File Desar fitxer ROM 3DS - + Select Output 3DS ROM Folder Seleccione la carpeta d'eixida dels ROMs 3DS - + Select FFmpeg Directory Seleccionar Directori FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Al directori de FFmpeg indicat li falta %1. Per favor, assegura't d'haver seleccionat el directori correcte. - + FFmpeg has been sucessfully installed. FFmpeg ha sigut instal·lat amb èxit. - + Installation of FFmpeg failed. Check the log file for details. La instal·lació de FFmpeg ha fallat. Comprova l'arxiu del registre per a més detalls. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. No es va poder començar a gravar vídeo.<br>Assegura't que el codificador de vídeo està configurat correctament.<br>Per a més detalls, observa el registre. - + Recording %1 Gravant %1 - + Playing %1 / %2 Reproduint %1 / %2 - + Movie Finished Pel·lícula acabada - + (Accessing SharedExtData) (Accedint al SharedExtData) - + (Accessing SystemSaveData) (Accedint al SystemSaveData) - + (Accessing BossExtData) (Accedint al BossExtData) - + (Accessing ExtData) (Accedint al ExtData) - + (Accessing SaveData) (Accedint al SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tràfic Artic: %1 %2%3 - + Speed: %1% Velocitat: %1% - + Speed: %1% / %2% Velocitat: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUM: SILENCI - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Falta %1 . Per favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>bolca els teus arxius de sistema</a>.<br/>Continuar l'emulació pot resultar en penges i errors. - + A system archive Un fitxer del sistema - + System Archive Not Found El fitxer del sistema no s'ha trobat - + System Archive Missing Falta un Fitxer de Sistema - + Save/load Error Error de guardat/càrrega - + Fatal Error Error Fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Error fatal.<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Mira el log</a>per a més detalls.<br/>Continuar l'emulació pot resultar en penges i errors. - + Fatal Error encountered Error Fatal trobat - + Continue Continuar - + Quit Application Tancar aplicació - + OK Aceptar - + Would you like to exit now? Vols eixir ara? - + The application is still running. Would you like to stop emulation? L'aplicació seguix en execució. Vols parar l'emulació? - + Playback Completed Reproducció Completada - + Movie playback completed. Reproducció de pel·lícula completada. - + Update Available Actualització disponible - + Update %1 for Azahar is available. Would you like to download it? L'actualització %1 d'Azahar ja està disponible. Vols descarregar-la? - + Primary Window Finestra Primària - + Secondary Window Finestra Secundària diff --git a/dist/languages/da_DK.ts b/dist/languages/da_DK.ts index e2859afdf..be3fbd643 100644 --- a/dist/languages/da_DK.ts +++ b/dist/languages/da_DK.ts @@ -3805,19 +3805,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4227,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Advarsel - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4242,595 +4252,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nuværende emuleringshastighed. Værdier højere eller lavere end 100% indikerer at emuleringen kører hurtigere eller langsommere end en 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid det tog at emulere en 3DS-skærmbillede, hastighedsbegrænsning og v-sync er tille talt med. For emulering med fuld hastighed skal dette højest være 16,67ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Ryd seneste filer - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA skal installeres før brug - + Before using this CIA, you must install it. Do you want to install it now? Før du kan bruge denne CIA, skal den være installeret. Vil du installere den nu? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Fejl ved åbning af %1-mappen - - + + Folder does not exist! Mappen findes ikke! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Annuller - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Fejl ved åbning af %1 - + Select Directory Vælg mappe - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS-program (%1);;Alle filer (*.*) - + Load File Indlæs fil - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Indlæs filer - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle filer (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 blev succesfuldt installeret. - + Unable to open File Kunne ikke åbne filen - + Could not open %1 Kunne ikke åbne %1 - + Installation aborted Installation afbrudt - + The installation of %1 was aborted. Please see the log for more details Installationen af %1 blev afbrudt. Se logfilen for flere detaljer. - + Invalid File Ugyldig fil - + %1 is not a valid CIA %1 er ikke en gyldig CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Filen blev ikke fundet - + File "%1" not found Filen "%1" blev ikke fundet - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);;Alle filer (*.*) - + Load Amiibo Indlæs Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Optag film - + Movie recording cancelled. Filmoptagelse afbrudt - - + + Movie Saved Film gemt - - + + The movie is successfully saved. Filmen er succesfuldt blevet gemt. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4839,264 +4844,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Hastighed: %1% - + Speed: %1% / %2% Hastighed: %1%/%2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Billede: %1ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found Systemarkiver blev ikke fundet - + System Archive Missing - + Save/load Error - + Fatal Error Alvorlig fejl - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Fortsæt - + Quit Application - + OK OK - + Would you like to exit now? Vil du afslutte nu? - + The application is still running. Would you like to stop emulation? - + Playback Completed Afspilning færdig - + Movie playback completed. Afspilning af filmen er færdig. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/de.ts b/dist/languages/de.ts index 386c3a75c..b8ea368c1 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -29,7 +29,7 @@ <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> - + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> @@ -299,7 +299,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. Emulation - Emulation + Emulation @@ -329,7 +329,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. <html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html> - + <html><head/><body><p>Dieser Nachbearbeitungseffekt passt die Audiogeschwindigkeit an die Emulationsgeschwindigkeit an und hilft, Audiostottern zu vermeiden. Dabei wird allerdings die Audiolatenz erhöht.</p></body></html> @@ -339,7 +339,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. <html><head/><body><p>Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the application framerate is low. May cause audio desync issues.</p></body></html> - + <html><head/><body><p>Skaliert die Audiowiedergabegeschwindigkeit, um Einbrüche in der Emulations-Framerate auszugleichen. Dies bedeutet, dass Audio mit voller Geschwindigkeit wiedergegeben wird, auch wenn die Anwendungs-Framerate niedriger ist. Kann zu Audio-Fehlsynchronisierungsproblemen führen.</p></body></html> @@ -416,7 +416,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. Camera to Configure - + Kamera zu konfigurieren: @@ -437,7 +437,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. Camera mode - + Kameramodus @@ -458,7 +458,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. Camera position - + Kameraposition @@ -479,12 +479,12 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. <html><head/><body><p>Select where the image of the emulated camera comes from. It may be an image or a real camera.</p></body></html> - + <html><head/><body><p>Wähle eine Quelle für das emulierte Kamerabild. Dies kann ein Bild oder eine echte Kamera sein.</p></body></html> Camera Image Source - + Kamera-Bildquelle @@ -504,7 +504,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. File - Datei + Datei @@ -531,7 +531,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. Flip - + Drehen @@ -808,12 +808,12 @@ Möchtest du den Fehler ignorieren und fortfahren? <html><head/><body><p>Toggles the unique data console type (Old 3DS ↔ New 3DS) to be able to download the opposite system firmware type from system settings.</p></body></html> - + <html><head/><body><p>Wechselt den einzigartige Daten Konsolentyp (Old 3DS ↔ New 3DS) um Systemfirmware der entgegengesetzten Region herunterzuladen.</p></body></html> Toggle unique data console type - + Wechsle Einzigartige Daten Konsolentyp @@ -1030,17 +1030,17 @@ Möchtest du den Fehler ignorieren und fortfahren? Use Integer Scaling - + Benutze Integer-Skalierung <html><head/><body><p>Use Integer Scaling</p><p>Enforces that the larger screen in all layouts is an integer scale of the 240px height of the original 3DS screen.</p></body></html> - + <html><head/><body><p>Benutze Integer-Skalierung</p><p>Erzwingt, dass der größere Bildschirm in allen Layouts eine Integer-Skalierung der 240px-Höhe des ursprünglichen 3DS-Bildschirms aufweist.</p></body></html> Enable Linear Filtering - + Aktiviere Lineare Filterung @@ -1105,7 +1105,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Side by Side Full Width - + Nebeneinander Vollbreite @@ -1155,7 +1155,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Disable Right Eye Rendering - + Rendering für das rechte Auge deaktivieren @@ -1165,7 +1165,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Swap Eyes - + Augen tauschen @@ -1180,7 +1180,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Use custom textures - + Benutze Benutzerdefinierte Texturen @@ -1190,7 +1190,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Dump textures - + Texturen dumpen @@ -1200,7 +1200,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Preload custom textures - + Benutzerdefinierte Texturen im Voraus laden @@ -1210,7 +1210,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Async custom texture loading - + Benutzerdefinierte Texturen asynchron laden @@ -1223,7 +1223,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Updates - + Updates @@ -1233,17 +1233,17 @@ Möchtest du den Fehler ignorieren und fortfahren? Update Channel - + Update Kanal Stable - + Stabil Prerelease - + Vorab-Release @@ -1288,12 +1288,12 @@ Möchtest du den Fehler ignorieren und fortfahren? Set emulation speed - + Setze emulationsgeschwindigkeit Emulation Speed - + Emulationsgeschwindigkeit @@ -1405,12 +1405,12 @@ Möchtest du den Fehler ignorieren und fortfahren? SPIR-V shader generation - + SPIR-V Shader Generierung Disable GLSL -> SPIR-V optimizer - + Deaktiviere GLSL -> SPIR-V Optimierung @@ -1430,7 +1430,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Enable hardware shader - + Aktiviere Hardware-Shader @@ -1440,7 +1440,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Accurate multiplication - + Akkurate Multiplikation @@ -1450,7 +1450,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Enable shader JIT - + Shader JIT aktivieren @@ -1460,17 +1460,17 @@ Möchtest du den Fehler ignorieren und fortfahren? Enable async shader compilation - + Aktiviere asynchrone Shader-Kompilierung <html><head/><body><p>Perform presentation on separate threads. Improves performance when using Vulkan in most applications. Adds ~1 frame of input lag.</p></body></html> - + <html><head/><body><p>Präsentation auf separaten Threads durchführen. Verbessert die Leistung bei Verwendung von Vulkan in den meisten Anwendungen. Erhöht Latens mit ~1 Frame.</p></body></html> Enable async presentation - + Aktiviere asynchrone Präsentation @@ -1510,12 +1510,12 @@ Möchtest du den Fehler ignorieren und fortfahren? Use disk shader cache - + Benutze Disk Shader-Cache <html><head/><body><p>VSync prevents the screen from tearing, but some graphics cards have lower performance with VSync enabled. Keep it enabled if you don't notice a performance difference.</p></body></html> - + <html><head/><body><p>VSync verhindert Bildschirmzerrung, allerdings haben manche Grafikkarten eine schlechtere Leistung, wenn VSync aktiv ist. Lass es aktiviert, wenn du keinen Leistungsunterschied bemerkst.</p></body></html> @@ -1525,12 +1525,12 @@ Möchtest du den Fehler ignorieren und fortfahren? <html><head/><body><p>When enabled, this setting detects when the refresh rate of the screen is below that of the 3DS, and when it is, disables VSync automatically to avoid emulation speed being forced below 100%.</p></body></html> - + <html><head/><body><p>Wenn diese Einstellung aktiviert ist, erkennt sie, wenn die Bildwiederholfrequenz des Bildschirms unter der des 3DS liegt, und deaktiviert in diesem Fall automatisch VSync, um zu verhindern, dass die Emulationsgeschwindigkeit unter 100 % sinkt.</p></body></html> Enable display refresh rate detection - + Aktiviere Bildwiederholfrequenz-erkennung @@ -1545,7 +1545,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Delay Application Render Thread - + Verzögere Anwendungsrender-Thread: @@ -2034,17 +2034,17 @@ Möchtest du den Fehler ignorieren und fortfahren? Rotate screens upright - + Rotiere Bildschirme aufrecht Swap screens - + Tausche Bildschirme Customize layout cycling - + Benutzerdefiniertes Layout @@ -2161,7 +2161,7 @@ Möchtest du den Fehler ignorieren und fortfahren? <html><head/><body><p>Bottom Screen Opacity %</p></body></html> - + <html><head/><body><p>Untere Bildschirmopazität %</p></body></html> @@ -2197,67 +2197,67 @@ Möchtest du den Fehler ignorieren und fortfahren? Configure Layout Cycling - + Konfiguriere Layout Zykelung Screen Layout Cycling Customization - + Bildschirmlayout Zykel Anpassung Select which screen layout options should be cycled with the "Toggle Screen Layout" hotkey - + Wählen welche Bildschirm Layout Optionen mit der Tastenkombination "Wechsle Bildschirm Layout" gezykelt werden sollen. Use Global Value - + Benutze Globalen Wert Default - Standard + Standard Single Screen - + Einzelner Bildschirm Large Screen - Großer Bildschirm + Großer Bildschirm Side by Side - Nebeneinander + Nebeneinander Separate Windows - Getrennte Fenster + Separate Fenster Hybrid - + Hybrid Custom - Benutzerdefiniert + Benutzerdefiniert No Layout Selected - + Kein Layout Ausgewählt Please select at least one layout option to cycle through. - + Bitte wähle mindestens eine Layout Option zum Zykeln. @@ -2326,12 +2326,12 @@ Möchtest du den Fehler ignorieren und fortfahren? Map touchpads on controllers like the DualSense directly to touch - + Touchpads auf Controllern wie dem DualSense direkt auf Touch-Funktionen ordnen Use controller touchpad - + Benutze Kontroller Touchpad @@ -2413,7 +2413,7 @@ Möchtest du den Fehler ignorieren und fortfahren? <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Mehr Erfahren</span></a> @@ -2434,12 +2434,12 @@ Möchtest du den Fehler ignorieren und fortfahren? After pressing OK, tap the touchpad on the controller you want to track. - + Nachdem du auf „O.K.“ geklickt hast, drücke eine Taste auf dem Kontroller, dessen Bewegung erfasst werden soll. [press touchpad] - + [Drücke Touchpad] @@ -2600,7 +2600,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Use virtual SD card - + Benutze Virtuelle SD-Karte @@ -2610,7 +2610,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Use custom storage location - + Benutze Benutzerdefinierten Speicherort @@ -2643,12 +2643,12 @@ Möchtest du den Fehler ignorieren und fortfahren? Compress installed CIA content - + Komprimiere installierten CIA Inhalt <html><head/><body><p>Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled.</p></body></html> - + <html><head/><body><p>Komprimiert den Inhalt von CIA-Dateien, wenn diese auf der emulierten SD-Karte installiert werden. Betrifft nur CIA-Inhalte, die installiert werden, während die Einstellung aktiviert ist.</p></body></html> @@ -2698,7 +2698,7 @@ Online-Funktionen (sofern installiert) Region - Region + Region @@ -2709,12 +2709,13 @@ Online-Funktionen (sofern installiert) Apply region free patch to installed applications. - + Regionsfreier Patch auf +installierten Applikationen anwenden. Patches the region of installed applications to be region free, so that they always appear on the home menu. - + Passt die Region der installierten Anwendungen so an, dass sie regionsfrei sind und immer im Startmenü angezeigt werden. @@ -2980,7 +2981,7 @@ installed applications. 3GX Plugin Loader - + 3GX-Plugin-Loader @@ -3806,19 +3807,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found Status: Nicht gefunden - + Status: Invalid Status: Ungültig - + Status: IO Error Status: I/O-Fehler + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -3932,12 +3943,12 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de Interface Language - + Sprache Theme - + Design @@ -3947,7 +3958,7 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de Icon Size - + Icongröße @@ -3968,7 +3979,7 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de Row 1 Text - + Zeile 1-Text: @@ -4003,17 +4014,17 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de Row 2 Text - + Zeile 2-Text: Hide titles without icon - + Titel ohne Icon verbergen Single line mode - + Einzeiliger Modus @@ -4023,7 +4034,7 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de Show advanced frame time info - + Zeige detaillierte Frame-Zeit Info @@ -4230,526 +4241,526 @@ Bitte überprüfe deine FFmpeg-Installation, die für die Kompilierung verwendet GMainWindow - + Warning - Warnung + Warnung - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + Die ausführbare Datei `azahar` wurde direkt und nicht über das Azahar.app-Bundle gestartet. + +Bei dieser Ausführungsmethode fehlen möglicherweise bestimmte Funktionen der Anwendung, wie z. B. die Kameraemulation. + +Es wird empfohlen, Azahar stattdessen mit dem Befehl `open` zu starten, z. B.: +`open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Keine geeigneten Vulkan-Geräte gefunden - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - Vulkan-Initialisierung beim Starten fehlgeschlagen.<br/>Deine Grafikkarte unterstützt möglicherweise „Vulkan 1.1“ nicht, oder ist nicht auf dem aktuellsten Stand. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Aktuelle Artic Daten-Verkehrsgeschwindigkeit. Höhere Werte weisen auf größere Übertragungslasten hin. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Derzeitige Emulationsgeschwindigkeit. Werte höher oder niedriger als 100% zeigen, dass die Emulation schneller oder langsamer läuft als auf einem 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Wie viele Bilder pro Sekunde die App aktuell anzeigt. Dies ist von App zu App und von Szene zu Szene unterschiedlich. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die benötigte Zeit um ein 3DS-Einzelbild zu emulieren (V-Sync oder Bildratenbegrenzung nicht mitgezählt). Bei Echtzeitemulation sollte dieser Wert höchstens 16,67ms betragen. - + + Emulated notification LED + + + + MicroProfile (unavailable) MicroProfile (Nicht verfügbar) - + Clear Recent Files Zuletzt verwendete Dateien zurücksetzen - + &Continue &Fortsetzen - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar führt eine Anwendung aus - - + + Invalid App Format Falsches App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Dein App-Format wird nicht unterstützt. <br/>Bitte folge den Anleitungen um deine <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>Spielkarten</a> oder <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installierten Titel</a> erneut zu dumpen. - + App Corrupted Anwendung beschädigt - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Deine App ist beschädigt. <br/>Folge bitte den Anleitungen um deine <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>Spielkarten</a> oder <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installierten Titel</a> erneut zu dumpen. - + App Encrypted Anwendung verschlüsselt - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Deine App ist verschlüsselt. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Bitte lies unseren Blog für weitere Informationen.</a> - + Unsupported App Nicht unterstützte Anwendung - + GBA Virtual Console is not supported by Azahar. GBA Virtual Console wird nicht von Azahar unterstützt - - + + Artic Server Artic Server - + Invalid system mode - + Ungültiger Systemmodus - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + New 3DS eksklusive Applikationen können nicht ohne den New 3DS Modus geladen werden. - + Error while loading App! Fehler beim Laden der Anwendung! - + An unknown error occurred. Please see the log for more details. Ein unbekannter Fehler ist aufgetreten. Mehr Details im Protokoll. - + CIA must be installed before usage CIA muss vor der Benutzung installiert sein - + Before using this CIA, you must install it. Do you want to install it now? Vor dem Nutzen dieser CIA muss sie installiert werden. Soll dies jetzt getan werden? - + Quick Load Schnellladen - + Quick Save Schnellspeichern - - + + Slot %1 Speicherplatz %1 - + %2 %3 %2 %3 - + Quick Save - %1 Schnellspeichern - %1 - + Quick Load - %1 Schnellladen - %1 - + Slot %1 - %2 %3 Speicherplatz %1 - %2 %3 - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Ordner existiert nicht! - + Remove Play Time Data Spielzeitdaten löschen - + Reset play time? Spielzeit zurücksetzen - - - - + + + + Create Shortcut Verknüpfung erstellen - + Do you want to launch the application in fullscreen? Möchtest du die Anwendung in Vollbild starten? - + Successfully created a shortcut to %1 Es wurde erfolgreich eine Verknüpfung für %1 erstellt - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Dadurch wird eine Verknüpfung zum aktuellen AppImage erstellt. Dies funktioniert möglicherweise nicht mehr richtig, wenn du aktualisierst. Möchtest du fortfahren? - + Failed to create a shortcut to %1 Es konnte keine Verknüpfung für %1 erstellt werden - + Create Icon Icon erstellen - + Cannot create icon file. Path "%1" does not exist and cannot be created. Es konnte kein Icon-Pfad erstellt werden. „%1“ existiert nicht, oder kann nicht erstellt werden. - + Dumping... Dumpvorgang... - - + + Cancel Abbrechen - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Konnte Base-RomFS nicht dumpen. Schau im Protokoll für weitere Informationen nach. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The application properties could not be loaded. Die Anwendungseigenschaften konnten nicht geladen werden. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Programmdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - - + + Set Up System Files Systemdateien einrichten - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar benötigt Konsolendaten und Firmware-Dateien von einer echten Konsole, um einige Funktionen nutzen zu können. <br>Du kannst solche Dateien mit dem <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Einrichtungs-Tool</a> einrichten.<br>Hinweise:<ul><li><b>Bei diesem Vorgang werden konsolenspezifische Dateien in Azahar installiert. Gib deine Benutzer- oder NAND-Ordner nicht frei, <br>nachdem der Einrichtungsvorgang durchgeführt wurde!</b></li><li>Während des Einrichtungsvorgangs verknüpft Azahar deine Konsole mit dem Einrichtungstool. Du kannst die Verknüpfung <br>jederzeit im „Systemdateien“-Reiter in den Emulatoreinstellungen trennen.</li><li>Gehe nicht zeitgleich mit deinem eigenen 3DS und Azahar online, <br>da dies sonst zu Problemen führen könnte.</li><li>Damit die New 3DS-Einrichtung funktioniert, ist zuerst eine Old 3DS-Einrichtung erforderlich (Es wird empfohlen, beides einzurichten).</li><li>Beide Setup-Modi funktionieren unabhängig vom Modell der Konsole, auf dem das Setup-Tool ausgeführt wird.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Gib die Adresse des Azahar Artic Einrichtung-Tools ein: - + <br>Choose setup mode: <br>Wähle den Einrichtungsmodus: - + (ℹ️) Old 3DS setup (ℹ️) Old 3DS-Einrichtung - - + + Setup is possible. Einrichtung ist möglich. - + (⚠) New 3DS setup (⚠) New 3DS-Einrichtung - + Old 3DS setup is required first. Du musst zuerst die Old 3DS-Einrichtung abschließen. - + (✅) Old 3DS setup (✅) Old 3DS-Einrichtung - - + + Setup completed. Einrichtung abgeschlossen - + (ℹ️) New 3DS setup (ℹ️) New 3DS-Einrichtung - + (✅) New 3DS setup (✅) New 3DS-Einrichtung - + The system files for the selected mode are already set up. Reinstall the files anyway? Die Systemdateien für den ausgewählten Modus sind bereits eingerichtet. Die Dateien trotzdem neu installieren? - + Load Files Dateien laden - + 3DS Installation File (*.cia *.zcia) - + 3DS Installationsdatei (*.cia *.zcia) - - - + + + All Files (*.*) Alle Dateien (*.*) - + Connect to Artic Base Verbinde dich mit Artic-Base - + Enter Artic Base server address: Gib die Artic-Base-Serveradresse ein - + %1 has been installed successfully. %1 wurde erfolgreich installiert. - + Unable to open File Datei konnte nicht geöffnet werden - + Could not open %1 Konnte %1 nicht öffnen - + Installation aborted Installation abgebrochen - + The installation of %1 was aborted. Please see the log for more details Die Installation von %1 wurde abgebrochen. Schaue im Protokoll für weitere Informationen nach - + Invalid File Ungültige Datei - + %1 is not a valid CIA %1 ist keine gültige CIA - + CIA Encrypted CIA verschlüsselt - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Deine CIA Datei ist verschlüsselt. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Bitte lese unseren Blog für mehr Info.</a> - + Unable to find File Datei konnte nicht gefunden werden - + Could not find %1 %1 konnte nicht gefunden werden - - + + Z3DS Compression - - - - - Failed to compress some files, check log for details. - + Z3DS Komprimierung - Failed to decompress some files, check log for details. - + Failed to compress some files, check log for details. + Fehler beim komprimieren von Dateien, checke den Log für Details. - - All files have been compressed successfully. - + + Failed to decompress some files, check log for details. + Fehler beim dekomprimieren von Dateien, checke den Log für Details. - All files have been decompressed successfully. - + All files have been compressed successfully. + Alle Dateien wurden erfolgreich komprimiert. - + + All files have been decompressed successfully. + Alle Dateien wurden erfolgreich dekomprimiert. + + + Uninstalling '%1'... '%1' wird deinstalliert… - + Failed to uninstall '%1'. Deinstallation von '%1' fehlgeschlagen. - + Successfully uninstalled '%1'. '%1' erfolgreich deinstalliert. - + File not found Datei nicht gefunden - + File "%1" not found Datei "%1" nicht gefunden - + Savestates Speicherstände - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4758,86 +4769,86 @@ Use at your own risk! Nutzung auf eigene Gefahr! - - - + + + Error opening amiibo data file Fehler beim Öffnen der Amiibo-Datei - + A tag is already in use. Eine Markierung wird schon genutzt. - + Application is not looking for amiibos. Die Anwendung sucht keine Amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo wird geladen - + Unable to open amiibo file "%1" for reading. Die Amiibo-Datei "%1" konnte nicht zum Lesen geöffnet werden. - + Record Movie Aufnahme starten - + Movie recording cancelled. Aufnahme abgebrochen. - - + + Movie Saved Aufnahme gespeichert - - + + The movie is successfully saved. Die Aufnahme wurde erfolgreich gespeichert. - + Application will unpause Die Anwendung wird fortgesetzt - + The application will be unpaused, and the next frame will be captured. Is this okay? Die Anwendung wird fortgesetzt und das nächste Bild wird aufgenommen. Ist das okay? - + Invalid Screenshot Directory Ungültiges Bildschirmfoto-Verzeichnis - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Das angegebene Bildschirmfoto-Verzeichnis kann nicht erstellt werden. Der Bildschirmfotopfad wurde auf die Voreinstellung zurückgesetzt. - + Could not load video dumper Konnte Video-Dumper nicht laden - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4850,265 +4861,265 @@ Um FFmpeg in Azahar zu installieren, klicke auf „Offnen“ und wähle dein FFm Um eine Anleitung zur Installation von FFmpeg anzuzeigen, klicke auf „Hilfe“. - + Load 3DS ROM Files - + Lade 3DS ROM Dateien - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS ROM Dateien (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + 3DS Komprimierte ROM Datei (*.%1) - + Save 3DS Compressed ROM File - + Speichere 3DS Komprimierte ROM Datei - + Select Output 3DS Compressed ROM Folder - + Wähle einen 3DS komprimierten ROM Output Ordner - + Load 3DS Compressed ROM Files - + Lade 3DS Komprimierte ROM Datei - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS Komprimierte ROM Dateien (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + 3DS ROM Datei (*.%1) - + Save 3DS ROM File - + Speichere 3DS ROM Datei - + Select Output 3DS ROM Folder - + Wähle einen 3DS ROM Output Ordner - + Select FFmpeg Directory Wähle FFmpeg-Verzeichnis - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Das angegebene FFmpeg-Verzeichnis fehlt %1. Bitte stelle sicher, dass du das richtige Verzeichnis ausgewählt hast. - + FFmpeg has been sucessfully installed. FFmpeg wurde erfolgreich installiert. - + Installation of FFmpeg failed. Check the log file for details. Installation von FFmpeg fehlgeschlagen. Prüfe die Protokolldatei für Details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Video-Dump konnte nicht gestartet werden.<br>Bitte überprüfe, ob der Video-Encoder richtig eingestellt ist.<br>Schau im Protokoll für weitere Informationen nach. - + Recording %1 %1 wird aufgenommen - + Playing %1 / %2 %1 / %2 wird abgespielt - + Movie Finished Aufnahme beendet - + (Accessing SharedExtData) (Zugriff auf SharedExtData) - + (Accessing SystemSaveData) (Zugriff auf SystemSaveData) - + (Accessing BossExtData) (Zugriff auf BossExtData) - + (Accessing ExtData) (Zugriff auf ExtData) - + (Accessing SaveData) (Zugriff auf SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic Traffic: %1 %2%3 - + Speed: %1% Geschwindigkeit: %1% - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Einzelbild: %1 ms - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + %1 fehlt. Bitte <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dumpe deine Systemdateien</a>.<br/>Das Fortfahren der Emulation könnte zu Abstürzen oder Problemen führen - + A system archive Ein Systemarchiv - + System Archive Not Found Systemarchiv nicht gefunden - + System Archive Missing Systemarchiv fehlt - + Save/load Error Speichern/Laden Fehler - + Fatal Error Schwerwiegender Fehler - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Ein fataler Fehler ist aufgetreten. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Checke den Log</a> für Details.<br/>Das Fortfahren der Emulation könnte zu Abstürzen oder Problemen führen. - + Fatal Error encountered Auf schwerwiegenden Fehler gestoßen - + Continue Fortsetzen - + Quit Application Beende die Anwendung - + OK O.K. - + Would you like to exit now? Möchtest du die Anwendung jetzt verlassen? - + The application is still running. Would you like to stop emulation? Die Anwendung läuft noch. Möchtest du die Emulation stoppen? - + Playback Completed Wiedergabe abgeschlossen - + Movie playback completed. Wiedergabe der Aufnahme abgeschlossen. - + Update Available Aktualisierung verfügbar - + Update %1 for Azahar is available. Would you like to download it? Für Azahar ist die Aktualisierung %1 verfügbar. Soll es heruntergeladen werden? - + Primary Window Hauptfenster - + Secondary Window Zweifenster @@ -5251,12 +5262,12 @@ Soll es heruntergeladen werden? Eject Cartridge - + Spielkarte Entfernen Insert Cartridge - + Spielkarte einsetzen @@ -5326,7 +5337,7 @@ Soll es heruntergeladen werden? Delete Vulkan Shader Cache - + Vulkan-Shader-Cache löschen @@ -5376,7 +5387,7 @@ Soll es heruntergeladen werden? Stress Test: App Launch - + Stress Test: App Starten @@ -6210,7 +6221,7 @@ Debug-Meldung: Loading %3 %1 / %2 - + Lade %3 %1 / %2 @@ -6579,12 +6590,12 @@ Debug-Meldung: Compress ROM File... - + Komprimiere ROM Datei... Decompress ROM File... - + Dekomprimiere Rom Datei... diff --git a/dist/languages/el.ts b/dist/languages/el.ts index d0a810058..504f20f7b 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -3805,19 +3805,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found Κατάσταση: Δεν βρέθηκε - + Status: Invalid Κατάσταση: Μη έγκυρο - + Status: IO Error Κατάσταση: Σφάλμα IO + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4228,12 +4238,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Προειδοποίηση - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4248,510 +4258,505 @@ It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Δεν εντοπίστηκαν κατάλληλες συσκευές Vulkan - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Η τρέχουσα ταχύτητα κίνησης του Artic. Οι υψηλότερες τιμές υποδεικνύουν μεγαλύτερους φόρτους μεταφορών. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Η τρέχουσα ταχύτητα εξομοίωσης. Οι τιμές που είναι μεγαλύτερες ή μικρότερες από 100% υποδεικνύουν ότι η εξομοίωση λειτουργεί πιο γρήγορα ή πιο αργά από ένα 3DS, αντίστοιχα. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Πόσα καρέ ανά δευτερόλεπτο εμφανίζει επί του παρόντος η εφαρμογή. Αυτό θα διαφέρει από εφαρμογή σε εφαρμογή και από σκηνικό σε σκηνικό. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Ο χρόνος που χρειάζεται για την εξομοίωση ενός καρέ 3DS, χωρίς να υπολογίζεται ο περιορισμός καρέ ή το v-sync. Για εξομοίωση σε πλήρη ταχύτητα, αυτό θα πρέπει να είναι το πολύ 16,67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) MicroProfile (μη διαθέσιμο) - + Clear Recent Files Απαλοιφή πρόσφατων αρχείων - + &Continue &Συνέχεια - + &Pause &Παύση - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Το Azahar εκτελεί μια εφαρμογή - - + + Invalid App Format Μη έγκυρη μορφή εφαρμογής - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Η μορφή της εφαρμογής σας δεν υποστηρίζεται.<br/>Ακολουθήστε τους οδηγούς για να κάνετε εκ νέου αποτύπωση των <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>κασετών</a> ή των <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>εγκατεστημένων τίτλων</a> σας. - + App Corrupted Κατεστραμμένη εφαρμογή - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted Κρυπτογραφημένη εφαρμογή - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Η εφαρμογή σας είναι κρυπτογραφημένη. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Ελέγξτε το ιστολόγιό μας για περισσότερες πληροφορίες.</a> - + Unsupported App Μη υποστηριζόμενη εφαρμογή - + GBA Virtual Console is not supported by Azahar. Η GBA Virtual Console δεν υποστηρίζεται από το Azahar. - - + + Artic Server Διακομιστής Artic - + Invalid system mode Μη έγκυρη λειτουργία συστήματος - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! Σφάλμα κατά τη φόρτωση της εφαρμογής! - + An unknown error occurred. Please see the log for more details. Προέκυψε άγνωστο σφάλμα. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες. - + CIA must be installed before usage Το CIA πρέπει να εγκατασταθεί πριν από τη χρήση - + Before using this CIA, you must install it. Do you want to install it now? Πριν από τη χρήση αυτού του CIA, πρέπει να το εγκαταστήσετε. Θέλετε να το εγκαταστήσετε τώρα; - + Quick Load Γρήγορη φόρτωση - + Quick Save Γρήγορη αποθήκευση - - + + Slot %1 Θέση %1 - + %2 %3 %2 %3 - + Quick Save - %1 Γρήγορη αποθήκευση - %1 - + Quick Load - %1 Γρήγορη φόρτωση - %1 - + Slot %1 - %2 %3 Θέση %1 - %2 %3 - + Error Opening %1 Folder Σφάλμα ανοίγματος %1 φακέλου - - + + Folder does not exist! Ο φάκελος δεν υπάρχει! - + Remove Play Time Data - + Reset play time? Επαναφορά χρόνου παιχνιδιού; - - - - + + + + Create Shortcut Δημιουργία συντόμευσης - + Do you want to launch the application in fullscreen? Θέλετε να εκκινήσετε την εφαρμογή σε πλήρη οθόνη; - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Δημηουργία εικονιδίου - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Αποτύπωση... - - + + Cancel Ακύρωση - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Δεν ήταν δυνατή η αποτύπωση του βασικού RomFS. Ανατρέξτε στο αρχείο καταγραφής για λεπτομέρειες. - + Error Opening %1 Σφάλμα ανοίγματος του «%1» - + Select Directory Επιλογή καταλόγου - + Properties Ιδιότητες - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Εκτελέσιμο 3DS (%1);;Όλα τα αρχεία (*.*) - + Load File Φόρτωση αρχείου - - + + Set Up System Files Ρύθμιση αρχείων συστήματος - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Για να χρησιμοποιήσετε ορισμένες από τις λειτουργίες του Azahar, απαιτούνται μοναδικά δεδομένα κονσόλας και αρχεία υλικολογισμικού από μια πραγματική κονσόλα.<br>Μπορείτε να ρυθμίσετε αυτά τα αρχεία και τα δεδομένα με το <a href=https://github.com/azahar-emu/ArticSetupTool>Εργαλείο ρύθμισης Azahar Artic</a><br>Σημειώσεις:<ul><li><b>Αυτή η ενέργεια θα εγκαταστήσει τα μοναδικά δεδομένα της κονσόλας στο Azahar. Μην κοινοποιήσετε τους φακέλους χρήστη ή nand<br>μετά την εκτέλεση της διαδικασίας ρύθμισης!</b></li><li>Κατά τη διαδικασία ρύθμισης, το Azahar θα συνδεθεί στην κονσόλα που εκτελεί το εργαλείο ρύθμισης. Μπορείτε να αποσυνδέσετε την<br>κονσόλα αργότερα, από την καρτέλα «Σύστημα» στο μενού διαμόρφωσης του εξομοιωτή.</li><li>Αφού ρυθμίσετε τα αρχεία συστήματος, φροντίστε να μην συνδέεστε στο διαδίκτυο με το Azahar και την κονσόλα 3DS σας ταυτόχρονα,<br>καθώς αυτό μπορεί να προκαλέσει προβλήματα.</li><li>Για να λειτουργήσει η ρύθμιση για συστήματα New 3DS, απαιτείται η ρύθμιση για Old 3DS (προτείνεται η εκτέλεση και των δύο τρόπων ρύθμισης).</li><li>Και οι δύο τρόποι ρύθμισης θα λειτουργήσουν ανεξάρτητα από το μοντέλο της κονσόλας που εκτελεί το εργαλείο ρύθμισης.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Εισαγάγετε τη διεύθυνση του εργαλείου ρύθμισης Azahar Artic: - + <br>Choose setup mode: <br>Επιλέξτε τρόπο ρύθμισης: - + (ℹ️) Old 3DS setup (ℹ️) Ρύθμιση για Old 3DS - - + + Setup is possible. Η ρύθμιση είναι δυνατή. - + (⚠) New 3DS setup (⚠) Ρύθμιση για New 3DS - + Old 3DS setup is required first. Απαιτείται πρώτα ρύθμιση για Old 3DS. - + (✅) Old 3DS setup (✅) Ρύθμιση για Old 3DS - - + + Setup completed. Η ρύθμιση ολοκληρώθηκε. - + (ℹ️) New 3DS setup (ℹ️) Ρύθμιση για New 3DS - + (✅) New 3DS setup (✅) Ρύθμιση για New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Φόρτωση αρχείων - + 3DS Installation File (*.cia *.zcia) Αρχείο εγκατάστασης 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Όλα τα αρχεία (*.*) - + Connect to Artic Base Σύνδεση στο Artic Base - + Enter Artic Base server address: Εισαγάγετε διεύθυνση διακομιστή Artic Base: - + %1 has been installed successfully. Το «%1» εγκαταστάθηκε επιτυχώς. - + Unable to open File Αδυναμία ανοίγματος του αρχείου - + Could not open %1 Δεν ήταν δυνατό το άνοιγμα του «%1» - + Installation aborted Η εγκατάσταση ακυρώθηκε - + The installation of %1 was aborted. Please see the log for more details Η εγκατάσταση του «%1» ακυρώθηκε. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες - + Invalid File Μη έγκυρο αρχείο - + %1 is not a valid CIA Το «%1» δεν είναι έγκυρο CIA - + CIA Encrypted Κρυπτογραφημένο CIA - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Αδυναμία εύρεσης του αρχείου - + Could not find %1 Δεν ήταν δυνατή η εύρεση του «%1» - - + + Z3DS Compression Συμπίεση Z3DS - + Failed to compress some files, check log for details. Η συμπίεση ορισμένων αρχείων απέτυχε, ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. - + Failed to decompress some files, check log for details. Η αποσυμπίεση ορισμένων αρχείων απέτυχε, ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. - + All files have been compressed successfully. Όλα τα αρχεία έχουν συμπιεστεί επιτυχώς. - + All files have been decompressed successfully. Όλα τα αρχεία έχουν αποσυμπιεστεί επιτυχώς. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. Έγινε επιτυχώς κατάργηση της εγκατάστασης του «%1». - + File not found Το αρχείο δεν βρέθηκε - + File "%1" not found Το αρχείο «%1» δεν βρέθηκε - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4760,86 +4765,86 @@ Use at your own risk! Χρησιμοποιήστε τες με δική σας ευθύνη! - - - + + + Error opening amiibo data file Σφάλμα κατά το άνοιγμα του αρχείου δεδομένων Amiibo - + A tag is already in use. Μια ετικέτα χρησιμοποιείται ήδη. - + Application is not looking for amiibos. Η εφαρμογή δεν αναζητά Amiibo. - + Amiibo File (%1);; All Files (*.*) Αρχείο Amiibo (%1);; Όλα τα αρχεία (*.*) - + Load Amiibo Φόρτωση Amiibo - + Unable to open amiibo file "%1" for reading. Δεν είναι δυνατό το άνοιγμα του αρχείου Amiibo «%1» για ανάγνωση. - + Record Movie Εγγραφή βίντεο - + Movie recording cancelled. Η εγγραφή βίντεο ακυρώθηκε. - - + + Movie Saved Το βίντεο αποθηκεύτηκε - - + + The movie is successfully saved. Το βίντεο αποθηκεύτηκε επιτυχώς. - + Application will unpause Η εφαρμογή θα συνεχιστεί - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Μη έγκυρος κατάλογος στιγμιότυπων - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4852,264 +4857,264 @@ To view a guide on how to install FFmpeg, press Help. Για να δείτε έναν οδηγό εγκατάστασης του FFmpeg, επιλέξτε «Βοήθεια». - + Load 3DS ROM Files Φόρτωση αρχείων ROM 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Αρχεία ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Συμπιεσμένο αρχείο ROM 3DS (*.%1) - + Save 3DS Compressed ROM File Αποθήκευση αρχείου συμπιεσμένης ROM 3DS - + Select Output 3DS Compressed ROM Folder Επιλογή φακέλου εξόδου συμπιεσμένης ROM 3DS - + Load 3DS Compressed ROM Files Φόρτωση αρχείων συμπιεσμένων ROM 3DS - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Συμπιεσμένα αρχεία ROM 3DS (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Αρχείο ROM 3DS (*.%1) - + Save 3DS ROM File Αποθήκευση αρχείου ROM 3DS - + Select Output 3DS ROM Folder Επιλογή φακέλου εξόδου ROM 3DS - + Select FFmpeg Directory Επιλογή καταλόγου FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. Το FFmpeg έχει εγκατασταθεί επιτυχώς. - + Installation of FFmpeg failed. Check the log file for details. Η εγκατάσταση του FFmpeg απέτυχε. Ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Εγγραφή %1 - + Playing %1 / %2 Αναπαραγωγή %1 / %2 - + Movie Finished Το βίντεο τελείωσε - + (Accessing SharedExtData) (Πρόσβαση στα SharedExtData) - + (Accessing SystemSaveData) (Πρόσβαση στα SystemSaveData) - + (Accessing BossExtData) (Πρόσβαση στα BossExtData) - + (Accessing ExtData) (Πρόσβαση στα ExtData) - + (Accessing SaveData) (Πρόσβαση στα SaveData) - + MB/s MB/δ - + KB/s KB/δ - + Artic Traffic: %1 %2%3 Κίνηση Artic: %1 %2%3 - + Speed: %1% Ταχύτητα: %1% - + Speed: %1% / %2% Ταχύτητα: %1% / %2% - + App: %1 FPS Εφαρμογή: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Καρέ: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Καρέ: %1 ms - + VOLUME: MUTE ΕΝΤΑΣΗ: ΣΙΓΑΣΗ - + VOLUME: %1% Volume percentage (e.g. 50%) ΕΝΤΑΣΗ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Ένα αρχείο συστήματος - + System Archive Not Found Δεν βρέθηκε αρχείο συστήματος - + System Archive Missing Απουσία αρχείου συστήματος - + Save/load Error Σφάλμα αποθήκευσης/φόρτωσης - + Fatal Error Κρίσιμο σφάλμα - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Προέκυψε κρίσιμο σφάλμα - + Continue Συνέχεια - + Quit Application Έξοδος από την εφαρμογή - + OK OK - + Would you like to exit now? Θέλετε να κλείσετε το πρόγραμμα τώρα; - + The application is still running. Would you like to stop emulation? Η εφαρμογή εκτελείται ακόμα. Θέλετε να διακόψετε την εξομοίωση; - + Playback Completed Η αναπαραγωγή ολοκληρώθηκε - + Movie playback completed. Η αναπαραγωγή βίντεο ολοκληρώθηκε. - + Update Available Διαθέσιμη ενημέρωση - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Κύριο παράθυρο - + Secondary Window Δευτερεύον παράθυρο diff --git a/dist/languages/es_419.ts b/dist/languages/es_419.ts new file mode 100644 index 000000000..c0727c6d9 --- /dev/null +++ b/dist/languages/es_419.ts @@ -0,0 +1,7815 @@ + + + + + ARMRegisters + + + ARM Registers + Registros de ARM + + + + Register + Registro + + + + Value + Valor + + + + AboutDialog + + + About Azahar + Acerca de Azahar + + + + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> + + + + <html><head/><body><p><span style=" font-size:28pt;">Azahar</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Azahar</span></p></body></html> + + + + <html><head/><body><p>%1 | %2-%3 (%4)</p></body></html> + <html><head/><body><p>%1 | %2-%3 (%4)</p></body></html> + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Azahar is a free and open source 3DS emulator licensed under GPLv2.0 or any later version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">This software should not be used to play games you have not legally obtained.</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Azahar es un emulador gratuito y de código abierto con licencia GPLv2.0 o cualquier versión posterior.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Este software no debe usarse para jugar juegos obtenidos por medios no legales.</span></p></body></html> + + + + <html><head/><body><p><a href="https://azahar-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/azahar-emu/azahar"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/azahar-emu/azahar/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/azahar-emu/azahar/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://azahar-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Sitio Web</span></a> | <a href="https://github.com/azahar-emu/azahar"><span style=" text-decoration: underline; color:#039be5;">Código Fuente</span></a> | <a href="https://github.com/azahar-emu/azahar/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://github.com/azahar-emu/azahar/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Licencia</span></a></p></body></html> + + + + <html><head/><body><p><span style=" font-size:7pt;">&quot;3DS&quot; is a trademark of Nintendo. Azahar is not affiliated with Nintendo in any way.</span></p></body></html> + <html><head/><body><p><span style=" font-size:7pt;">&quot;3DS&quot; es una marca registrada de Nintendo. Azahar no está afiliada con Nintendo de ninguna manera.</span></p></body></html> + + + + BreakPointModel + + + Pica command loaded + Comando Pica cargado + + + + Pica command processed + Comando Pica procesado + + + + Incoming primitive batch + Iniciando lote primitivo + + + + Finished primitive batch + Lote primitivo terminado + + + + Vertex shader invocation + Invocación del sombreador de vértices + + + + Incoming display transfer + Iniciando transferencia de pantalla + + + + GSP command processed + Comando de GSP procesado + + + + Buffers swapped + Buffers intercambiados + + + + Unknown debug context event + Evento de depuración desconocido + + + + CalibrationConfigurationDialog + + + Communicating with the server... + Conectando con el servidor... + + + + Cancel + Cancelar + + + + Touch the top left corner <br>of your touchpad. + Toca la esquina superior izquierda <br>del panel táctil. + + + + Now touch the bottom right corner <br>of your touchpad. + Ahora toca la esquina inferior derecha <br>del panel táctil. + + + + Configuration completed! + ¡Configuración completada! + + + + OK + OK + + + + ChatRoom + + + Room Window + Ventana de Sala + + + + Send Chat Message + Enviar Mensaje de Chat + + + + Send Message + Enviar Mensaje + + + + Members + Miembros + + + + %1 has joined + %1 se ha unido + + + + %1 has left + %1 se ha ido + + + + %1 has been kicked + %1 ha sido expulsado + + + + %1 has been banned + %1 ha sido baneado + + + + %1 has been unbanned + %1 ha sido desbaneado + + + + View Profile + Ver Perfil + + + + + Block Player + Bloquear jugador + + + + When you block a player, you will no longer receive chat messages from them.<br><br>Are you sure you would like to block %1? + Cuando bloqueas a un jugador, ya no recibirás más mensajes de chat de su parte.<br><br>¿Estás seguro de que quieres bloquear a %1? + + + + Kick + Expulsar + + + + Ban + Banear + + + + Kick Player + Expulsar jugador + + + + Are you sure you would like to <b>kick</b> %1? + ¿Estás seguro que quieres <b>expulsar</b> a %1? + + + + Ban Player + Banear jugador + + + + Are you sure you would like to <b>kick and ban</b> %1? + +This would ban both their forum username and their IP address. + ¿Estás seguro que quieres <b>expulsar y banear</b> a %1? + +Esto baneará su nombre de usuario de foro y su dirección IP. + + + + ClientRoom + + + Room Window + Ventana de Sala + + + + Room Description + Descripción de la sala + + + + Moderation... + Moderación... + + + + Leave Room + Abandonar la Sala + + + + ClientRoomWindow + + + Connected + Conectado + + + + Disconnected + Desconectado + + + + %1 (%2/%3 members) - connected + %1 (%2/%3 miembro/s) - conectado/s + + + + ConfigureAudio + + + Output + Salida + + + + Emulation + Emulación + + + + HLE (fast) + HLE (rápido) + + + + LLE (accurate) + LLE (preciso) + + + + LLE multi-core + LLE multinúcleo + + + + Output Type + Tipo de salida + + + + Output Device + Dispositivo de salida + + + + <html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html> + <html><head/><body><p>Este efecto de post-procesado ajusta la velocidad del audio para igualarla a la velocidad del emulador. Aunque también aumenta su latencia.</p></body></html> + + + + Enable audio stretching + Activar extensión de audio + + + + <html><head/><body><p>Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the application framerate is low. May cause audio desync issues.</p></body></html> + <html><head/><body><p>Ajusta la velocidad de reproducción de audio para tener en cuenta las caidas de fotogramas. El audio se reproducirá a velocidad completa pese a que los fotogramas de la aplicación sean bajos. Puede causar problemas de desincronización.</p></body></html> + + + + Enable realtime audio + Activar audio en tiempo real + + + + Use global volume + Usar volumen global + + + + Set volume: + Establecer volumen: + + + + Volume: + Volumen: + + + + 0 % + 0 % + + + + Microphone + Micrófono + + + + Input Type + Tipo de Entrada + + + + Input Device + Dispositivo de Entrada + + + + + Auto + Auto + + + + %1% + Volume percentage (e.g. 50%) + %1% + + + + ConfigureCamera + + + Form + Formulario + + + + + Camera + Cámara + + + + + Select the camera to configure + Elija la cámara que quiera configurar + + + + Camera to Configure + Configurar la cámara + + + + Front + Frontal + + + + Rear + Trasera + + + + + Select the camera mode (single or double) + Seleccione el modo de cámara (única o doble) + + + + Camera mode + Modo de cámara + + + + Single (2D) + Única (2D) + + + + Double (3D) + Doble (3D) + + + + + Select the position of camera to configure + Elija la posición de la cámara que quiera configurar + + + + Camera position + Posición de la cámara + + + + Left + Izquierda + + + + Right + Derecha + + + + Configuration + Configuración + + + + + <html><head/><body><p>Select where the image of the emulated camera comes from. It may be an image or a real camera.</p></body></html> + <html><head/><body><p>Selecciona el lugar de donde proviene la imagen de la cámara emulada. Puede ser una imagen o una cámara real.</p></body></html> + + + + Camera Image Source + Fuente de la Imagen de la Cámara + + + + Blank (blank) + Vacío (vacío) + + + + Still Image (image) + Imagen Fija (imagen) + + + + System Camera (qt) + Cámara del Sistema (qt) + + + + File + Archivo + + + + ... + ... + + + + + Select the system camera to use + Elija la cámara del sistema que quiera usar + + + + <Default> + <Default> + + + + + Select the image flip to apply + Seleccione la rotación de imagen + + + + Flip + Rotación + + + + None + Ninguna + + + + Horizontal + Horizontal + + + + Vertical + Vertical + + + + Reverse + Invertida + + + + Select an image file every time before the camera is loaded + Seleccione una imagen antes de que la cámara se ejecute + + + + Prompt before load + Preguntar antes de cargar + + + + Preview + Vista previa + + + + Resolution: 512*384 + Resolución: 512*384 + + + + Click to preview + Haga click para ver la vista previa + + + + Resolution: %1*%2 + Resolución: %1*%2 + + + + Supported image files (%1) + Archivos de imagen soportados (%1) + + + + Open File + Abrir Archivo + + + + ConfigureCheats + + + + Cheats + Trucos + + + + Add Cheat + Añadir Truco + + + + Available Cheats: + Trucos Disponibles: + + + + Name + Nombre + + + + Type + Tipo + + + + Save + Guardar + + + + Delete + Eliminar + + + + Name: + Nombre: + + + + Notes: + Notas: + + + + Code: + Código: + + + + Would you like to save the current cheat? + ¿Quieres guardar el truco actual? + + + + + + Save Cheat + Guardar Truco + + + + Please enter a cheat name. + Por favor, ponle un nombre al truco. + + + + Please enter the cheat code. + Por favor, introduzca el código del truco. + + + + Cheat code line %1 is not valid. +Would you like to ignore the error and continue? + La línea del código del truco %1 no es válida. +¿Desea ignorar el error y continuar? + + + + + [new cheat] + [nuevo truco] + + + + ConfigureDebug + + + Form + Formulario + + + + GDB + GDB + + + + Enable GDB Stub + Habilitar Stub de GDB + + + + Port: + Puerto: + + + + Logging + Registro + + + + Global Log Filter + Filtro de Registro Global + + + + Regex Log Filter + Filtro de Registro de Regex + + + + Show log output in console + Mostrar la salida del registro en la consola + + + + Open Log Location + Abrir Ubicación del Registro + + + + Flush log output on every message + Limpiar la salida del registro en cada mensaje + + + + <html><body>Immediately commits the debug log to file. Use this if Azahar crashes and the log output is being cut.<br>Enabling this feature will decrease performance, only use it for debugging purposes.</body></html> + <html><body>Envía inmediatamente el registro de depuración a un archivo. Úsalo si Azahar falla y se corta la salida del registro.<br>Habilitar esta función disminuirá el rendimiento; úsala solo para fines de depuración.</body></html> + + + + CPU + CPU + + + + Use global clock speed + Usar la velocidad del reloj global + + + + Set clock speed: + Establecer la velocidad del reloj: + + + + CPU Clock Speed + Velocidad de reloj de la CPU + + + + <html><body>Changes the emulated CPU clock frequency.<br>Underclocking can increase performance but may cause the application to freeze.<br>Overclocking may reduce application lag but also might cause freezes</body></html> + <html><body>Cambia la frecuencia de reloj de la CPU emulada.<br>Hacer underclock puede mejorar el rendimiento, pero puede causar que la aplicación se cuelgue.<br>Hacer overclock puede reducir el lag, pero también causar que la aplicación se cuelgue.</body></html> + + + + <html><head/><body>Underclocking can increase performance but may cause the application to freeze.<br/>Overclocking may reduce lag in applications but also might cause freezes</p></body></html> + <html><head/><body>Hacer un underclock puede aumentar el rendimiento, pero también provocar que se cuelgue la aplicación.<br/>Hacer un overclock puede reducir el lag en la aplicación, pero también puede producir cuelgues.</p></body></html> + + + + <html><head/><body><p>Enables the use of the ARM JIT compiler for emulating the 3DS CPUs. Don't disable unless for debugging purposes</p></body></html> + <html><head/><body><p>Habilita el uso del compilador ARM JIT para emular las CPU de 3DS. No deshabilitar a menos que sea para fines de depuración.</p></body></html> + + + + Enable CPU JIT + Activar CPU JIT + + + + Enable debug renderer + Activar renderizador de depuración + + + + Dump command buffers + Volcar buffers de comandos + + + + Miscellaneous + Misceláneo + + + + <html><head/><body><p>Introduces a delay to the first ever launched app thread if LLE modules are enabled, to allow them to initialize.</p></body></html> + Introduce un retraso en el primer hilo de la aplicación que se ejecuta si los módulos LLE están habilitados, para permitir que se inicien. + + + + Delay app start for LLE module initialization + Atrasar el inicio de la app para la inicialización del módulo LLE + + + + <html><head/><body><p>Toggles the unique data console type (Old 3DS ↔ New 3DS) to be able to download the opposite system firmware type from system settings.</p></body></html> + Permite alternar el tipo de consola (Old 3DS &#8596 New 3DS) para poder descargar el firmware del sistema opuesto desde la configuración del sistema. + + + + Toggle unique data console type + Alternar tipo de consola + + + + Force deterministic async operations + Forzar operaciones asíncronas deterministas + + + + <html><head/><body><p>Forces all async operations to run on the main thread, making them deterministic. Do not enable if you don't know what you are doing.</p></body></html> + <html><head/><body><p>Fuerza a que todas las operaciones asíncronas se ejecuten en el hilo principal, haciéndolas deterministas. No habilites esta opción si no sabes lo que estás haciendo.</p></body></html> + + + + Enable RPC server + Activar servidor RPC + + + + <html><head/><body><p>Enables the RPC server on port 45987. This allows remotely reading/writing guest memory, do not enable if you don't know what you are doing.</p></body></html> + + + + + Validation layer not available + Capa de validación no disponible + + + + Unable to enable debug renderer because the layer <strong>VK_LAYER_KHRONOS_validation</strong> is missing. Please install the Vulkan SDK or the appropriate package of your distribution + + + + + Command buffer dumping not available + + + + + Unable to enable command buffer dumping because the layer <strong>VK_LAYER_LUNARG_api_dump</strong> is missing. Please install the Vulkan SDK or the appropriate package of your distribution + + + + + ConfigureDialog + + + Azahar Configuration + Configuración de Azahar + + + + + + General + General + + + + + + System + Sistema + + + + + Input + Controles + + + + + Hotkeys + Teclas de Atajo + + + + + Graphics + Gráficos + + + + + Enhancements + Mejoras + + + + + Layout + Estilo + + + + + + Audio + Audio + + + + + Camera + Cámara + + + + + Debug + Depuración + + + + + Storage + Almacenamiento + + + + + Web + Web + + + + + UI + + + + + Controls + Controles + + + + Advanced + Avanzado + + + + ConfigureEnhancements + + + Form + Formulario + + + + Renderer + Renderizador + + + + Internal Resolution + Resolución interna + + + + Auto (Window Size) + Auto (Tamaño Ventana) + + + + Native (400x240) + Nativa (400x240) + + + + 2x Native (800x480) + 2x Nativa (800x480) + + + + 3x Native (1200x720) + 3x Nativa (1200x720) + + + + 4x Native (1600x960) + 4x Nativa (1600x960) + + + + 5x Native (2000x1200) + 5x Nativa (2000x1200) + + + + 6x Native (2400x1440) + 6x Nativa (2400x1440) + + + + 7x Native (2800x1680) + 7x Nativa (2800x1680) + + + + 8x Native (3200x1920) + 8x Nativa (3200x1920) + + + + 9x Native (3600x2160) + 9x Nativa (3600x2160) + + + + 10x Native (4000x2400) + 10x Nativa (4000x2400) + + + + Use Integer Scaling + Restringir el escalado a múltiplos enteros + + + + <html><head/><body><p>Use Integer Scaling</p><p>Enforces that the larger screen in all layouts is an integer scale of the 240px height of the original 3DS screen.</p></body></html> + + + + + Enable Linear Filtering + Activar Filtro Linear + + + + Post-Processing Shader + Sombreado de post-procesado + + + + Texture Filter + Filtro de texturas + + + + None + Ninguno + + + + Anime4K + Anime4K + + + + Bicubic + Bicúbico + + + + ScaleForce + ScaleForce + + + + xBRZ + xBRZ + + + + MMPX + MMPX + + + + Stereoscopy + Estereoscopia + + + + Stereoscopic 3D Mode + Modo 3D Estereoscópico + + + + Off + Apagado + + + + Side by Side + De lado a lado + + + + Side by Side Full Width + De lado a lado ancho completo + + + + Anaglyph + Anáglifo + + + + Interlaced + Entrelazado + + + + Reverse Interlaced + Entrelazado inverso + + + + Depth + Profundidad + + + + % + % + + + + Note: Depth values over 100% are not possible on real hardware and may cause graphical issues + + + + + Eye to Render in Monoscopic Mode + Ojo para renderizar en modo monoscópico + + + + Left Eye (default) + Ojo izquierdo (predeterminado) + + + + Right Eye + Ojo derecho + + + + Disable Right Eye Rendering + Desactivar Renderizado del Ojo Derecho + + + + <html><head/><body><p>Disable Right Eye Rendering</p><p>Disables rendering the right eye image when not using stereoscopic mode. Greatly improves performance in some applications, but can cause flickering in others.</p></body></html> + + + + + Swap Eyes + Intercambiar Ojos + + + + Utility + Utilidad + + + + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> + + + + + Use custom textures + Usar texturas personalizadas + + + + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> + + + + + Dump textures + Volcar texturas + + + + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> + + + + + Preload custom textures + Precargar texturas personalizadas + + + + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> + + + + + Async custom texture loading + Carga de Texturas Personalizadas Asíncrona + + + + ConfigureGeneral + + + Form + Formulario + + + + Updates + Actualizaciones + + + + Check for updates + Buscar actualizaciones + + + + Update Channel + Canal de actualización + + + + Stable + Estable + + + + Prerelease + Prelanzamiento + + + + General + General + + + + Confirm exit while emulation is running + Confirmar salida durante la emulación + + + + Pause emulation when in background + Pausar emulación al estar en segundo plano + + + + Mute audio when in background + Silenciar audio al estar en segundo plano + + + + Hide mouse on inactivity + Ocultar ratón durante inactividad + + + + Enable Gamemode + Activar Gamemode + + + + Emulation + Emulación + + + + Use global emulation speed + Usar la velocidad de emulación global + + + + Set emulation speed + Establecer la velocidad de emulación + + + + Emulation Speed + Velocidad de Emulación + + + + Turbo Speed Limit: + Límite de Velocidad del Turbo: + + + + Screenshots + Capturas de pantalla + + + + Use global screenshot path + Usar ruta de captura de pantalla global + + + + Set screenshot path: + Establecer ruta de capturas de pantalla: + + + + Save Screenshots To + Guardar capturas a + + + + ... + ... + + + + Reset All Settings + Reiniciar Toda la Configuración + + + + + + + + unthrottled + + + + + Select Screenshot Directory + Seleccione el directorio de capturas de pantalla + + + + Azahar + Azahar + + + + Are you sure you want to <b>reset your settings</b> and close Azahar? + ¿Estás seguro que quieres <b> reinicia tus ajustes</b> y cerrar Azahar? + + + + ConfigureGraphics + + + Form + Formulario + + + + Graphics + Gráficos + + + + API Settings + Configuración de la API + + + + Graphics API + API gráfica + + + + Software + Software + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Physical Device + Dispositivo Físico + + + + OpenGL Renderer + Renderizador OpenGL + + + + SPIR-V shader generation + Generación de shaders SPIR-V + + + + Disable GLSL -> SPIR-V optimizer + Desactivar el optimizador GLSL -> SPIR-V + + + + <html><head/><body><p>Disables the SPIR-V optimization pass, reducing stuttering considerably while barely affecting performance.</p></body></html> + + + + + Renderer + Renderizador + + + + <html><head/><body><p>Use the selected graphics API to accelerate shader emulation.</p><p>Requires a relatively powerful GPU for better performance.</p></body></html> + + + + + Enable hardware shader + Activar Sombreador de Hardware + + + + <html><head/><body><p>Correctly handle all edge cases in multiplication operation in shaders. </p><p>Some applications requires this to be enabled for the hardware shader to render properly.</p><p>However this would reduce performance in most applications.</p></body></html> + + + + + Accurate multiplication + Multiplicación Precisa + + + + <html><head/><body><p>Use the JIT engine instead of the interpreter for software shader emulation. </p><p>Enable this for better performance.</p></body></html> + + + + + Enable shader JIT + Activar Sombreado JIT + + + + <html><head/><body><p>Compile shaders using background threads to avoid shader compilation stutter. Expect temporary graphical glitches</p></body></html> + + + + + Enable async shader compilation + + + + + <html><head/><body><p>Perform presentation on separate threads. Improves performance when using Vulkan in most applications. Adds ~1 frame of input lag.</p></body></html> + + + + + Enable async presentation + + + + + Advanced + Avanzado + + + + <html><head/><body><p>Overrides the sampling filter used by applications. This can be useful in certain cases with poorly behaved applications when upscaling. If unsure, set this to Application Controlled</p></body></html> + + + + + Texture Sampling + + + + + Application Controlled + + + + + Nearest Neighbor + + + + + Linear + + + + + <html><head/><body><p>Reduce stuttering by storing and loading generated shaders to disk.</p></body></html> + + + + + Use disk shader cache + + + + + <html><head/><body><p>VSync prevents the screen from tearing, but some graphics cards have lower performance with VSync enabled. Keep it enabled if you don't notice a performance difference.</p></body></html> + + + + + Enable VSync + + + + + <html><head/><body><p>When enabled, this setting detects when the refresh rate of the screen is below that of the 3DS, and when it is, disables VSync automatically to avoid emulation speed being forced below 100%.</p></body></html> + + + + + Enable display refresh rate detection + + + + + Use global + + + + + Use per-application + + + + + Delay Application Render Thread + + + + + <html><head/><body><p>Delays the emulated application render thread the specified amount of milliseconds every time it submits render commands to the GPU.</p><p>Adjust this feature in the (very few) dynamic framerate applications to fix performance issues.</p></body></html> + + + + + ConfigureHotkeys + + + Hotkey Settings + + + + + Double-click on a binding to change it. + + + + + Clear All + + + + + Restore Defaults + + + + + Action + + + + + Hotkey + + + + + + Toggle Turbo Mode + + + + + + Toggle Per-Application Speed + + + + + + + Conflicting Key Sequence + + + + + The per-application speed and turbo speed hotkeys cannot be bound at the same time. + + + + + The entered key sequence is already assigned to: %1 + + + + + A 3ds button + + + + + Restore Default + + + + + Clear + + + + + The default key sequence is already assigned to: %1 + + + + + ConfigureInput + + + ConfigureInput + + + + + Profile + + + + + New + + + + + Delete + Eliminar + + + + Rename + + + + + Shoulder Buttons + + + + + ZR: + + + + + L: + + + + + ZL: + + + + + R: + + + + + Face Buttons + + + + + Y: + + + + + X: + + + + + B: + + + + + A: + + + + + Directional Pad + + + + + + + Up: + + + + + + + Down: + + + + + + + Left: + + + + + + + Right: + + + + + Misc. + + + + + Start: + + + + + Select: + + + + + Home: + + + + + Power: + + + + + Circle Mod: + + + + + GPIO14: + + + + + Debug: + + + + + Circle Pad + + + + + + Up Left: + + + + + + Deadzone: 0 + + + + + + + Set Analog Stick + + + + + + Up Right: + + + + + + Diagonals + + + + + + Down Right: + + + + + + Down Left: + + + + + C-Stick + + + + + Motion / Touch... + + + + + Auto Map + + + + + Clear All + + + + + Restore Defaults + + + + + Use Artic Controller when connected to Artic Base Server + + + + + + + Clear + + + + + + + [not set] + + + + + + + Restore Default + + + + + + Information + + + + + After pressing OK, first move your joystick horizontally, and then vertically. + + + + + + Deadzone: %1% + + + + + + Modifier Scale: %1% + + + + + Warning + + + + + Auto mapping failed. Your controller may not have a corresponding mapping + + + + + After pressing OK, press any button on your joystick + + + + + [press key] + + + + + Error! + + + + + You're using a key that's already bound. + + + + + New Profile + + + + + Enter the name for the new profile. + + + + + Delete Profile + + + + + Delete profile %1? + + + + + Rename Profile + + + + + New name: + + + + + Duplicate profile name + + + + + Profile name already exists. Please choose a different name. + + + + + ConfigureLayout + + + Form + Formulario + + + + Screens + + + + + Screen Layout + + + + + Default + + + + + Single Screen + + + + + Large Screen + + + + + Side by Side + De lado a lado + + + + Separate Windows + + + + + Hybrid Screen + + + + + + Custom Layout + + + + + Rotate screens upright + + + + + Swap screens + + + + + Customize layout cycling + + + + + Screen Gap + + + + + Large Screen Proportion + + + + + Small Screen Position + + + + + Upper Right + + + + + Middle Right + + + + + Bottom Right (default) + + + + + Upper Left + + + + + Middle Left + + + + + Bottom Left + + + + + Above large screen + + + + + Below large screen + + + + + Background Color + + + + + + Top Screen + + + + + + X Position + + + + + + + + + + + + + + + + px + + + + + + Y Position + + + + + + Width + + + + + + Height + + + + + + Bottom Screen + + + + + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + + + + + Single Screen Layout + + + + + + Stretch + + + + + + Left/Right Padding + + + + + + Top/Bottom Padding + + + + + Note: These settings affect the Single Screen and Separate Windows layouts + + + + + ConfigureLayoutCycle + + + Configure Layout Cycling + + + + + Screen Layout Cycling Customization + + + + + Select which screen layout options should be cycled with the "Toggle Screen Layout" hotkey + + + + + Use Global Value + + + + + Default + + + + + Single Screen + + + + + Large Screen + + + + + Side by Side + De lado a lado + + + + Separate Windows + + + + + Hybrid + + + + + Custom + + + + + No Layout Selected + + + + + Please select at least one layout option to cycle through. + + + + + ConfigureMotionTouch + + + Configure Motion / Touch + + + + + Motion + + + + + Motion Provider: + + + + + Sensitivity: + + + + + Controller: + + + + + + + + + + + Configure + + + + + Touch + + + + + Touch Provider: + + + + + Calibration: + + + + + (100, 50) - (1800, 850) + + + + + Use button mapping: + + + + + Map touchpads on controllers like the DualSense directly to touch + + + + + Use controller touchpad + + + + + CemuhookUDP Config + + + + + You may use any Cemuhook compatible UDP input source to provide motion and touch input. + + + + + Server: + + + + + Port: + Puerto: + + + + Pad: + + + + + Pad 1 + + + + + Pad 2 + + + + + Pad 3 + + + + + Pad 4 + + + + + Learn More + + + + + + Test + + + + + Mouse (Right Click) + + + + + + CemuhookUDP + + + + + SDL + + + + + Emulator Window + + + + + <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> + + + + + + Information + + + + + After pressing OK, press a button on the controller whose motion you want to track. + + + + + [press button] + + + + + After pressing OK, tap the touchpad on the controller you want to track. + + + + + [press touchpad] + + + + + Testing + + + + + Configuring + + + + + Test Successful + + + + + Successfully received data from the server. + + + + + Test Failed + + + + + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. + + + + + Azahar + Azahar + + + + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. + + + + + ConfigurePerGame + + + Dialog + + + + + Info + + + + + Size + + + + + Format + + + + + Name + Nombre + + + + Filepath + + + + + Title ID + + + + + Reset Per-Application Settings + + + + + Use global configuration (%1) + + + + + General + General + + + + System + Sistema + + + + Enhancements + Mejoras + + + + Layout + Estilo + + + + Graphics + Gráficos + + + + Audio + Audio + + + + Debug + Depuración + + + + Cheats + Trucos + + + + Properties + + + + + Azahar + Azahar + + + + Are you sure you want to <b>reset your settings for this application</b>? + + + + + ConfigureStorage + + + Form + Formulario + + + + Storage + Almacenamiento + + + + Use virtual SD card + + + + + Custom Storage + + + + + Use custom storage location + + + + + NAND Directory + + + + + + Open + + + + + + NOTE: This does not move the contents of the previous directory to the new one. + + + + + + Change + + + + + SDMC Directory + + + + + Compress installed CIA content + + + + + <html><head/><body><p>Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled.</p></body></html> + + + + + Select NAND Directory + + + + + Select SDMC Directory + + + + + ConfigureSystem + + + Form + Formulario + + + + System Settings + + + + + Enable New 3DS mode + + + + + Use LLE applets (if installed) + + + + + Enable required LLE modules for +online features (if installed) + + + + + Enables the LLE modules needed for online multiplayer, eShop access, etc. + + + + + Region + + + + + Auto-select + + + + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + + Username + + + + + Birthday + + + + + January + + + + + February + + + + + March + + + + + April + + + + + May + + + + + June + + + + + July + + + + + August + + + + + September + + + + + October + + + + + November + + + + + December + + + + + Language + + + + + Note: this can be overridden when region setting is auto-select + + + + + Japanese (日本語) + + + + + English + + + + + French (français) + + + + + German (Deutsch) + + + + + Italian (italiano) + + + + + Spanish (español) + + + + + Simplified Chinese (简体中文) + + + + + Korean (한국어) + + + + + Dutch (Nederlands) + + + + + Portuguese (português) + + + + + Russian (Русский) + + + + + Traditional Chinese (正體中文) + + + + + Sound output mode + + + + + Mono + + + + + Stereo + + + + + Surround + + + + + Country + + + + + Clock + + + + + System Clock + + + + + Fixed Time + + + + + Startup time + + + + + yyyy-MM-ddTHH:mm:ss + + + + + Offset time + + + + + days + + + + + HH:mm:ss + + + + + Initial System Ticks + + + + + Random + + + + + Fixed + + + + + Initial System Ticks Override + + + + + Play Coins + + + + + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> + + + + + Pedometer Steps per Hour + + + + + Run System Setup when Home Menu is launched + + + + + Console ID: + + + + + + Regenerate + + + + + MAC: + + + + + 3GX Plugin Loader + + + + + Enable 3GX plugin loader + + + + + Allow applications to change plugin loader state + + + + + Real Console Unique Data + + + + + Your real console is linked to Azahar. + + + + + Unlink + + + + + OTP + + + + + + + + Choose + + + + + SecureInfo_A/B + + + + + LocalFriendCodeSeed_A/B + + + + + movable.sed + + + + + System settings are available only when applications is not running. + + + + + Japan + + + + + Anguilla + + + + + Antigua and Barbuda + + + + + Argentina + + + + + Aruba + + + + + Bahamas + + + + + Barbados + + + + + Belize + + + + + Bolivia + + + + + Brazil + + + + + British Virgin Islands + + + + + Canada + + + + + Cayman Islands + + + + + Chile + + + + + Colombia + + + + + Costa Rica + + + + + Dominica + + + + + Dominican Republic + + + + + Ecuador + + + + + El Salvador + + + + + French Guiana + + + + + Grenada + + + + + Guadeloupe + + + + + Guatemala + + + + + Guyana + + + + + Haiti + + + + + Honduras + + + + + Jamaica + + + + + Martinique + + + + + Mexico + + + + + Montserrat + + + + + Netherlands Antilles + + + + + Nicaragua + + + + + Panama + + + + + Paraguay + + + + + Peru + + + + + Saint Kitts and Nevis + + + + + Saint Lucia + + + + + Saint Vincent and the Grenadines + + + + + Suriname + + + + + Trinidad and Tobago + + + + + Turks and Caicos Islands + + + + + United States + + + + + Uruguay + + + + + US Virgin Islands + + + + + Venezuela + + + + + Albania + + + + + Australia + + + + + Austria + + + + + Belgium + + + + + Bosnia and Herzegovina + + + + + Botswana + + + + + Bulgaria + + + + + Croatia + + + + + Cyprus + + + + + Czech Republic + + + + + Denmark + + + + + Estonia + + + + + Finland + + + + + France + + + + + Germany + + + + + Greece + + + + + Hungary + + + + + Iceland + + + + + Ireland + + + + + Italy + + + + + Latvia + + + + + Lesotho + + + + + Liechtenstein + + + + + Lithuania + + + + + Luxembourg + + + + + Macedonia + + + + + Malta + + + + + Montenegro + + + + + Mozambique + + + + + Namibia + + + + + Netherlands + + + + + New Zealand + + + + + Norway + + + + + Poland + + + + + Portugal + + + + + Romania + + + + + Russia + + + + + Serbia + + + + + Slovakia + + + + + Slovenia + + + + + South Africa + + + + + Spain + + + + + Swaziland + + + + + Sweden + + + + + Switzerland + + + + + Turkey + + + + + United Kingdom + + + + + Zambia + + + + + Zimbabwe + + + + + Azerbaijan + + + + + Mauritania + + + + + Mali + + + + + Niger + + + + + Chad + + + + + Sudan + + + + + Eritrea + + + + + Djibouti + + + + + Somalia + + + + + Andorra + + + + + Gibraltar + + + + + Guernsey + + + + + Isle of Man + + + + + Jersey + + + + + Monaco + + + + + Taiwan + + + + + South Korea + + + + + Hong Kong + + + + + Macau + + + + + Indonesia + + + + + Singapore + + + + + Thailand + + + + + Philippines + + + + + Malaysia + + + + + China + + + + + United Arab Emirates + + + + + India + + + + + Egypt + + + + + Oman + + + + + Qatar + + + + + Kuwait + + + + + Saudi Arabia + + + + + Syria + + + + + Bahrain + + + + + Jordan + + + + + San Marino + + + + + Vatican City + + + + + Bermuda + + + + + Select SecureInfo_A/B + + + + + SecureInfo_A/B (SecureInfo_A SecureInfo_B);;All Files (*.*) + + + + + Select LocalFriendCodeSeed_A/B + + + + + LocalFriendCodeSeed_A/B (LocalFriendCodeSeed_A LocalFriendCodeSeed_B);;All Files (*.*) + + + + + Select encrypted OTP file + + + + + Binary file (*.bin);;All Files (*.*) + + + + + Select movable.sed + + + + + Sed file (*.sed);;All Files (*.*) + + + + + + Console ID: 0x%1 + + + + + + MAC: %1 + + + + + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? + + + + + + + Warning + + + + + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? + + + + + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? + + + + + Invalid country for configured region + + + + + Invalid country for console unique data + + + + + Status: Loaded + + + + + Status: Loaded (Invalid Signature) + + + + + Status: Loaded (Region Changed) + + + + + Status: Loaded (Cannot Validate Signature) + + + + + Status: Not Found + + + + + Status: Invalid + + + + + Status: IO Error + + + + + Status: Missing Crypto Keys + + + + + ConfigureTouchFromButton + + + Configure Touchscreen Mappings + + + + + Mapping: + + + + + New + + + + + Delete + Eliminar + + + + Rename + + + + + Click the bottom area to add a point, then press a button to bind. +Drag points to change position, or double-click table cells to edit values. + + + + + Delete Point + + + + + Button + + + + + X + X axis + + + + + Y + Y axis + + + + + New Profile + + + + + Enter the name for the new profile. + + + + + Delete Profile + + + + + Delete profile %1? + + + + + Rename Profile + + + + + New name: + + + + + [press key] + + + + + ConfigureUi + + + Form + Formulario + + + + General + General + + + + Note: Changing language will apply your configuration. + + + + + Interface Language + + + + + Theme + + + + + Application List + + + + + Icon Size + + + + + + None + + + + + Small (24x24) + + + + + Large (48x48) + + + + + Row 1 Text + + + + + + File Name + + + + + + Full Path + + + + + + Title Name (short) + + + + + + Title ID + + + + + + Title Name (long) + + + + + Row 2 Text + + + + + Hide titles without icon + + + + + Single line mode + + + + + Status Bar + + + + + Show advanced frame time info + + + + + <System> + + + + + English + + + + + ConfigureWeb + + + Form + Formulario + + + + Discord Presence + + + + + Show current application in your Discord status + + + + + DirectConnect + + + Direct Connect + + + + + Server Address + + + + + <html><head/><body><p>Server address of the host</p></body></html> + + + + + Port + + + + + <html><head/><body><p>Port number the host is listening on</p></body></html> + + + + + 24872 + + + + + Nickname + + + + + Password + + + + + Connect + + + + + DirectConnectWindow + + + Connecting + + + + + Connect + + + + + DumpingDialog + + + Dump Video + + + + + Output + Salida + + + + Format: + + + + + + + Options: + + + + + + + + ... + ... + + + + Path: + + + + + Video + + + + + + Encoder: + + + + + + Bitrate: + + + + + + bps + + + + + Audio + Audio + + + + + Azahar + Azahar + + + + Please specify the output path. + + + + + output formats + + + + + video encoders + + + + + audio encoders + + + + + Could not find any available %1. +Please check your FFmpeg installation used for compilation. + + + + + + + + %1 (%2) + + + + + Select Video Output Path + + + + + GMainWindow + + + Warning + + + + + The `azahar` executable is being run directly rather than via the Azahar.app bundle. + +When run this way, the app may be missing certain functionality such as camera emulation. + +It is recommended to instead run Azahar using the `open` command, e.g.: +`open ./Azahar.app` + + + + + Current Artic traffic speed. Higher values indicate bigger transfer loads. + + + + + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. + + + + + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. + + + + + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. + + + + + Emulated notification LED + + + + + MicroProfile (unavailable) + + + + + Clear Recent Files + + + + + &Continue + + + + + &Pause + + + + + Azahar is running an application + TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping + + + + + + Invalid App Format + + + + + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. + + + + + App Corrupted + + + + + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. + + + + + App Encrypted + + + + + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> + + + + + Unsupported App + + + + + GBA Virtual Console is not supported by Azahar. + + + + + + Artic Server + + + + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + + Error while loading App! + + + + + An unknown error occurred. Please see the log for more details. + + + + + CIA must be installed before usage + + + + + Before using this CIA, you must install it. Do you want to install it now? + + + + + Quick Load + + + + + Quick Save + + + + + + Slot %1 + + + + + %2 %3 + + + + + Quick Save - %1 + + + + + Quick Load - %1 + + + + + Slot %1 - %2 %3 + + + + + Error Opening %1 Folder + + + + + + Folder does not exist! + + + + + Remove Play Time Data + + + + + Reset play time? + + + + + + + + Create Shortcut + + + + + Do you want to launch the application in fullscreen? + + + + + Successfully created a shortcut to %1 + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + Dumping... + + + + + + Cancel + Cancelar + + + + + + + + + + + + Azahar + Azahar + + + + Could not dump base RomFS. +Refer to the log for details. + + + + + Error Opening %1 + + + + + Select Directory + + + + + Properties + + + + + The application properties could not be loaded. + + + + + 3DS Executable (%1);;All Files (*.*) + %1 is an identifier for the 3DS executable file extensions. + + + + + Load File + + + + + + Set Up System Files + + + + + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> + + + + + Enter Azahar Artic Setup Tool address: + + + + + <br>Choose setup mode: + + + + + (ℹ️) Old 3DS setup + + + + + + Setup is possible. + + + + + (⚠) New 3DS setup + + + + + Old 3DS setup is required first. + + + + + (✅) Old 3DS setup + + + + + + Setup completed. + + + + + (ℹ️) New 3DS setup + + + + + (✅) New 3DS setup + + + + + The system files for the selected mode are already set up. +Reinstall the files anyway? + + + + + Load Files + + + + + 3DS Installation File (*.cia *.zcia) + + + + + + + All Files (*.*) + + + + + Connect to Artic Base + + + + + Enter Artic Base server address: + + + + + %1 has been installed successfully. + + + + + Unable to open File + + + + + Could not open %1 + + + + + Installation aborted + + + + + The installation of %1 was aborted. Please see the log for more details + + + + + Invalid File + + + + + %1 is not a valid CIA + + + + + CIA Encrypted + + + + + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> + + + + + Unable to find File + + + + + Could not find %1 + + + + + + + + Z3DS Compression + + + + + Failed to compress some files, check log for details. + + + + + Failed to decompress some files, check log for details. + + + + + All files have been compressed successfully. + + + + + All files have been decompressed successfully. + + + + + Uninstalling '%1'... + + + + + Failed to uninstall '%1'. + + + + + Successfully uninstalled '%1'. + + + + + File not found + + + + + File "%1" not found + + + + + Savestates + + + + + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. + +Use at your own risk! + + + + + + + Error opening amiibo data file + + + + + A tag is already in use. + + + + + Application is not looking for amiibos. + + + + + Amiibo File (%1);; All Files (*.*) + + + + + Load Amiibo + + + + + Unable to open amiibo file "%1" for reading. + + + + + Record Movie + + + + + Movie recording cancelled. + + + + + + Movie Saved + + + + + + The movie is successfully saved. + + + + + Application will unpause + + + + + The application will be unpaused, and the next frame will be captured. Is this okay? + + + + + Invalid Screenshot Directory + + + + + Cannot create specified screenshot directory. Screenshot path is set back to its default value. + + + + + Could not load video dumper + + + + + FFmpeg could not be loaded. Make sure you have a compatible version installed. + +To install FFmpeg to Azahar, press Open and select your FFmpeg directory. + +To view a guide on how to install FFmpeg, press Help. + + + + + Load 3DS ROM Files + + + + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) + + + + + 3DS Compressed ROM File (*.%1) + + + + + Save 3DS Compressed ROM File + + + + + Select Output 3DS Compressed ROM Folder + + + + + Load 3DS Compressed ROM Files + + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) + + + + + 3DS ROM File (*.%1) + + + + + Save 3DS ROM File + + + + + Select Output 3DS ROM Folder + + + + + Select FFmpeg Directory + + + + + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. + + + + + FFmpeg has been sucessfully installed. + + + + + Installation of FFmpeg failed. Check the log file for details. + + + + + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. + + + + + Recording %1 + + + + + Playing %1 / %2 + + + + + Movie Finished + + + + + (Accessing SharedExtData) + + + + + (Accessing SystemSaveData) + + + + + (Accessing BossExtData) + + + + + (Accessing ExtData) + + + + + (Accessing SaveData) + + + + + MB/s + + + + + KB/s + + + + + Artic Traffic: %1 %2%3 + + + + + Speed: %1% + + + + + Speed: %1% / %2% + + + + + App: %1 FPS + + + + + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) + + + + + Frame: %1 ms + + + + + VOLUME: MUTE + + + + + VOLUME: %1% + Volume percentage (e.g. 50%) + + + + + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. + + + + + A system archive + + + + + System Archive Not Found + + + + + System Archive Missing + + + + + Save/load Error + + + + + Fatal Error + + + + + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. + + + + + Fatal Error encountered + + + + + Continue + + + + + Quit Application + + + + + OK + OK + + + + Would you like to exit now? + + + + + The application is still running. Would you like to stop emulation? + + + + + Playback Completed + + + + + Movie playback completed. + + + + + Update Available + + + + + Update %1 for Azahar is available. +Would you like to download it? + + + + + Primary Window + + + + + Secondary Window + + + + + GPUCommandListModel + + + Command Name + + + + + Register + Registro + + + + Mask + + + + + New Value + + + + + GPUCommandListWidget + + + Pica Command List + + + + + + Start Tracing + + + + + Copy All + + + + + Finish Tracing + + + + + GPUCommandStreamWidget + + + Graphics Debugger + + + + + GRenderWindow + + + OpenGL not available! + + + + + OpenGL shared contexts are not supported. + + + + + Error while initializing OpenGL! + + + + + Your GPU may not support OpenGL, or you do not have the latest graphics driver. + + + + + Error while initializing OpenGL 4.3! + + + + + Your GPU may not support OpenGL 4.3, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 + + + + + Error while initializing OpenGL ES 3.2! + + + + + Your GPU may not support OpenGL ES 3.2, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 + + + + + GameList + + + + Compatibility + + + + + + Region + + + + + + File type + + + + + + Size + + + + + + Play time + + + + + Favorite + + + + + Eject Cartridge + + + + + Insert Cartridge + + + + + Open + + + + + Application Location + + + + + Save Data Location + + + + + Extra Data Location + + + + + Update Data Location + + + + + DLC Data Location + + + + + Texture Dump Location + + + + + Custom Texture Location + + + + + Mods Location + + + + + Dump RomFS + + + + + Disk Shader Cache + + + + + Open Shader Cache Location + + + + + Delete OpenGL Shader Cache + + + + + Delete Vulkan Shader Cache + + + + + Uninstall + + + + + Everything + + + + + Application + + + + + Update + + + + + DLC + + + + + Remove Play Time Data + + + + + Create Shortcut + + + + + Add to Desktop + + + + + Add to Applications Menu + + + + + Stress Test: App Launch + + + + + Properties + + + + + + + + Azahar + Azahar + + + + Are you sure you want to completely uninstall '%1'? + +This will delete the application if installed, as well as any installed updates or DLC. + + + + + + %1 (Update) + + + + + + %1 (DLC) + + + + + Are you sure you want to uninstall '%1'? + + + + + Are you sure you want to uninstall the update for '%1'? + + + + + Are you sure you want to uninstall all DLC for '%1'? + + + + + Scan Subfolders + + + + + Remove Application Directory + + + + + Move Up + + + + + Move Down + + + + + Open Directory Location + + + + + Clear + + + + + Name + Nombre + + + + GameListItemCompat + + + Perfect + + + + + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without +any workarounds needed. + + + + + Great + + + + + App functions with minor graphical or audio glitches and is playable from start to finish. May require some +workarounds. + + + + + Okay + + + + + App functions with major graphical or audio glitches, but app is playable from start to finish with +workarounds. + + + + + Bad + + + + + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches +even with workarounds. + + + + + Intro/Menu + + + + + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start +Screen. + + + + + Won't Boot + + + + + The app crashes when attempting to startup. + + + + + Not Tested + + + + + The app has not yet been tested. + + + + + GameListPlaceholder + + + Double-click to add a new folder to the application list + + + + + GameListSearchField + + + of + + + + + result + + + + + results + + + + + Filter: + + + + + Enter pattern to filter + + + + + GameRegion + + + Japan + + + + + North America + + + + + Europe + + + + + Australia + + + + + China + + + + + Korea + + + + + Taiwan + + + + + Invalid region + + + + + Region free + + + + + GraphicsBreakPointsWidget + + + Pica Breakpoints + + + + + + Emulation running + + + + + Resume + + + + + Emulation halted at breakpoint + + + + + GraphicsSurfaceWidget + + + Pica Surface Viewer + + + + + Color Buffer + + + + + Depth Buffer + + + + + Stencil Buffer + + + + + Texture 0 + + + + + Texture 1 + + + + + Texture 2 + + + + + Custom + + + + + Unknown + + + + + Save + Guardar + + + + Source: + + + + + Physical Address: + + + + + Width: + + + + + Height: + + + + + Format: + + + + + X: + + + + + Y: + + + + + Pixel out of bounds + + + + + (unable to access pixel data) + + + + + (invalid surface address) + + + + + (unknown surface format) + + + + + Portable Network Graphic (*.png) + + + + + Binary data (*.bin) + + + + + Save Surface + + + + + + + + Error + + + + + + Failed to open file '%1' + + + + + Failed to save surface data to file '%1' + + + + + Failed to completely write surface data to file. The saved data will likely be corrupt. + + + + + GraphicsTracingWidget + + + CiTrace Recorder + + + + + Start Recording + + + + + Stop and Save + + + + + Abort Recording + + + + + Save CiTrace + + + + + CiTrace File (*.ctf) + + + + + CiTracing still active + + + + + A CiTrace is still being recorded. Do you want to save it? If not, all recorded data will be discarded. + + + + + GraphicsVertexShaderModel + + + Offset + + + + + Raw + + + + + Disassembly + + + + + GraphicsVertexShaderWidget + + + Save Shader Dump + + + + + Shader Binary (*.shbin) + + + + + Pica Vertex Shader + + + + + (data only available at vertex shader invocation breakpoints) + + + + + Dump + + + + + Input Data + + + + + Attribute %1 + + + + + Cycle Index: + + + + + SRC1: %1, %2, %3, %4 + + + + + + SRC2: %1, %2, %3, %4 + + + + + + SRC3: %1, %2, %3, %4 + + + + + + DEST_IN: %1, %2, %3, %4 + + + + + + DEST_OUT: %1, %2, %3, %4 + + + + + + Address Registers: %1, %2 + + + + + + Compare Result: %1, %2 + + + + + + Static Condition: %1 + + + + + + Dynamic Conditions: %1, %2 + + + + + + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 + + + + + + Instruction offset: 0x%1 + + + + + -> 0x%2 + + + + + (last instruction) + + + + + HostRoom + + + Create Room + + + + + Room Name + + + + + Preferred Application + + + + + Max Players + + + + + Username + + + + + (Leave blank for open room) + + + + + Password + + + + + Port + + + + + Room Description + Descripción de la sala + + + + Load Previous Ban List + + + + + Public + + + + + Unlisted + + + + + Host Room + + + + + HostRoomWindow + + + Error + + + + + Failed to announce the room to the public lobby. +Debug Message: + + + + + IPCRecorder + + + IPC Recorder + + + + + Enable Recording + + + + + Filter: + + + + + Leave empty to disable filtering + + + + + # + + + + + Status + + + + + Service + + + + + Function + + + + + Clear + + + + + IPCRecorderWidget + + + Invalid + + + + + Sent + + + + + Handling + + + + + Success + + + + + Error + + + + + HLE Unimplemented + + + + + HLE + + + + + LLE + + + + + Unknown + + + + + LLEServiceModulesWidget + + + Toggle LLE Service Modules + + + + + LoadingScreen + + + Loading Shaders 387 / 1628 + + + + + Loading Shaders %v out of %m + + + + + Estimated Time 5m 4s + + + + + Loading... + + + + + Preloading Textures %1 / %2 + + + + + Preparing Shaders %1 / %2 + + + + + Loading %3 %1 / %2 + + + + + Launching... + + + + + Now Loading +%1 + + + + + Estimated Time %1 + + + + + Lobby + + + Public Room Browser + + + + + + Nickname + + + + + Filters + + + + + Search + + + + + Applications I Own + + + + + Hide Empty Rooms + + + + + Hide Full Rooms + + + + + Refresh Lobby + + + + + Password Required to Join + + + + + Password: + + + + + Room Name + + + + + Preferred Application + + + + + Host + + + + + Players + + + + + Refreshing + + + + + Refresh List + + + + + MainWindow + + + Azahar + Azahar + + + + File + Archivo + + + + Boot Home Menu + + + + + Recent Files + + + + + Amiibo + + + + + Emulation + Emulación + + + + Save State + + + + + Load State + + + + + View + + + + + Debugging + + + + + Screen Layout + + + + + Small Screen Position + + + + + Multiplayer + + + + + Tools + + + + + Movie + + + + + Help + + + + + Load File... + + + + + Install CIA... + + + + + Connect to Artic Base... + + + + + Set Up System Files... + + + + + JPN + + + + + USA + + + + + EUR + + + + + AUS + + + + + CHN + + + + + KOR + + + + + TWN + + + + + Exit + + + + + Pause + + + + + Stop + + + + + Save + Guardar + + + + Load + + + + + FAQ + + + + + About Azahar + Acerca de Azahar + + + + Single Window Mode + + + + + Save to Oldest Slot + + + + + Quick Save + + + + + Load from Newest Slot + + + + + Quick Load + + + + + Configure... + + + + + Display Dock Widget Headers + + + + + Show Filter Bar + + + + + Show Status Bar + + + + + Create Pica Surface Viewer + + + + + Record... + + + + + Play... + + + + + Close + + + + + Save without Closing + + + + + Read-Only Mode + + + + + Advance Frame + + + + + Capture Screenshot + + + + + Dump Video + + + + + Compress ROM File... + + + + + Decompress ROM File... + + + + + Browse Public Rooms + + + + + Create Room + + + + + Leave Room + Abandonar la Sala + + + + Direct Connect to Room + + + + + Show Current Room + + + + + Fullscreen + + + + + Open Log Folder + + + + + Opens the Azahar Log folder + + + + + Default + + + + + Single Screen + + + + + Large Screen + + + + + Side by Side + De lado a lado + + + + Separate Windows + + + + + Hybrid Screen + + + + + Custom Layout + + + + + Top Right + + + + + Middle Right + + + + + Bottom Right + + + + + Top Left + + + + + Middle Left + + + + + Bottom Left + + + + + Above + + + + + Below + + + + + Swap Screens + + + + + Rotate Upright + + + + + Report Compatibility + + + + + Restart + + + + + Load... + + + + + Remove + + + + + Open Azahar Folder + + + + + Configure Current Application... + + + + + MicroProfileDialog + + + MicroProfile + + + + + ModerationDialog + + + Moderation + + + + + Ban List + + + + + + Refreshing + + + + + Unban + + + + + Subject + + + + + Type + Tipo + + + + Forum Username + + + + + IP Address + + + + + Refresh + + + + + MoviePlayDialog + + + + Play Movie + + + + + File: + + + + + ... + ... + + + + Info + + + + + Application: + + + + + Author: + + + + + Rerecord Count: + + + + + Length: + + + + + Current running application will be stopped. + + + + + <br>Current recording will be discarded. + + + + + Citra TAS Movie (*.ctm) + + + + + Invalid movie file. + + + + + Revision dismatch, playback may desync. + + + + + Indicated length is incorrect, file may be corrupted. + + + + + + + + (unknown) + + + + + Application used in this movie is not in Applications list. + + + + + (>1 day) + + + + + MovieRecordDialog + + + + Record Movie + + + + + File: + + + + + ... + ... + + + + Author: + + + + + Current running application will be restarted. + + + + + <br>Current recording will be discarded. + + + + + Recording will start once you boot an application. + + + + + Citra TAS Movie (*.ctm) + + + + + MultiplayerState + + + + Current connection status + + + + + + Not Connected. Click here to find a room! + + + + + + + Connected + Conectado + + + + + Not Connected + + + + + Error + + + + + Failed to update the room information. Please check your Internet connection and try hosting the room again. +Debug Message: + + + + + New Messages Received + + + + + NetworkMessage + + + Leave Room + Abandonar la Sala + + + + You are about to close the room. Any network connections will be closed. + + + + + Disconnect + + + + + You are about to leave the room. Any network connections will be closed. + + + + + NetworkMessage::ErrorManager + + + Username is not valid. Must be 4 to 20 alphanumeric characters. + + + + + Room name is not valid. Must be 4 to 20 alphanumeric characters. + + + + + Username is already in use or not valid. Please choose another. + + + + + IP is not a valid IPv4 address. + + + + + Port must be a number between 0 to 65535. + + + + + You must choose a Preferred Application to host a room. If you do not have any applications in your Applications list yet, add an applications folder by clicking on the plus icon in the Applications list. + + + + + Unable to find an internet connection. Check your internet settings. + + + + + Unable to connect to the host. Verify that the connection settings are correct. If you still cannot connect, contact the room host and verify that the host is properly configured with the external port forwarded. + + + + + Unable to connect to the room because it is already full. + + + + + Creating a room failed. Please retry. Restarting Azahar might be necessary. + + + + + The host of the room has banned you. Speak with the host to unban you or try a different room. + + + + + Version mismatch! Please update to the latest version of Azahar. If the problem persists, contact the room host and ask them to update the server. + + + + + Incorrect password. + + + + + An unknown error occurred. If this error continues to occur, please open an issue + + + + + Connection to room lost. Try to reconnect. + + + + + You have been kicked by the room host. + + + + + MAC address is already in use. Please choose another. + + + + + Your Console ID conflicted with someone else's in the room. + +Please go to Emulation > Configure > System to regenerate your Console ID. + + + + + You do not have enough permission to perform this action. + + + + + The user you are trying to kick/ban could not be found. +They may have left the room. + + + + + Error + + + + + OptionSetDialog + + + Options + + + + + Unset + + + + + unknown + + + + + %1 &lt;%2> %3 + + + + + Range: %1 - %2 + + + + + custom + + + + + %1 (0x%2) %3 + + + + + OptionsDialog + + + Options + + + + + Double click to see the description and change the values of the options. + + + + + Specific + + + + + Generic + + + + + Name + Nombre + + + + Value + Valor + + + + QObject + + + Supported image files (%1) + Archivos de imagen soportados (%1) + + + + Open File + Abrir Archivo + + + + Error + + + + + Couldn't load the camera + + + + + Couldn't load %1 + + + + + + Shift + + + + + + Ctrl + + + + + + Alt + + + + + + + [not set] + + + + + + Hat %1 %2 + + + + + + + + + + Axis %1%2 + + + + + + Button %1 + + + + + GC Axis %1%2 + + + + + GC Button %1 + + + + + + + [unknown] + + + + + [unused] + + + + + auto + + + + + true + + + + + false + + + + + + none + + + + + %1 (0x%2) + + + + + Unsupported encrypted application + + + + + Invalid region + + + + + Installed Titles + + + + + System Titles + + + + + Add New Application Directory + + + + + Favorites + + + + + Not running an application + + + + + %1 is not running an application + + + + + %1 is running %2 + + + + + QtKeyboard + + + Software Keyboard + + + + + QtKeyboardDialog + + + Text length is not correct (should be %1 characters) + + + + + Text is too long (should be no more than %1 characters) + + + + + Blank input is not allowed + + + + + Empty input is not allowed + + + + + Validation error + + + + + QtMiiSelectorDialog + + + Mii Selector + + + + + Standard Mii + + + + + RecordDialog + + + View Record + + + + + Client + + + + + + Process: + + + + + + Thread: + + + + + + Session: + + + + + Server + + + + + General + General + + + + Client Port: + + + + + Service: + + + + + Function: + + + + + Command Buffer + + + + + Select: + + + + + Request Untranslated + + + + + Request Translated + + + + + Reply Untranslated + + + + + Reply Translated + + + + + OK + OK + + + + null + + + + + RegistersWidget + + + Registers + + + + + VFP Registers + + + + + VFP System Registers + + + + + Vector Length + + + + + Vector Stride + + + + + Rounding Mode + + + + + Vector Iteration Count + + + + + SequenceDialog + + + Enter a hotkey + + + + + UserDataMigrator + + + Would you like to migrate your data for use in Azahar? +(This may take a while; The old data will not be deleted) + + + + + + + + + Migration + + + + + Azahar has detected user data for Citra and Lime3DS. + + + + + + + Migrate from Lime3DS + + + + + Migrate from Citra + + + + + Azahar has detected user data for Citra. + + + + + + + Azahar has detected user data for Lime3DS. + + + + + + + You can manually re-trigger this prompt by deleting the new user data directory: +%1 + + + + + Data was migrated successfully. + +If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: +%1 + + + + + WaitTreeEvent + + + reset type = %1 + + + + + WaitTreeMutex + + + locked %1 times by thread: + + + + + free + + + + + WaitTreeMutexList + + + holding mutexes + + + + + WaitTreeObjectList + + + waiting for all objects + + + + + waiting for one of the following objects + + + + + WaitTreeSemaphore + + + available count = %1 + + + + + max count = %1 + + + + + WaitTreeThread + + + running + + + + + ready + + + + + waiting for address 0x%1 + + + + + sleeping + + + + + waiting for IPC response + + + + + waiting for objects + + + + + waiting for HLE return + + + + + dormant + + + + + dead + + + + + PC = 0x%1 LR = 0x%2 + PC = 0x%1 LR = 0x%2 + + + + default + + + + + all + + + + + AppCore + + + + + SysCore + + + + + Unknown processor %1 + + + + + object id = %1 + + + + + processor = %1 + + + + + thread id = %1 + + + + + process = %1 (%2) + + + + + priority = %1(current) / %2(normal) + + + + + last running ticks = %1 + + + + + not holding mutex + + + + + WaitTreeThreadList + + + waited by thread + + + + + WaitTreeTimer + + + reset type = %1 + + + + + initial delay = %1 + + + + + interval delay = %1 + + + + + WaitTreeWaitObject + + + [%1]%2 %3 + [%1]%2 %3 + + + + waited by no thread + + + + + one shot + + + + + sticky + + + + + pulse + + + + + WaitTreeWidget + + + Wait Tree + + + + diff --git a/dist/languages/es_ES.ts b/dist/languages/es_ES.ts index 9ff0a37a7..f9dddfb3b 100644 --- a/dist/languages/es_ES.ts +++ b/dist/languages/es_ES.ts @@ -3807,19 +3807,29 @@ a las aplicaciones instaladas. + Status: Loaded (Cannot Validate Signature) + Estado: Cargado (Firma No Verificable) + + + Status: Not Found Estado: No Encontrado - + Status: Invalid Estado: Inválido - + Status: IO Error Estado: Error E/S + + + Status: Missing Crypto Keys + Estado: Faltan Llaves Criptográficas + ConfigureTouchFromButton @@ -4231,12 +4241,12 @@ Por favor, compruebe la instalación de FFmpeg usada para la compilación. GMainWindow - + Warning Advertencia - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4250,511 +4260,506 @@ Al ejecutarse de esta forma, es posible que la aplicación carezca de ciertas fu Se recomienda ejecutar Azahar con el comando `open`, por ejemplo: `open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Dispositivos compatibles con Vulkan no encontrados. - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - El inicio de Vulkan falló durante el inicio.<br/>Tu GPU, o no soporta Vulkan 1.1, o no tiene los últimos drivers gráficos. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. La velocidad de tráfico actual de Artic. Los valores altos indican una carga mayor de transferencia. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. La velocidad de emulación actual. Valores mayores o menores de 100% indican que la velocidad de emulación funciona más rápida o lentamente que en una 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Los fotogramas por segundo que está mostrando el juego. Variarán de aplicación en aplicación y de escena a escena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. El tiempo que lleva emular un fotograma de 3DS, sin tener en cuenta el limitador de fotogramas, ni la sincronización vertical. Para una emulación óptima, este valor no debe superar los 16.67 ms. - + + Emulated notification LED + LED de notificación emulada + + + MicroProfile (unavailable) MicroProfile (no disponible) - + Clear Recent Files Limpiar Archivos Recientes - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar está ejecutando una aplicación - - + + Invalid App Format Formato de aplicación inválido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Tu formato de aplicación no es válido.<br/>Por favor, sigue las instrucciones para volver a volcar tus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartucho de juego</a> y/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Corrupted Aplicación corrupta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Tu aplicación está corrupta. <br/>Por favor, sigue las instrucciones para volver a volcar tus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de juego</a> y/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Encrypted Aplicación encriptada - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Tu aplicación está encriptada. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Por favor visita nuestro blog para más información.</a> - + Unsupported App Aplicación no soportada - + GBA Virtual Console is not supported by Azahar. Consola Virtual de GBA no está soportada por Azahar. - - + + Artic Server Servidor Artic - + Invalid system mode Modo de sistema no válido - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Las aplicaciones exclusivas de New 3DS no se pueden cargar sin activar el modo New 3DS. - + Error while loading App! ¡Error al cargar la aplicación! - + An unknown error occurred. Please see the log for more details. Un error desconocido ha ocurrido. Por favor, mira el log para más detalles. - + CIA must be installed before usage El CIA debe estar instalado antes de usarse - + Before using this CIA, you must install it. Do you want to install it now? Antes de usar este CIA, debes instalarlo. ¿Quieres instalarlo ahora? - + Quick Load Carga Rápida - + Quick Save Guardado Rápido - - + + Slot %1 Ranura %1 - + %2 %3 %2 %3 - + Quick Save - %1 Guardado Rápido - %1 - + Quick Load - %1 Carga Rápida - %1 - + Slot %1 - %2 %3 Ranura %1 - %2 %3 - + Error Opening %1 Folder Error al abrir la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Play Time Data Quitar Datos de Tiempo de Juego - + Reset play time? ¿Reiniciar tiempo de juego? - - - - + + + + Create Shortcut Crear atajo - + Do you want to launch the application in fullscreen? ¿Desea lanzar esta aplicación en pantalla completa? - + Successfully created a shortcut to %1 Atajo a %1 creado con éxito - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Ésto creará un atajo a la AppImage actual. Puede no funcionar bien si actualizas. ¿Continuar? - + Failed to create a shortcut to %1 Fallo al crear un atajo a %1 - + Create Icon Crear icono - + Cannot create icon file. Path "%1" does not exist and cannot be created. No se pudo crear un archivo de icono. La ruta "%1" no existe y no puede ser creada. - + Dumping... Volcando... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. No se pudo volcar el RomFS base. Compruebe el registro para más detalles. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The application properties could not be loaded. No se pudieron cargar las propiedades de la aplicación. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Ejecutable 3DS(%1);;Todos los archivos(*.*) - + Load File Cargar Archivo - - + + Set Up System Files Configurar Archivos de Sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necesita archivos de una consola real para poder utilizar algunas de sus funciones.<br>Puedes obtener los archivos con la <a href=https://github.com/azahar-emu/ArticSetupTool>herramienta de configuración Artic</a><br>Notas:<ul><li><b>Esta operación instalará archivos únicos de la consola en Azahar, ¡no compartas las carpetas de usuario ni nand<br>después de realizar el proceso de configuración!</b></li><li>Tras la configuración, Azahar se enlazará a la consola que ha ejecutado la herramienta de configuración. Puedes desvincular la<br>consola más tarde desde la pestaña "Archivos de sistema" del menú de opciones del emulador.</li><li>No te conectes en línea con Azahar y la consola 3DS al mismo tiempo después de configurar los archivos del sistema,<br>ya que esto podría causar problemas.</li><li>Se necesita la configuración de Old 3DS para que funcione la configuración de New 3DS (configurar ambos modos es recomendado).</li><li>Ambos modos de configuración funcionarán independientemente del modelo de la consola que ejecute la herramienta de configuración.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Introduce la dirección de la herramienta de configuración Artic - + <br>Choose setup mode: <br>Elige el modo de configuración: - + (ℹ️) Old 3DS setup (ℹ️) Configuración Old 3DS - - + + Setup is possible. La configuración es posible. - + (⚠) New 3DS setup (⚠) Configuración New 3DS - + Old 3DS setup is required first. La configuración Old 3DS es necesaria primero. - + (✅) Old 3DS setup (✅) Configuración Old 3DS - - + + Setup completed. Configuración completa. - + (ℹ️) New 3DS setup (ℹ️) Configuración New 3DS - + (✅) New 3DS setup (✅) Configuración New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Los archivos de sistema para el modo seleccionado ya están configurados. ¿Desea reinstalar los archivos de todas formas? - + Load Files Cargar archivos - + 3DS Installation File (*.cia *.zcia) Archivo de Instalación de 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Todos los archivos (*.*) - + Connect to Artic Base Conectar a Artic Base - + Enter Artic Base server address: Introduce la dirección del servidor Artic Base - + %1 has been installed successfully. %1 ha sido instalado con éxito. - + Unable to open File No se pudo abrir el Archivo - + Could not open %1 No se pudo abrir %1 - + Installation aborted Instalación interrumpida - + The installation of %1 was aborted. Please see the log for more details La instalación de %1 ha sido cancelada. Por favor, consulte los registros para más información. - + Invalid File Archivo no válido - + %1 is not a valid CIA %1 no es un archivo CIA válido - + CIA Encrypted CIA encriptado - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Tu archivo CIA está encriptado. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Por favor visita nuestro blog para más información.</a> - + Unable to find File No puede encontrar el archivo - + Could not find %1 No se pudo encontrar %1 - - + + Z3DS Compression Compresión Z3DS - + Failed to compress some files, check log for details. No se pudieron comprimir algunos archivos, mira el registro para más detalles. - + Failed to decompress some files, check log for details. No se pudieron descomprimir algunos archivos, mira el registro para más detalles. - + All files have been compressed successfully. Todos los archivos se han comprimido con éxito. - + All files have been decompressed successfully. Todos los archivos se han descomprimido con éxito. - + Uninstalling '%1'... Desinstalando '%1'... - + Failed to uninstall '%1'. Falló la desinstalación de '%1'. - + Successfully uninstalled '%1'. '%1' desinstalado con éxito. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + Savestates Estados - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4763,86 +4768,86 @@ Use at your own risk! ¡Úsalos bajo tu propio riesgo! - - - + + + Error opening amiibo data file Error al abrir los archivos de datos del Amiibo - + A tag is already in use. Ya está en uso una etiqueta. - + Application is not looking for amiibos. La aplicación no está buscando amiibos. - + Amiibo File (%1);; All Files (*.*) Archivo de Amiibo(%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Unable to open amiibo file "%1" for reading. No se pudo abrir el archivo del amiibo "%1" para su lectura. - + Record Movie Grabar Película - + Movie recording cancelled. Grabación de película cancelada. - - + + Movie Saved Película Guardada - - + + The movie is successfully saved. Película guardada con éxito. - + Application will unpause La aplicación se despausará - + The application will be unpaused, and the next frame will be captured. Is this okay? La aplicación se despausará, y el siguiente fotograma será capturado. ¿Estás de acuerdo? - + Invalid Screenshot Directory Directorio de capturas de pantalla no válido - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. No se puede crear el directorio de capturas de pantalla. La ruta de capturas de pantalla vuelve a su valor por defecto. - + Could not load video dumper No se pudo cargar el volcador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4855,265 +4860,265 @@ Para instalar FFmpeg en Azahar, pulsa Abrir y elige el directorio de FFmpeg. Para ver una guía sobre cómo instalar FFmpeg, pulsa Ayuda. - + Load 3DS ROM Files Cargar ROM de 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Archivos ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Archivo ROM 3DS comprimido (*.%1) - + Save 3DS Compressed ROM File Guardar archivo 3DS comprimido - + Select Output 3DS Compressed ROM Folder Seleccione la carpeta de salida comprimida del ROM 3DS - + Load 3DS Compressed ROM Files Cargar archivo 3DS comprimido - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Archivo ROM 3DS comprimido (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Archivo ROM 3DS (*.%1) - + Save 3DS ROM File Guardar archivo ROM 3DS - + Select Output 3DS ROM Folder Seleccione la carpeta de salida del ROM 3DS - + Select FFmpeg Directory Seleccionar Directorio FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Al directorio de FFmpeg indicado le falta %1. Por favor, asegúrese de haber seleccionado el directorio correcto. - + FFmpeg has been sucessfully installed. FFmpeg ha sido instalado con éxito. - + Installation of FFmpeg failed. Check the log file for details. La instalación de FFmpeg ha fallado. Compruebe el archivo del registro para más detalles. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. No se pudo empezar a grabar vídeo.<br>Asegúrese de que el encodeador de vídeo está configurado correctamente.<br>Para más detalles, observe el registro. - + Recording %1 Grabando %1 - + Playing %1 / %2 Reproduciendo %1 / %2 - + Movie Finished Película terminada - + (Accessing SharedExtData) (Accediendo al SharedExtData) - + (Accessing SystemSaveData) (Accediendo al SystemSaveData) - + (Accessing BossExtData) (Accediendo al BossExtData) - + (Accessing ExtData) (Accediendo al ExtData) - + (Accessing SaveData) (Accediendo al SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tráfico Artic: %1 %2%3 - + Speed: %1% Velocidad: %1% - + Speed: %1% / %2% Velocidad: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUMEN: SILENCIO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Falta %1. Por favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>vuelca tus archivos de sistema</a>.<br/>Continuar la emulación puede resultar en cuelgues y errores. - + A system archive Un archivo de sistema - + System Archive Not Found Archivo de Sistema no encontrado - + System Archive Missing Falta un Archivo de Sistema - + Save/load Error Error de guardado/carga - + Fatal Error Error Fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ha ocurrido un error fatal.<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Mira el log</a>para más detalles.<br/>Continuar la emulación puede resultar en cuelgues y errores. - + Fatal Error encountered Error Fatal encontrado - + Continue Continuar - + Quit Application Cerrar aplicación - + OK Aceptar - + Would you like to exit now? ¿Quiere salir ahora? - + The application is still running. Would you like to stop emulation? La aplicación sigue en ejecución. ¿Quiere parar la emulación? - + Playback Completed Reproducción Completada - + Movie playback completed. Reproducción de película completada. - + Update Available Actualización disponible - + Update %1 for Azahar is available. Would you like to download it? La actualización %1 de Azahar está disponible. ¿Quieres descargarla? - + Primary Window Ventana Primaria - + Secondary Window Ventana Secundaria diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index aa3f3768e..b9cdc140f 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -3798,19 +3798,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4220,12 +4230,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Varoitus - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4235,595 +4245,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nykyinen emulaationopeus. Arvot yli tai ali 100% osoittavat, että emulaatio on nopeampi tai hitaampi kuin 3DS:än nopeus. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA pitää asenaa ennen käyttöä - + Before using this CIA, you must install it. Do you want to install it now? Ennen, kun voit käyttää tätä CIA:aa, sinun täytyy asentaa se. Haluatko asentaa sen nyt? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Virhe Avatessa %1 Kansio - - + + Folder does not exist! Kansio ei ole olemassa! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Peruuta - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Virhe avatessa %1 - + Select Directory Valitse hakemisto - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Lataa tiedosto - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Lataa tiedostoja - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Kaikki tiedostot (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 asennettiin onnistuneesti. - + Unable to open File Tiedostoa ei voitu avata - + Could not open %1 Ei voitu avata %1 - + Installation aborted Asennus keskeytetty - + The installation of %1 was aborted. Please see the log for more details - + Invalid File Sopimaton Tiedosto - + %1 is not a valid CIA %1 ei ole sopiva CIA-tiedosto - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Tiedostoa ei löytynyt - + File "%1" not found Tiedosto "%1" ei löytynyt. - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo tiedosto (%1);; Kaikki tiedostot (*.*) - + Load Amiibo Lataa Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Tallenna Video - + Movie recording cancelled. - - + + Movie Saved - - + + The movie is successfully saved. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4832,264 +4837,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Nopeus: %1% - + Speed: %1% / %2% Nopeus %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kuvaruutu: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found - + System Archive Missing - + Save/load Error - + Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Jatka - + Quit Application - + OK OK - + Would you like to exit now? Haluatko poistua nyt? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 5c34e7dd2..df0a1e5d6 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -3807,19 +3807,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + Statut : Chargé (impossible de valider la signature) + + + Status: Not Found Statut : Introuvable - + Status: Invalid Statut : invalide - + Status: IO Error Statut : Erreur d'E/S + + + Status: Missing Crypto Keys + Statut : Clés cryptographiques manquantes + ConfigureTouchFromButton @@ -4231,12 +4241,12 @@ Veuillez vérifier votre installation FFmpeg utilisée pour la compilation. GMainWindow - + Warning Attention ! - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4251,511 +4261,506 @@ Il est recommandé de démarrer Azahar en utilisant la commande `open`, par exem `open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Aucun périphérique Vulkan adapté détecté - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - L'initialisation de Vulkan a échoué au démarrage.<br/>Votre GPU pourrait ne pas prendre en charge Vulkan 1.1, ou vous pourriez ne pas avoir le pilote graphique le plus récent. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Vitesse actuelle du trafic Artic. Des valeurs plus élevées indiquent des charges de transfert plus importantes. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Vitesse actuelle d'émulation. Les valeurs supérieures ou inférieures à 100% indiquent que l'émulation est plus rapide ou plus lente qu'une 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Nombre d'images par seconde affichées par l'application. Cela varie d'une application à l'autre et d'une scène à l'autre. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Temps nécessaire pour émuler une trame 3DS, sans compter la limitation de trame ou la synchronisation verticale V-Sync. Pour une émulation à pleine vitesse, cela ne devrait pas dépasser 16,67 ms. - + + Emulated notification LED + LED de notification émulée + + + MicroProfile (unavailable) MicroProfile (indisponible) - + Clear Recent Files Effacer les fichiers récents - + &Continue &Continuer - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar exécute une application - - + + Invalid App Format Format d'application invalide - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Le format de votre application n'est pas pris en charge.<br/> Veuillez suivre les guides pour extraire à nouveau vos <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartouches de jeu</a> ou les <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titres installés</a>. - + App Corrupted Application corrompue - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Votre application est corrompue. <br/>Veuillez suivre les guides pour récupérer vos <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartouches de jeux</a> ou les <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titres installés</a>. - + App Encrypted Application encryptée - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Votre application est encryptée. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consultez notre blog pour plus d'informations.</a> - + Unsupported App Application non supportée - + GBA Virtual Console is not supported by Azahar. La console virtuelle de la GBA n'est pas prise en charge par Azahar. - - + + Artic Server Serveur Artic - + Invalid system mode Mode système invalide. - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Les applications exclusives New 3DS ne peuvent pas être chargées sans activer le mode New 3DS. - + Error while loading App! Erreur lors du chargement de l'application ! - + An unknown error occurred. Please see the log for more details. Une erreur inconnue s'est produite. Veuillez consulter le journal pour plus de détails. - + CIA must be installed before usage CIA doit être installé avant utilisation - + Before using this CIA, you must install it. Do you want to install it now? Avant d'utiliser ce CIA, vous devez l'installer. Voulez-vous l'installer maintenant ? - + Quick Load Chargement rapide - + Quick Save Sauvegarde rapide - - + + Slot %1 Emplacement %1 - + %2 %3 %2 %3 - + Quick Save - %1 Sauvegarde rapide - %1 - + Quick Load - %1 Chargement rapide - %1 - + Slot %1 - %2 %3 Emplacement %1 - %2 %3 - + Error Opening %1 Folder Erreur lors de l'ouverture du dossier %1 - - + + Folder does not exist! Le répertoire n'existe pas ! - + Remove Play Time Data Retirer les données de temps de jeu ? - + Reset play time? Réinitialiser le temps de jeu ? - - - - + + + + Create Shortcut Créer un raccourci - + Do you want to launch the application in fullscreen? Voulez-vous lancer l'application en plein écran ? - + Successfully created a shortcut to %1 Création réussie d'un raccourci vers %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Cela créera un raccourci vers l'AppImage actuelle. Il se peut que cela ne fonctionne pas bien si vous effectuez une mise à jour. Poursuivre ? - + Failed to create a shortcut to %1 Échec de la création d'un raccourci vers %1 - + Create Icon Créer icône - + Cannot create icon file. Path "%1" does not exist and cannot be created. Impossible de créer le fichier icône. Le chemin "%1" n'existe pas et ne peut pas être créé. - + Dumping... Extraction... - - + + Cancel Annuler - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Impossible d'extraire les RomFS de base. Référez-vous aux logs pour plus de détails. - + Error Opening %1 Erreur lors de l'ouverture de %1 - + Select Directory Sélectionner un répertoire - + Properties Propriétés - + The application properties could not be loaded. Les propriétés de l'application n'ont pas pu être chargées. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Exécutable 3DS (%1);;Tous les fichiers (*.*) - + Load File Charger un fichier - - + + Set Up System Files Configurer les fichiers système - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar a besoin des données et des fichiers de firmware propres à une console réelle pour pouvoir utiliser certaines de ses fonctionnalités.<br>Ces fichiers et données peuvent être configurés à l'aide de l'outil <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool.</a><br>Notes :<ul><li><b>Cette opération installera des données uniques à la console Azahar. Ne partagez pas vos dossiers utilisateur ou nand <br>après avoir effectué le processus d'installation !</b></li><li>Pendant le processus d'installation, Azahar se connectera à la console exécutant l'outil d'installation. Vous pourrez ensuite déconnecter la <br>console à partir de l'onglet Système dans le menu de configuration de l'émulateur.</li><li>Ne vous connectez pas à Internet avec Azahar et votre console 3DS en même temps après avoir configuré les fichiers système,<br> car cela pourrait causer des problèmes.</li><li>La configuration de l'ancienne 3DS est nécessaire pour que la configuration de la nouvelle 3DS fonctionne (il est recommandé d'effectuer les deux modes de configuration).</li><li>Les deux modes de configuration fonctionnent quel que soit le modèle de console sur lequel l'outil de configuration est exécuté.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Entrer l'adresse de l'outil de configuration Artic d'Azahar : - + <br>Choose setup mode: <br>Choisissez le mode de configuration : - + (ℹ️) Old 3DS setup (ℹ️) Configuration Old 3DS - - + + Setup is possible. La configuration est possible. - + (⚠) New 3DS setup (⚠) Configuration New 3DS - + Old 3DS setup is required first. La configuration Old 3DS est requise d'abord. - + (✅) Old 3DS setup (✅) Configuration Old 3DS - - + + Setup completed. Configuration terminée. - + (ℹ️) New 3DS setup (ℹ️) Configuration New 3DS - + (✅) New 3DS setup (✅) Configuration New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Les fichiers système pour le mode sélectionné sont déjà configurés. Voulez-vous les réinstaller quand même ? - + Load Files Charger des fichiers - + 3DS Installation File (*.cia *.zcia) Fichier d'installation 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tous les fichiers (*.*) - + Connect to Artic Base Se connecter à Artic Base - + Enter Artic Base server address: Entrez l'adresse du serveur Artic Base : - + %1 has been installed successfully. %1 a été installé avec succès. - + Unable to open File Impossible d'ouvrir le fichier - + Could not open %1 Impossible d'ouvrir %1 - + Installation aborted Installation annulée - + The installation of %1 was aborted. Please see the log for more details L'installation de %1 a été interrompue. Veuillez consulter les logs pour plus de détails. - + Invalid File Fichier invalide - + %1 is not a valid CIA %1 n'est pas un CIA valide - + CIA Encrypted CIA chiffré - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Votre fichier CIA est chiffré.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consultez notre blog pour plus d'informations.</a> - + Unable to find File Impossible de trouver le fichier - + Could not find %1 Impossible de trouver %1 - - + + Z3DS Compression Compression Z3DS - + Failed to compress some files, check log for details. Échec de la compression de certains fichiers, vérifiez le log pour plus de détails. - + Failed to decompress some files, check log for details. Échec de la décompression de certains fichiers, vérifiez le log pour plus de détails. - + All files have been compressed successfully. Tous les fichiers ont été compréssé avec succès. - + All files have been decompressed successfully. Tous les fichiers ont été décompréssé avec succès. - + Uninstalling '%1'... Désinstallation de '%1'... - + Failed to uninstall '%1'. Échec de la désinstallation de '%1'. - + Successfully uninstalled '%1'. Désinstallation de '%1' réussie. - + File not found Fichier non trouvé - + File "%1" not found Le fichier "%1" n'a pas été trouvé - + Savestates Points de récupération - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4764,86 +4769,86 @@ Use at your own risk! À utiliser à vos risques et périls ! - - - + + + Error opening amiibo data file Erreur d'ouverture du fichier de données amiibo - + A tag is already in use. Un tag est déjà en cours d'utilisation. - + Application is not looking for amiibos. L'application ne recherche pas d'amiibos. - + Amiibo File (%1);; All Files (*.*) Fichier Amiibo (%1);; Tous les fichiers (*.*) - + Load Amiibo Charger un Amiibo - + Unable to open amiibo file "%1" for reading. Impossible d'ouvrir le fichier amiibo "%1" pour le lire. - + Record Movie Enregistrer une vidéo - + Movie recording cancelled. Enregistrement de la vidéo annulé. - - + + Movie Saved Vidéo enregistrée - - + + The movie is successfully saved. La vidéo a été enregistrée avec succès. - + Application will unpause L'application sera rétablie. - + The application will be unpaused, and the next frame will be captured. Is this okay? L'application sera rétablie et l'image suivante sera capturée. Cela vous convient-il ? - + Invalid Screenshot Directory Répertoire des captures d'écran invalide - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Création du répertoire des captures d'écran spécifié impossible. Le chemin d'accès vers les captures d'écran est réinitialisé à sa valeur par défaut. - + Could not load video dumper Impossible de charger le module de capture vidéo. - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4856,265 +4861,265 @@ Pour installer FFmpeg sur Azahar, appuyez sur Ouvrir et sélectionnez votre rép Pour afficher un guide sur l'installation de FFmpeg, appuyez sur Aide. - + Load 3DS ROM Files Charger les fichiers ROM 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Fichiers ROM 3DS (*.cia *.cci *.3dsx *.cci *.3ds) - + 3DS Compressed ROM File (*.%1) Fichier ROM compressé 3DS (*.%1) - + Save 3DS Compressed ROM File Enregistrer le fichier ROM compressé 3DS - + Select Output 3DS Compressed ROM Folder Sélectionner le dossier de sortie des fichiers ROM 3DS compressés - + Load 3DS Compressed ROM Files Charger des fichiers ROM 3DS compréssés - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Fichiers ROM compressés 3DS (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Fichier ROM 3DS (*.%1) - + Save 3DS ROM File Enregistrer le fichier ROM 3DS - + Select Output 3DS ROM Folder Sélectionner le dossier de sortie des fichiers ROM 3DS - + Select FFmpeg Directory Sélectionnez le répertoire FFmpeg. - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Le répertoire FFmpeg fourni manque %1. Assurez-vous d'avoir sélectionné le répertoire correct. - + FFmpeg has been sucessfully installed. FFmpeg a été installé avec succès. - + Installation of FFmpeg failed. Check the log file for details. L'installation de FFmpeg a échoué. Consultez le fichier journal pour plus de détails. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Impossible de lancer le dump vidéo.<br>Veuillez vous assurer que l'encodeur vidéo est configuré correctement.<br>Reportez-vous au logs pour plus de détails. - + Recording %1 Enregistrement %1 - + Playing %1 / %2 Lecture de %1 / %2 - + Movie Finished Vidéo terminée - + (Accessing SharedExtData) (Accès à SharedExtData) - + (Accessing SystemSaveData) (Accès à SystemSaveData) - + (Accessing BossExtData) (Accès à BossExtData) - + (Accessing ExtData) (Accès à ExtData) - + (Accessing SaveData) (Accès à SaveData) - + MB/s Mo/s - + KB/s Ko/s - + Artic Traffic: %1 %2%3 Trafic Artic : %1 %2%3 - + Speed: %1% Vitesse : %1% - + Speed: %1% / %2% Vitesse : %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (CPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Trame : %1 ms - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME : %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 est manquant. Veuillez <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>vider les archives de votre système</a>. <br/>La poursuite de l'émulation peut entraîner des plantages et des bogues. - + A system archive Une archive système - + System Archive Not Found Archive système non trouvée - + System Archive Missing Archive système absente - + Save/load Error Erreur de sauvegarde/chargement - + Fatal Error Erreur fatale - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Une erreur fatale s'est produite. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Consultez le journal</a> pour plus de détails.<br/> La poursuite de l'émulation peut entraîner des plantages et des bogues. - + Fatal Error encountered Une erreur fatale s'est produite - + Continue Continuer - + Quit Application Quitter l'application - + OK OK - + Would you like to exit now? Voulez-vous quitter maintenant ? - + The application is still running. Would you like to stop emulation? L'application est toujours en cours d'exécution. Voulez-vous arrêter l'émulation ? - + Playback Completed Lecture terminée - + Movie playback completed. Lecture de la vidéo terminée. - + Update Available Mise à jour disponible - + Update %1 for Azahar is available. Would you like to download it? La mise à jour %1 pour Azahar est disponible. Souhaitez-vous la télécharger ? - + Primary Window Fenêtre principale - + Secondary Window Fenêtre secondaire diff --git a/dist/languages/hu_HU.ts b/dist/languages/hu_HU.ts index c3824bd23..40b6b90e3 100644 --- a/dist/languages/hu_HU.ts +++ b/dist/languages/hu_HU.ts @@ -3797,19 +3797,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4219,12 +4229,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4234,595 +4244,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Jelenlegi emulációs sebesség. A 100%-nál nagyobb vagy kisebb értékek azt mutatják, hogy az emuláció egy 3DS-nél gyorsabban vagy lassabban fut. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Mennyi idő szükséges egy 3DS képkocka emulálásához, képkocka-limit vagy V-Syncet leszámítva. Teljes sebességű emulációnál ez maximum 16.67 ms-nek kéne lennie. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Legutóbbi fájlok törlése - + &Continue &Folytatás - + &Pause &Szünet - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 Foglalat %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Foglalat %1 - %2 %3 - + Error Opening %1 Folder Hiba %1 Mappa Megnyitásában - - + + Folder does not exist! A mappa nem létezik! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Kimentés... - - + + Cancel Mégse - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Hiba Indulás %1 - + Select Directory Könyvtár Kiválasztása - + Properties Tulajdonságok - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS állományok (%1);;Minden fájl (*.*) - + Load File Fájl Betöltése - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Fájlok Betöltése - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Minden fájl (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 sikeresen fel lett telepítve. - + Unable to open File A fájl megnyitása sikertelen - + Could not open %1 Nem lehet megnyitni: %1 - + Installation aborted Telepítés megszakítva - + The installation of %1 was aborted. Please see the log for more details %1 telepítése meg lett szakítva. Kérjük olvasd el a naplót több részletért. - + Invalid File Ismeretlen Fájl - + %1 is not a valid CIA %1 nem érvényes CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File A fájl nem található - + Could not find %1 %1 nem található - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1' eltávolítása... - + Failed to uninstall '%1'. '%1' eltávolítása sikertelen. - + Successfully uninstalled '%1'. '%1' sikeresen eltávolítva. - + File not found A fájl nem található - + File "%1" not found Fájl "%1" nem található - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo fájl (%1);; Minden fájl (*.*) - + Load Amiibo Amiibo betöltése - + Unable to open amiibo file "%1" for reading. - + Record Movie Film felvétele - + Movie recording cancelled. Filmfelvétel megszakítva. - - + + Movie Saved Film mentve - - + + The movie is successfully saved. A film sikeresen mentve. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4831,264 +4836,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory FFmpeg könyvtár kiválasztása - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. FFmpeg sikeresen telepítve. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Felvétel %1 - + Playing %1 / %2 Lejátszás %1 / %2 - + Movie Finished Film befejezve - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Sebesség: %1% - + Speed: %1% / %2% Sebesség: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Képkocka: %1 ms - + VOLUME: MUTE HANGERŐ: NÉMÍTVA - + VOLUME: %1% Volume percentage (e.g. 50%) HANGERŐ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Egy rendszerarchívum - + System Archive Not Found Rendszerarchívum Nem Található - + System Archive Missing - + Save/load Error Mentési/betöltési hiba - + Fatal Error Kritikus Hiba - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Végzetes hiba lépett fel - + Continue Folytatás - + Quit Application - + OK OK - + Would you like to exit now? Szeretnél most kilépni? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Elsődleges ablak - + Secondary Window Másodlagos ablak diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 8ff58e96b..069d14708 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -3799,19 +3799,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4221,12 +4231,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Peringatan - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4236,595 +4246,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Kecepatan emulasi saat ini. Nilai yang lebih tinggi atau lebih rendah dari 100% menunjukan emulasi berjalan lebih cepat atau lebih lambat dari 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Waktu yang dibutuhkan untuk mengemulasi frame 3DS, tidak menghitung pembatasan frame atau v-sync. setidaknya emulasi yang tergolong kecepatan penuh harus berada setidaknya pada 16.67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Bersihkan Berkas File Terbaru - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA harus di install terlebih dahulu sebelum bisa di gunakan - + Before using this CIA, you must install it. Do you want to install it now? Sebelum memakai CIA ini kau harus memasangnya terlebih dahulu. Apa anda ingin menginstallnya sekarang? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Kesalahan Dalam Membuka Folder %1 - - + + Folder does not exist! Folder tidak ada! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Batal - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Kesalahan Dalam Membuka %1 - + Select Directory Pilih Direktori - + Properties Properti - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Muat File - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Muat berkas - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Semua File (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 telah terinstall. - + Unable to open File Tidak dapat membuka File - + Could not open %1 Tidak dapat membuka %1 - + Installation aborted Instalasi dibatalkan - + The installation of %1 was aborted. Please see the log for more details Instalasi %1 dibatalkan. Silahkan lihat file log untuk info lebih lanjut. - + Invalid File File yang tidak valid - + %1 is not a valid CIA %1 bukan CIA yang valid - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... Mencopot Pemasangan '%1'... - + Failed to uninstall '%1'. Gagal untuk mencopot pemasangan '%1%. - + Successfully uninstalled '%1'. - + File not found File tidak ditemukan - + File "%1" not found File "%1" tidak ditemukan - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Muat Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Rekam Video - + Movie recording cancelled. Perekaman Video Di Batalkan. - - + + Movie Saved Video Di Simpan - - + + The movie is successfully saved. Video telah berhasil di simpan. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4833,264 +4838,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Kecepatan: %1% - + Speed: %1% / %2% Kelajuan: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Sebuah arsip sistem - + System Archive Not Found Arsip Sistem Tidak Ditemukan - + System Archive Missing Arsip sistem tidak ada - + Save/load Error - + Fatal Error Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Galat fatal terjadi - + Continue Lanjut - + Quit Application - + OK OK - + Would you like to exit now? Apakah anda ingin keluar sekarang? - + The application is still running. Would you like to stop emulation? - + Playback Completed Pemutaran Kembali Telah Selesai - + Movie playback completed. Pemutaran kembali video telah selesai. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/it.ts b/dist/languages/it.ts index a0edbeae0..29e7f3653 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -3482,7 +3482,7 @@ installed applications. Swaziland - Swaziland + eSwatini @@ -3805,19 +3805,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + Stato: Caricato (impossibile validare la firma) + + + Status: Not Found Stato: Non trovato - + Status: Invalid Stato: Non valido - + Status: IO Error Stato: Errore di I/O + + + Status: Missing Crypto Keys + Stato: Chiavi crittografiche mancanti + ConfigureTouchFromButton @@ -4229,12 +4239,12 @@ Verifica l'installazione di FFmpeg usata per la compilazione. GMainWindow - + Warning Attenzione - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4249,511 +4259,506 @@ Si consiglia invece di avviare Azahar utilizzando il comando `open`, ad esempio: `open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Impossibile trovare un dispositivo compatibile con Vulkan. - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - L'inizializzazione di Vulkan è fallita durante l'avvio.<br/>La tua GPU potrebbe non supportare Vulkan 1.1, oppure non stai usando i driver più recenti. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Attuale velocità del traffico di Artic. Valori alti indicano carichi di trasferimento più grandi. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Velocità di emulazione corrente. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente di un 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Quanti frame al secondo l'app sta attualmente mostrando. Varierà da app ad app e da scena a scena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma del 3DS, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + + Emulated notification LED + LED notifche emulato + + + MicroProfile (unavailable) MicroProfile (Non disponibile) - + Clear Recent Files Elimina file recenti - + &Continue &Continua - + &Pause &Pausa - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar sta eseguendo un'applicazione - - + + Invalid App Format Formato App non valido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Il formato dell'applicazione non è supportato.<br/>Segui la guida per effettuare il dump delle tue <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>schedine di gioco</a> o dei <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titoli installati</a>. - + App Corrupted App corrotta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. L'applicazione è corrotta. <br/>Segui la guida per effettuare il dump delle tue <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>schedine di gioco</a> o dei <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titoli installati</a>. - + App Encrypted App criptata - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> L'applicazione è criptata. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consulta il nostro blog per maggiori informazioni.</a> - + Unsupported App App non supportata - + GBA Virtual Console is not supported by Azahar. La Virtual Console GBA non è supportata da Azahar. - - + + Artic Server Artic Server - + Invalid system mode Modalità di sistema non valida - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Le applicazioni esclusive per New 3DS non possono essere avviate senza prima abilitare la modalità New 3DS. - + Error while loading App! Errore nel caricamento dell'app! - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - + CIA must be installed before usage Il CIA deve essere installato prima dell'uso - + Before using this CIA, you must install it. Do you want to install it now? Devi installare questo CIA prima di poterlo usare. Desideri farlo ora? - + Quick Load Carica salvataggio rapido - + Quick Save Salvataggio rapido - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Salvataggio rapido - %1 - + Quick Load - %1 Carica salvataggio rapido - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Errore nell'apertura della cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Play Time Data Rimuovi dati sul tempo di gioco - + Reset play time? Reimpostare il tempo di gioco? - - - - + + + + Create Shortcut Crea scorciatoia - + Do you want to launch the application in fullscreen? Vuoi avviare l'applicazione a schermo intero? - + Successfully created a shortcut to %1 Scorciatoia creata con successo in %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Verrà creata una scorciatoia all'attuale AppImage, che potrebbe non funzionare correttamente in caso di aggiornamento. Vuoi continuare? - + Failed to create a shortcut to %1 Impossibile creare scorciatoia in %1 - + Create Icon Crea icona - + Cannot create icon file. Path "%1" does not exist and cannot be created. Impossibile creare file icona. La cartella "%1" non esiste e non può essere creato. - + Dumping... Estrazione in corso... - - + + Cancel Annulla - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Impossibile estrarre la RomFS base. Consulta il log per i dettagli. - + Error Opening %1 Errore nell'apertura di %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The application properties could not be loaded. Impossibile caricare le proprietà dell'applicazione. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Eseguibile 3DS (%1);;Tutti i file (*.*) - + Load File Carica file - - + + Set Up System Files Configura i file di sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necessita di dati univoci della console e di file firmware da una console reale per poter utilizzare alcune delle sue funzionalità.<br>Tali file e dati possono essere configurati con <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Note:<ul><li><b>questa operazione installerà dati univoci della console su Azahar, non condividere le cartelle utente o nand<br>dopo aver eseguito il processo di configurazione!</b></li><li>Durante il processo di configurazione, Azahar si collegherà alla console che esegue lo strumento di configurazione. È possibile scollegare la console in un secondo momento dalla scheda Sistema nel menu di configurazione dell'emulatore.</li><li>Non andare online con Azahar e con la console 3DS contemporaneamente dopo aver configurato i file di sistema,<br>poiché potrebbe causare problemi.</li><li>La vecchia configurazione 3DS è necessaria affinché la nuova configurazione 3DS funzioni (si consiglia di eseguire entrambe le modalità di configurazione).</li><li>Entrambe le modalità di configurazione funzioneranno indipendentemente dal modello della console che esegue lo strumento di configurazione.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Inserisci l'indirizzo di Artic Setup Tool: - + <br>Choose setup mode: <br>Scegli la modalità di configurazione: - + (ℹ️) Old 3DS setup (ℹ️) Configurazione Old 3DS - - + + Setup is possible. La configurazione è possibile. - + (⚠) New 3DS setup (⚠) Configurazione New 3DS - + Old 3DS setup is required first. È necessario eseguire prima la configurazione Old 3DS. - + (✅) Old 3DS setup (✅) Configurazione Old 3DS - - + + Setup completed. Configurazione completata. - + (ℹ️) New 3DS setup (ℹ️) Configurazione New 3DS - + (✅) New 3DS setup (✅) Configurazione New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? I file di sistema per la modalità selezionata sono già stati configurati. Vuoi comunque reinstallarli? - + Load Files Carica file - + 3DS Installation File (*.cia *.zcia) File di installazione 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tutti i file (*.*) - + Connect to Artic Base Connettiti ad Artic Base - + Enter Artic Base server address: Inserisci l'indirizzo del server Artic Base: - + %1 has been installed successfully. %1 è stato installato con successo. - + Unable to open File Impossibile aprire il file - + Could not open %1 Impossibile aprire %1 - + Installation aborted Installazione annullata - + The installation of %1 was aborted. Please see the log for more details L'installazione di %1 è stata annullata. Visualizza il log per maggiori dettagli. - + Invalid File File non valido - + %1 is not a valid CIA %1 non è un CIA valido - + CIA Encrypted File CIA criptato - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Il file CIA è criptato. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consulta il nostro blog per maggiori informazioni.</a> - + Unable to find File Impossibile trovare il file - + Could not find %1 Impossibile trovare %1 - - + + Z3DS Compression Compressione Z3DS - + Failed to compress some files, check log for details. Impossibile comprimere alcuni file, controllare il log per i dettagli. - + Failed to decompress some files, check log for details. Impossibile decomprimere alcuni file, controllare il log per i dettagli. - + All files have been compressed successfully. Tutti i file sono stati compressi con successo. - + All files have been decompressed successfully. Tutti i file sono stati decompressi con successo. - + Uninstalling '%1'... Disinstallazione di "%1" in corso... - + Failed to uninstall '%1'. Errore nella disinstallazione di "%1". - + Successfully uninstalled '%1'. "%1" è stato disinstallato con successo. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + Savestates Stati salvati - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4762,86 +4767,86 @@ Use at your own risk! Usali a tuo rischio e pericolo. - - - + + + Error opening amiibo data file Errore durante l'apertura dell'amiibo. - + A tag is already in use. Un tag è già in uso. - + Application is not looking for amiibos. L'applicazione non sta cercando alcun amiibo. - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Unable to open amiibo file "%1" for reading. Impossibile leggere il file amiibo "%1". - + Record Movie Registra filmato - + Movie recording cancelled. Registrazione del filmato annullata. - - + + Movie Saved Filmato salvato - - + + The movie is successfully saved. Filmato salvato correttamente. - + Application will unpause L'applicazione riprenderà - + The application will be unpaused, and the next frame will be captured. Is this okay? L'applicazione riprenderà, e il prossimo frame verrà catturato. Va bene? - + Invalid Screenshot Directory Cartella degli screenshot non valida - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Impossibile creare la cartella degli screenshot specificata. Il percorso è stato ripristinato a quello predefinito. - + Could not load video dumper Impossibile caricare l'estrattore del video - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4854,265 +4859,265 @@ Per installare FFmpeg su Azahar, clicca su Apri e seleziona la cartella di FFmpe Per istruzioni su come installare FFmpeg, clicca su Aiuto. - + Load 3DS ROM Files Carica file ROM 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) File ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) File ROM 3DS compresso (*.%1) - + Save 3DS Compressed ROM File Salva file ROM 3DS compresso - + Select Output 3DS Compressed ROM Folder Seleziona la cartella di destinazione delle ROM 3DS compresse - + Load 3DS Compressed ROM Files Carica file ROM 3DS compressi - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) File ROM 3DS compresso (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) File ROM 3DS (*.%1) - + Save 3DS ROM File Salva file ROM 3DS - + Select Output 3DS ROM Folder Seleziona la cartella di destinazione delle ROM 3DS - + Select FFmpeg Directory Seleziona la cartella di installazione di FFmpeg. - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. La cartella di FFmpeg selezionata non contiene %1. Assicurati di aver selezionato la cartella corretta. - + FFmpeg has been sucessfully installed. FFmpeg è stato installato con successo. - + Installation of FFmpeg failed. Check the log file for details. Installazione di FFmpeg fallita. Consulta i file di log per maggiori dettagli. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Impossibile iniziare il dumping video.<br> Assicurati che l'encoder video sia configurato correttamente. <br>Controlla il log per ulteriori dettagli. - + Recording %1 Registrazione in corso (%1) - + Playing %1 / %2 Riproduzione in corso (%1 / %2) - + Movie Finished Filmato terminato - + (Accessing SharedExtData) (Accessing SharedExtData) - + (Accessing SystemSaveData) (Accessing SystemSaveData) - + (Accessing BossExtData) (Accessing BossExtData) - + (Accessing ExtData) (Accessing ExtData) - + (Accessing SaveData) (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Traffico Artic: %1 %2%3 - + Speed: %1% Velocità: %1% - + Speed: %1% / %2% Velocità: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 non trovato. <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>Estrai i tuoi archivi di sistema</a>.<br/>Proseguendo l'emulazione si potrebbero verificare arresti anomali e bug. - + A system archive Un archivio di sistema - + System Archive Not Found Archivio di sistema non trovato - + System Archive Missing Archivio di sistema mancante - + Save/load Error Errore di salvataggio/caricamento - + Fatal Error Errore irreversibile - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Si è verificato un errore fatale. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Controlla il log</a> per i dettagli.<br/>Continuare l'emulazione potrebbe causare arresti anomali e bug. - + Fatal Error encountered Errore irreversibile riscontrato - + Continue Continua - + Quit Application Chiudi applicazione - + OK OK - + Would you like to exit now? Desideri uscire ora? - + The application is still running. Would you like to stop emulation? L'applicazione è ancora in esecuzione. Vuoi arrestare l'emulazione? - + Playback Completed Riproduzione completata - + Movie playback completed. Riproduzione del filmato completata. - + Update Available Aggiornamento disponibile - + Update %1 for Azahar is available. Would you like to download it? L'aggiornamento %1 di Azahar è disponibile. Vuoi installarlo? - + Primary Window Finestra principale - + Secondary Window Finestra secondaria diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 1e5141f11..03c4417e6 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -3804,19 +3804,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4227,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 警告 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4242,596 +4252,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 現在のエミュレーション速度です。100%以外の値は、エミュレーションが3DS実機より高速または低速で行われていることを表します。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 3DSフレームをエミュレートするのにかかった時間です。フレームリミットや垂直同期の有効時にはカウントしません。フルスピードで動作させるには16.67ms以下に保つ必要があります。 - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files 最近のファイルを消去 - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> このアプリは暗号化されています。<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>ブログで詳細な情報を確認してください。</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. GBAバーチャルコンソールはAzaharではサポートされていません。 - - + + Artic Server Artic Base - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. 不明なエラーが発生しました. 詳細はログを参照してください. - + CIA must be installed before usage CIAを使用前にインストールする必要有 - + Before using this CIA, you must install it. Do you want to install it now? CIAを使用するには先にインストールを行う必要があります。今すぐインストールしますか? - + Quick Load - + Quick Save - - + + Slot %1 スロット %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder フォルダ %1 を開く際のエラー - - + + Folder does not exist! フォルダが見つかりません! - + Remove Play Time Data プレイ時間のデータを削除 - + Reset play time? プレイ時間をリセットしますか? - - - - + + + + Create Shortcut ショートカットを作成する - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 %1にショートカットを作成しました。 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... ダンプ中... - - + + Cancel キャンセル - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. ベースRomFSをダンプできませんでした。 詳細はログを参照してください。 - + Error Opening %1 %1 を開く際のエラー - + Select Directory 3DSのROMがあるフォルダを選択 - + Properties プロパティ - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS実行ファイル (%1);;すべてのファイル (*.*) - + Load File ゲームファイルの読み込み - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files ファイルの読み込み - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) すべてのファイル (*.*) - + Connect to Artic Base Arctic Baseに接続 - + Enter Artic Base server address: - + %1 has been installed successfully. %1が正常にインストールされました - + Unable to open File ファイルを開けません - + Could not open %1 %1を開くことができませんでした - + Installation aborted インストール中止 - + The installation of %1 was aborted. Please see the log for more details %1のインストールは中断されました。詳細はログを参照してください - + Invalid File 無効なファイル - + %1 is not a valid CIA %1は有効なCIAではありません - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File ファイルが見つかりません - + Could not find %1 %1を見つけられませんでした - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1'をアンインストールしています - + Failed to uninstall '%1'. '%1' をアンインストールできませんでした - + Successfully uninstalled '%1'. - + File not found ファイルなし - + File "%1" not found ファイル%1が見つかりませんでした - + Savestates ステートセーブ - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiiboファイル (%1);; すべてのファイル (*.*) - + Load Amiibo Amiiboを読込 - + Unable to open amiibo file "%1" for reading. - + Record Movie 操作を記録 - + Movie recording cancelled. 操作の記録がキャンセルされました - - + + Movie Saved 保存成功 - - + + The movie is successfully saved. 操作記録を保存しました - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4840,264 +4845,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% スピード:%1% - + Speed: %1% / %2% スピード:%1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms フレーム:%1 ms - + VOLUME: MUTE 音量: ミュート - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive システムアーカイブ - + System Archive Not Found システムアーカイブなし - + System Archive Missing システムアーカイブが見つかりません - + Save/load Error セーブ/ロード エラー - + Fatal Error 致命的なエラー - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered 致命的なエラーが発生しました - + Continue 続行 - + Quit Application - + OK OK - + Would you like to exit now? 今すぐ終了しますか? - + The application is still running. Would you like to stop emulation? - + Playback Completed 再生完了 - + Movie playback completed. 操作記録の再生が完了しました - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 28bd61b38..130faa83d 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -3799,19 +3799,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4223,12 +4233,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 경고 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4238,596 +4248,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 현재 에뮬레이션 속도. 100%보다 높거나 낮은 값은 에뮬레이션이 3DS보다 빠르거나 느린 것을 나타냅니다. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 3DS 프레임을 에뮬레이션 하는 데 걸린 시간, 프레임제한 또는 v-동기화를 카운트하지 않음. 최대 속도 에뮬레이션의 경우, 이는 최대 16.67 ms여야 합니다. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files 최근 파일 삭제 - + &Continue 계속(&C) - + &Pause 일시중지(&P) - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조하십시오. - + CIA must be installed before usage CIA를 사용하기 전에 설치되어야 합니다 - + Before using this CIA, you must install it. Do you want to install it now? 이 CIA를 사용하기 전에 설치해야합니다. 지금 설치 하시겠습니까? - + Quick Load - + Quick Save - - + + Slot %1 슬롯 %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 슬롯 %1 - %2 %3 - + Error Opening %1 Folder %1 폴더 열기 오류 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... 덤프중... - - + + Cancel 취소 - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. 베이스 RomFS를 덤프 할 수 없습니다. 자세한 내용은 로그를 참조하십시오. - + Error Opening %1 %1 열기 오류 - + Select Directory 디렉터리 선택하기 - + Properties 속성 - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 실행파일 (%1);;모든파일 (*.*) - + Load File 파일 불러오기 - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files 파일 불러오기 - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) 모든파일 (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1가 성공적으로 설치되었습니다. - + Unable to open File 파일을 열 수 없음 - + Could not open %1 %1을(를) 열 수 없음 - + Installation aborted 설치 중단됨 - + The installation of %1 was aborted. Please see the log for more details %1의 설치가 중단되었습니다. 자세한 내용은 로그를 참조하십시오. - + Invalid File 올바르지 않은 파일 - + %1 is not a valid CIA %1은 올바른 CIA가 아닙니다 - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File 파일을 찾을 수 없음 - + Could not find %1 1을(를) 찾을 수 없습니다 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + Savestates 상태저장(Savestates) - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Amiibo 데이터 파일 열기 오류 - + A tag is already in use. 태그가 이미 사용중입니다. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo 파일 (%1);; 모든파일 (*.*) - + Load Amiibo Amiibo 불러오기 - + Unable to open amiibo file "%1" for reading. Amiibo 파일 "%1"을 읽을 수 없습니다. - + Record Movie 무비 녹화 - + Movie recording cancelled. 무비 레코딩이 취소되었습니다. - - + + Movie Saved 무비 저장됨 - - + + The movie is successfully saved. 무비가 성공적으로 저장되었습니다 - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory 올바르지 않은 스크린숏 디렉터리 - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. 지정된 스크린숏 디렉터리를 생성할 수 없습니다. 스크린숏 경로가 기본값으로 다시 설정됩니다. - + Could not load video dumper 비디오 덤퍼를 불러올 수 없습니다 - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4836,264 +4841,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory FFmpeg 디렉토리 선택 - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. 제공된 FFmpeg 디렉토리에 %1이 없습니다. 올바른 디렉토리가 선택되었는지 확인하십시오. - + FFmpeg has been sucessfully installed. FFmpeg가 성공적으로 설치되었습니다. - + Installation of FFmpeg failed. Check the log file for details. FFmpeg 설치에 실패했습니다. 자세한 내용은 로그 파일을 확인하십시오. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 %1 녹화 중 - + Playing %1 / %2 %1 / %2 재생 중 - + Movie Finished 무비 완료됨 - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% 속도: %1% - + Speed: %1% / %2% 속도: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms 프레임: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive 시스템 아카이브 - + System Archive Not Found 시스템 아카이브를 찾을수 없습니다 - + System Archive Missing 시스템 아카이브가 없습니다 - + Save/load Error 저장하기/불러오기 오류 - + Fatal Error 치명적인 오류 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered 치명적인 오류가 발생했습니다 - + Continue 계속 - + Quit Application - + OK 확인 - + Would you like to exit now? 지금 종료하시겠습니까? - + The application is still running. Would you like to stop emulation? - + Playback Completed 재생 완료 - + Movie playback completed. 무비 재생 완료 - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window 첫번째 윈도우 - + Secondary Window 두번째 윈도우 diff --git a/dist/languages/lt_LT.ts b/dist/languages/lt_LT.ts index 81388699c..642822281 100644 --- a/dist/languages/lt_LT.ts +++ b/dist/languages/lt_LT.ts @@ -3796,19 +3796,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4218,12 +4228,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Įspėjimas - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4233,595 +4243,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Dabartinės emuliacijos greitis. Reikšmės žemiau ar aukščiau 100% parodo, kad emuliacija veikia greičiau ar lėčiau negu 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Laikas, kuris buvo sunaudotas atvaizduoti 1 3DS kadrą, neskaičiuojant FPS ribojimo ar V-Sync. Pilno greičio emuliacijai reikalinga daugiausia 16.67 ms reikšmė. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Pravalyti neseniai įkrautus failus - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Klaida atidarant %1 aplanką - - + + Folder does not exist! Aplankas neegzistuoja! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Atšaukti - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Klaida atidarant %1 - + Select Directory Pasirinkti katalogą - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS programa (%1);;Visi failai (*.*) - + Load File Įkrauti failą - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Įkrauti failus - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Visi failai (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 buvo įdiegtas sėkmingai. - + Unable to open File Negalima atverti failo - + Could not open %1 Nepavyko atverti %1 - + Installation aborted Instaliacija nutraukta - + The installation of %1 was aborted. Please see the log for more details Failo %1 instaliacija buvo nutraukta. Pasižiūrėkite į žurnalą dėl daugiau informacijos - + Invalid File Klaidingas failas - + %1 is not a valid CIA %1 nėra tinkamas CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Failas nerastas - + File "%1" not found Failas "%1" nerastas - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) „Amiibo“ failas (%1);; Visi failai (*.*) - + Load Amiibo Įkrauti „Amiibo“ - + Unable to open amiibo file "%1" for reading. - + Record Movie Įrašyti įvesčių vaizdo įrašą - + Movie recording cancelled. Įrašo įrašymas nutrauktas. - - + + Movie Saved Įrašas išsaugotas - - + + The movie is successfully saved. Filmas sėkmingai išsaugotas. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4830,264 +4835,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Greitis: %1% - + Speed: %1% / %2% Greitis: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kadras: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found Sisteminis archyvas nerastas - + System Archive Missing - + Save/load Error - + Fatal Error Nepataisoma klaida - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Tęsti - + Quit Application - + OK Gerai - + Would you like to exit now? Ar norite išeiti? - + The application is still running. Would you like to stop emulation? - + Playback Completed Atkūrimas užbaigtas - + Movie playback completed. Įrašo atkūrimas užbaigtas. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index ddb05216f..0201038ca 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -24,17 +24,17 @@ About Azahar - + Om Azahar <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> - + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> <html><head/><body><p><span style=" font-size:28pt;">Azahar</span></p></body></html> - + <html><head/><body><p><span style=" font-size:28pt;">Azahar</span></p></body></html> @@ -288,12 +288,12 @@ Dette ville forby både deres brukernavn og IP-adressen. Output - + Utgang Emulation - Emulering + Emulering @@ -313,12 +313,12 @@ Dette ville forby både deres brukernavn og IP-adressen. Output Type - + Utgangstype Output Device - + Utgangsenhet @@ -343,12 +343,12 @@ Dette ville forby både deres brukernavn og IP-adressen. Use global volume - + Benytt globalt volum Set volume: - + sett volum: @@ -379,7 +379,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Auto - + Auto @@ -410,7 +410,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Camera to Configure - + Kameraet som skal konfigureres @@ -431,7 +431,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Camera mode - + Kameramodus @@ -452,7 +452,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Camera position - + Kameraposisjon @@ -478,7 +478,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Camera Image Source - + Kamerabildekilde: @@ -498,7 +498,7 @@ Dette ville forby både deres brukernavn og IP-adressen. File - + Fil @@ -525,7 +525,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Flip - + Flip @@ -609,27 +609,27 @@ Dette ville forby både deres brukernavn og IP-adressen. Name - Navn + Navn Type - Type + Type Save - Lagre + Lagre Delete - Slett + Slett Name: - + Navn: @@ -639,7 +639,7 @@ Dette ville forby både deres brukernavn og IP-adressen. Code: - + Kode: @@ -716,7 +716,7 @@ Would you like to ignore the error and continue? Show log output in console - + Vis loggoutput i konsollen @@ -736,22 +736,22 @@ Would you like to ignore the error and continue? CPU - + CPU Use global clock speed - + Benytt global klokkehastighet Set clock speed: - + Sett klokkehastighet: CPU Clock Speed - + CPU Klokkehastighet: @@ -786,7 +786,7 @@ Would you like to ignore the error and continue? Miscellaneous - + Diverse @@ -854,7 +854,7 @@ Would you like to ignore the error and continue? Azahar Configuration - + Azahar Konfigurasjon @@ -898,7 +898,7 @@ Would you like to ignore the error and continue? Layout - + Layout @@ -923,7 +923,7 @@ Would you like to ignore the error and continue? Storage - + Lagring @@ -958,12 +958,12 @@ Would you like to ignore the error and continue? Renderer - Gjengivelse + Renderer Internal Resolution - + Intern Oppløsning @@ -1023,7 +1023,7 @@ Would you like to ignore the error and continue? Use Integer Scaling - + Benytt Integerskalering @@ -1033,47 +1033,47 @@ Would you like to ignore the error and continue? Enable Linear Filtering - + Aktiver Lineær Filtrering Post-Processing Shader - + Post-Prosesseringsshader Texture Filter - + Teksturfilter None - Ingen + Ingen Anime4K - + Anime4K Bicubic - + Bicubic ScaleForce - + ScaleForce xBRZ - + xBRZ MMPX - + MMPX @@ -1088,7 +1088,7 @@ Would you like to ignore the error and continue? Off - + Av @@ -1118,12 +1118,12 @@ Would you like to ignore the error and continue? Depth - + Dybde % - + % @@ -1138,12 +1138,12 @@ Would you like to ignore the error and continue? Left Eye (default) - + Venstre Øyne (standard) Right Eye - + Høyre Øyne @@ -1158,7 +1158,7 @@ Would you like to ignore the error and continue? Swap Eyes - + Bytt Øyner @@ -1216,22 +1216,22 @@ Would you like to ignore the error and continue? Updates - + Oppdateringer Check for updates - + Sjekk fir oppdateringer Update Channel - + Oppdateringskanal Stable - + Stabil @@ -1266,7 +1266,7 @@ Would you like to ignore the error and continue? Enable Gamemode - + Aktiver Gamemode @@ -1276,17 +1276,17 @@ Would you like to ignore the error and continue? Use global emulation speed - + Benytt global emuleringshastighet Set emulation speed - + Sett emuleringshastighet Emulation Speed - + Emuleringshastighet @@ -1296,7 +1296,7 @@ Would you like to ignore the error and continue? Screenshots - + Skjermbilde @@ -1311,12 +1311,12 @@ Would you like to ignore the error and continue? Save Screenshots To - + Lagre skjermbilder Til ... - ... + ... @@ -1340,7 +1340,7 @@ Would you like to ignore the error and continue? Azahar - + Azahar @@ -1358,47 +1358,47 @@ Would you like to ignore the error and continue? Graphics - Grafikk + Grafikk API Settings - + API Innstillinger Graphics API - + Grafikk-API Software - + Software OpenGL - + OpenGL Vulkan - + Vulkan Physical Device - + Fysisk Enhet OpenGL Renderer - + OpenGL Renderer SPIR-V shader generation - + SPIR-V shader generering @@ -1413,7 +1413,7 @@ Would you like to ignore the error and continue? Renderer - Gjengivelse + Renderer @@ -1423,7 +1423,7 @@ Would you like to ignore the error and continue? Enable hardware shader - + Aktiver hardware shader @@ -1433,7 +1433,7 @@ Would you like to ignore the error and continue? Accurate multiplication - + Akkurat Multiplikasjon @@ -1443,7 +1443,7 @@ Would you like to ignore the error and continue? Enable shader JIT - + Aktiver shader JIT @@ -1463,7 +1463,7 @@ Would you like to ignore the error and continue? Enable async presentation - + Aktiver asynkron presentering @@ -1493,7 +1493,7 @@ Would you like to ignore the error and continue? Linear - + Lineær @@ -1503,7 +1503,7 @@ Would you like to ignore the error and continue? Use disk shader cache - + Bruk disk shader cache @@ -1528,12 +1528,12 @@ Would you like to ignore the error and continue? Use global - + Benytt global Use per-application - + Bruk per-applikasjon @@ -1561,7 +1561,7 @@ Would you like to ignore the error and continue? Clear All - Slett Alt + Fjern Alt @@ -1615,12 +1615,12 @@ Would you like to ignore the error and continue? Restore Default - Gjenopprett Standard + Gjenopprett Standardinnstillinger Clear - + Fjern @@ -1761,7 +1761,7 @@ Would you like to ignore the error and continue? Power: - + Power: @@ -1875,7 +1875,7 @@ Would you like to ignore the error and continue? Restore Default - Gjenopprett Standard + Gjenopprett Standardinnstillinger @@ -1903,7 +1903,7 @@ Would you like to ignore the error and continue? Warning - Advarsel + Varsel @@ -1976,12 +1976,12 @@ Would you like to ignore the error and continue? Form - Form + Form Screens - + Skjermer @@ -1991,7 +1991,7 @@ Would you like to ignore the error and continue? Default - Standard + Standard @@ -2205,12 +2205,12 @@ Would you like to ignore the error and continue? Use Global Value - + Benytt Global Verdi Default - Standard + Standard @@ -2278,7 +2278,7 @@ Would you like to ignore the error and continue? Controller: - + Kontroller: @@ -2396,7 +2396,7 @@ Would you like to ignore the error and continue? SDL - + SDL @@ -2412,7 +2412,7 @@ Would you like to ignore the error and continue? Information - Informasjon + Informasjon @@ -2467,7 +2467,7 @@ Would you like to ignore the error and continue? Azahar - + Azahar @@ -2480,27 +2480,27 @@ Would you like to ignore the error and continue? Dialog - + Dialog Info - + Info Size - Størrelse + Størrelse Format - + Format Name - Navn + Navn @@ -2510,7 +2510,7 @@ Would you like to ignore the error and continue? Title ID - Tittel ID + Tittel ID @@ -2525,12 +2525,12 @@ Would you like to ignore the error and continue? General - Generelt + Generelt System - System + System @@ -2540,17 +2540,17 @@ Would you like to ignore the error and continue? Layout - + Layout Graphics - Grafikk + Grafikk Audio - Lyd + Lyd @@ -2570,7 +2570,7 @@ Would you like to ignore the error and continue? Azahar - + Azahar @@ -2583,17 +2583,17 @@ Would you like to ignore the error and continue? Form - Form + Form Storage - + Lagring Use virtual SD card - + Bruk virtuelt SD kort @@ -2614,7 +2614,7 @@ Would you like to ignore the error and continue? Open - + Åpne @@ -2626,7 +2626,7 @@ Would you like to ignore the error and continue? Change - + Bytt @@ -2690,7 +2690,7 @@ online features (if installed) Region - Region + Region @@ -2906,7 +2906,7 @@ installed applications. days - + dager @@ -2921,12 +2921,12 @@ installed applications. Random - + Tilfeldig Fixed - + Fast @@ -2936,7 +2936,7 @@ installed applications. Play Coins - + Play Coins @@ -2967,7 +2967,7 @@ installed applications. MAC: - + MAC: @@ -3002,7 +3002,7 @@ installed applications. OTP - + OTP @@ -3010,22 +3010,22 @@ installed applications. Choose - + Velg SecureInfo_A/B - + SecureInfo_A/B LocalFriendCodeSeed_A/B - + LocalFriendCodeSeed_A/B movable.sed - + movable.sed @@ -3700,7 +3700,7 @@ installed applications. Select SecureInfo_A/B - + Velg SecureInfo_A/B @@ -3710,7 +3710,7 @@ installed applications. Select LocalFriendCodeSeed_A/B - + Velg LocalFriendCodeSeed_A/B @@ -3720,7 +3720,7 @@ installed applications. Select encrypted OTP file - + Velg kryptert OTP fil @@ -3730,7 +3730,7 @@ installed applications. Select movable.sed - + Velg movable.sed @@ -3747,7 +3747,7 @@ installed applications. MAC: %1 - + MAC: %1 @@ -3784,33 +3784,43 @@ installed applications. Status: Loaded - + Status: Lastet Status: Loaded (Invalid Signature) - + Status: Lastet (Ugyldig Signatur) Status: Loaded (Region Changed) - + Status: Lastet (Region Byttet) - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid - + Status: Not Found + Status: Ikke Funnet + Status: Invalid + Status: Ugyldig + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -3860,13 +3870,13 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re X X axis - + X Y Y axis - + Y @@ -3924,7 +3934,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Interface Language - + Grensesnittspråk: @@ -3939,7 +3949,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Icon Size - + Ikon Størrelse: @@ -4010,7 +4020,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Status Bar - + Status Bar @@ -4056,7 +4066,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Server Address - + Serveradresse @@ -4117,12 +4127,12 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Output - + Utgang Format: - Format: + Format: @@ -4147,7 +4157,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Video - + Video @@ -4176,7 +4186,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re Azahar - + Azahar @@ -4210,7 +4220,7 @@ Please check your FFmpeg installation used for compilation. %1 (%2) - + %1 (%2) @@ -4221,12 +4231,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning - Advarsel + Varsel - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4236,596 +4246,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nåværende emuleringhastighet. Verdier høyere eller lavere enn 100% indikerer at emuleringen kjører raskere eller langsommere enn en 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid tatt for å emulere et 3DS bilde, gjelder ikke bildebegrensning eller V-Sync. For raskest emulering bør dette være høyst 16,67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Tøm nylige filer - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + App Korrupt - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + App Kryptert - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + Ustøttet App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA må installeres før bruk - + Before using this CIA, you must install it. Do you want to install it now? Før du bruker denne CIA, må du installere den. Vil du installere det nå? - + Quick Load - + Quick Save - - + + Slot %1 Spor %1 - + %2 %3 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Feil ved Åpning av %1 Mappe - - + + Folder does not exist! Mappen eksistere ikke! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Lag Ikon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dumper... - - + + Cancel Kanseller - - - - - - - - - + + + + + + + + + Azahar - + Azahar - + Could not dump base RomFS. Refer to the log for details. Kunne ikke dumpe basen RomFS. Se loggen for detaljer. - + Error Opening %1 Feil ved åpning av %1 - + Select Directory Velg Mappe - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Executable (%1);;All Files (*.*) - + Load File Last Fil - - + + Set Up System Files - + Set Opp Systemfiler - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Last Filer - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle Filer (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 Ble installert vellykket. - + Unable to open File Kan ikke åpne Fil - + Could not open %1 Kunne ikke åpne %1 - + Installation aborted Installasjon avbrutt - + The installation of %1 was aborted. Please see the log for more details Installeringen av %1 ble avbrutt. Vennligst se logg for detaljer - + Invalid File Ugyldig Fil - + %1 is not a valid CIA %1 er ikke en gyldig CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Fil ikke funnet - + File "%1" not found Fil "%1" ble ikke funnet - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo File (%1);; All Files (*.*) - + Load Amiibo Last inn Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Ta Opp Video - + Movie recording cancelled. Filmopptak avbrutt. - - + + Movie Saved Film Lagret - - + + The movie is successfully saved. Filmen ble lagret vellykket. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4834,264 +4839,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + Last 3DS ROM Filer - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + MB/s - + KB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Fart: %1% - + Speed: %1% / %2% Fart: %1% / %2% - + App: %1 FPS - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Bilde: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Et System Arkiv - + System Archive Not Found System Arkiv ikke funnet - + System Archive Missing System Arkiv Mangler - + Save/load Error Lagre/laste inn Feil - + Fatal Error Fatal Feil - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Fatal Feil Oppstått - + Continue Fortsett - + Quit Application - + OK - OK + OK - + Would you like to exit now? Vil du avslutte nå? - + The application is still running. Would you like to stop emulation? - + Playback Completed Avspilling Fullført - + Movie playback completed. Filmavspilling fullført. - + Update Available - + Oppdatering Tilgjengelig - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5156,7 +5161,7 @@ Would you like to download it? OpenGL not available! - + OpenGL ikke tilgjengelig! @@ -5229,7 +5234,7 @@ Would you like to download it? Favorite - + Favoritt @@ -5244,7 +5249,7 @@ Would you like to download it? Open - + Åpen @@ -5294,7 +5299,7 @@ Would you like to download it? Disk Shader Cache - + Disk Shader Cache @@ -5314,27 +5319,27 @@ Would you like to download it? Uninstall - + Avinstaller Everything - + Alt Application - + Applikasjon Update - + Oppdateringer DLC - + DLC @@ -5372,7 +5377,7 @@ Would you like to download it? Azahar - + Azahar @@ -5385,13 +5390,13 @@ This will delete the application if installed, as well as any installed updates %1 (Update) - + %1 (Oppdatering) %1 (DLC) - + %1 (DLC) @@ -5436,7 +5441,7 @@ This will delete the application if installed, as well as any installed updates Clear - + Fjern @@ -6296,12 +6301,12 @@ Debug Message: Azahar - + Azahar File - + Fil @@ -6321,7 +6326,7 @@ Debug Message: Emulation - Emulering + Emulering @@ -6336,7 +6341,7 @@ Debug Message: View - + Vis @@ -6371,7 +6376,7 @@ Debug Message: Help - + Hjelp @@ -6396,37 +6401,37 @@ Debug Message: JPN - + JPN USA - + USA EUR - + EUR AUS - + AUS CHN - + CHN KOR - + KOR TWN - + TWN @@ -6441,7 +6446,7 @@ Debug Message: Stop - + Stop @@ -6461,7 +6466,7 @@ Debug Message: About Azahar - + Om Azahar @@ -6521,12 +6526,12 @@ Debug Message: Play... - + Spill Close - + Lukk @@ -6787,22 +6792,22 @@ Debug Message: File: - + Fil: ... - ... + ... Info - + Info Application: - + Applikasjon: @@ -6817,7 +6822,7 @@ Debug Message: Length: - + Lengde: @@ -6879,12 +6884,12 @@ Debug Message: File: - + Fil: ... - ... + ... @@ -7000,7 +7005,7 @@ Feilmelding: IP is not a valid IPv4 address. - + IP er ikke en valid IPv4 adresse. @@ -7045,7 +7050,7 @@ Feilmelding: Incorrect password. - + Feil passord. @@ -7111,7 +7116,7 @@ They may have left the room. %1 &lt;%2> %3 - + %1 &lt;%2> %3 @@ -7126,7 +7131,7 @@ They may have left the room. %1 (0x%2) %3 - + %1 (0x%2) %3 @@ -7154,12 +7159,12 @@ They may have left the room. Name - Navn + Navn: Value - Verdi + Verdi @@ -7261,7 +7266,7 @@ They may have left the room. auto - + auto @@ -7282,12 +7287,12 @@ They may have left the room. %1 (0x%2) - + %1 (0x%2) Unsupported encrypted application - + Ustøttet kryptert applikasjon @@ -7312,7 +7317,7 @@ They may have left the room. Favorites - + Favoritter @@ -7536,38 +7541,44 @@ They may have left the room. Migration - + Migrering Azahar has detected user data for Citra and Lime3DS. - + Azahar fant brukerdata for Citra og Lime3DS + + Migrate from Lime3DS - + Migrer fra Lime3DS Migrate from Citra - + Migrer fra Citra Azahar has detected user data for Citra. - + Azahar fant brukerdata for Citra. + + Azahar has detected user data for Lime3DS. - + Azahar fant brukerdata for Citra og Lime3DS. + + diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 24acb0061..d94d925f0 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -3799,19 +3799,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4223,12 +4233,12 @@ Controleer de FFmpeg-installatie die wordt gebruikt voor de compilatie. GMainWindow - + Warning Waarschuwing - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4238,596 +4248,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - Geen geschikte Vulkan-apparaten gedetecteerd - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - Vulkan-initialisatie mislukt tijdens het opstarten.<br/>Uw GPU ondersteunt Vulkan 1.1 mogelijk niet of u hebt niet het nieuwste grafische stuurprogramma. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Huidige emulatiesnelheid. Waardes hoger of lager dan 100% geven aan dat de emulatie sneller of langzamer gaat dan een 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tijd verstrekt om één 3DS frame te emuleren, zonder framelimitatie of V-Sync te tellen. Voor volledige snelheid emulatie zal dit maximaal 16.67 ms moeten zijn. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Wis recente bestanden - + &Continue &Continue - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. Er heeft zich een onbekende fout voorgedaan. Raadpleeg het log voor meer informatie. - + CIA must be installed before usage CIA moet worden geïnstalleerd voor gebruik - + Before using this CIA, you must install it. Do you want to install it now? Voordat u deze CIA kunt gebruiken, moet u hem installeren. Wilt u het nu installeren? - + Quick Load - + Quick Save - - + + Slot %1 Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Fout bij het openen van de map %1 - - + + Folder does not exist! Map bestaat niet! - + Remove Play Time Data Verwijder speeltijd gegevens - + Reset play time? Stel speeltijd opnieuw in? - - - - + + + + Create Shortcut Snelkoppeling maken - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 Het maken van een snelkoppeling naar %1 was succesvol - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Dit zal een snelkoppeling naar het huidige AppImage aanmaken. Dit zal mogelijk niet meer werken als u deze software bijwerkt. Wilt u doorgaan? - + Failed to create a shortcut to %1 Kon geen snelkoppeling naar %1 aanmaken - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dumping... - - + + Cancel Annuleren - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Kon basis RomFS niet dumpen. Raadpleeg het log voor meer informatie. - + Error Opening %1 Fout bij het openen van %1 - + Select Directory Selecteer Folder - + Properties Eigenschappen - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Executable (%1);;Alle bestanden (*.*) - + Load File Laad bestand - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Laad Bestanden - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle bestanden (*.*) - + Connect to Artic Base Verbind met Artic Base - + Enter Artic Base server address: Voer Artic Base server adres in: - + %1 has been installed successfully. %1 is succesvol geïnstalleerd. - + Unable to open File Kan bestand niet openen - + Could not open %1 Kan %1 niet openen - + Installation aborted Installatie onderbroken - + The installation of %1 was aborted. Please see the log for more details De installatie van %1 is afgebroken. Zie het logboek voor meer details - + Invalid File Ongeldig bestand - + %1 is not a valid CIA %1 is geen geldige CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Bestand niet gevonden - + Could not find %1 Kon %1 niet vinden - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1' aan het verwijderen... - + Failed to uninstall '%1'. Kon niet '%1' verwijderen. - + Successfully uninstalled '%1'. '%1' succesvol verwijderd. - + File not found Bestand niet gevonden - + File "%1" not found Bestand "%1" niet gevonden - + Savestates Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Fout bij het openen van het amiibo databestand - + A tag is already in use. Er is al een tag in gebruik. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo Bestand (%1);; Alle Bestanden (*.*) - + Load Amiibo Laad Amiibo - + Unable to open amiibo file "%1" for reading. Kan amiibo-bestand "%1" niet openen om te worden gelezen. - + Record Movie Film opnemen - + Movie recording cancelled. Filmopname geannuleerd. - - + + Movie Saved Film Opgeslagen - - + + The movie is successfully saved. De film is met succes opgeslagen. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Ongeldige schermafbeeldmap - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Kan de opgegeven map voor schermafbeeldingen niet maken. Het pad voor schermafbeeldingen wordt teruggezet naar de standaardwaarde. - + Could not load video dumper Kan videodumper niet laden - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4836,264 +4841,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory Selecteer FFmpeg map - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. De opgegeven FFmpeg directory ontbreekt %1. Controleer of de juiste map is geselecteerd. - + FFmpeg has been sucessfully installed. FFmpeg is met succes geïnstalleerd. - + Installation of FFmpeg failed. Check the log file for details. Installatie van FFmpeg is mislukt. Controleer het logbestand voor meer informatie. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Opname %1 - + Playing %1 / %2 Afspelen %1 / %2 - + Movie Finished Film Voltooid - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Snelheid: %1% - + Speed: %1% / %2% Snelheid: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUME: STIL - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Een systeemarchief - + System Archive Not Found Systeem archief niet gevonden - + System Archive Missing Systeemarchief ontbreekt - + Save/load Error Opslaan/Laad fout - + Fatal Error Fatale Fout - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Fatale fout opgetreden - + Continue Doorgaan - + Quit Application - + OK OK - + Would you like to exit now? Wilt u nu afsluiten? - + The application is still running. Would you like to stop emulation? - + Playback Completed Afspelen voltooid - + Movie playback completed. Film afspelen voltooid. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Primaire venster - + Secondary Window Secundair venster diff --git a/dist/languages/pl_PL.ts b/dist/languages/pl_PL.ts index c45f22cb4..11c0f31ec 100644 --- a/dist/languages/pl_PL.ts +++ b/dist/languages/pl_PL.ts @@ -3807,19 +3807,29 @@ do zainstalowanych aplikacji. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found Status: Nie znaleziono - + Status: Invalid Status: Nieprawidłowy - + Status: IO Error Status: Błąd IO + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4231,12 +4241,12 @@ Sprawdź instalację FFmpeg używaną do kompilacji. GMainWindow - + Warning Ostrzeżenie - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4251,511 +4261,506 @@ Zaleca się uruchamianie Azahar za pomocą polecenia "open”, np.: "open ./Azahar.app” - - No Suitable Vulkan Devices Detected - Nie wykryto odpowiednich urządzeń Vulkan - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - Podczas uruchamiania systemu uruchamianie Vulkan nie powiodło się.<br/>Twój procesor graficzny może nie obsługiwać Vulkan 1.1 lub nie masz najnowszego sterownika graficznego. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Bieżąca prędkość ruchu Artic Base. Wyższe wartości oznaczają większe obciążenia transferowe. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Obecna szybkość emulacji. Wartości większe lub mniejsze niż 100 % oznaczają, że emulacja jest szybsza lub wolniejsza niż 3DS - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Jak wiele klatek na sekundę aplikacja wyświetla w tej chwili. Ta wartość będzie się różniła między aplikacji, jak również między scenami w aplikacji. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny do emulacji klatki 3DS, nie zawiera limitowania klatek oraz v-sync. Dla pełnej prędkości emulacji, wartość nie powinna przekraczać 16.67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) MicroProfile (niedostępne) - + Clear Recent Files Wyczyść Ostatnio Używane - + &Continue &Kontynuuj - + &Pause &Wstrzymaj - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar jest w trakcie uruchamiania aplikację - - + + Invalid App Format Nieprawidłowy format aplikacji - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Twój format aplikacji nie jest obsługiwany.<br/>Postępuj zgodnie z instrukcjami, aby ponownie zrzucić <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>kartridże z grami</a> lub <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>zainstalowane tytuły</a>. - + App Corrupted Aplikacja jest uszkodzona - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Twoja aplikacja jest uszkodzona. <br/>Postępuj zgodnie z instrukcjami, aby ponownie zrzucić <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>kartridże z grami</a> lub <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>zainstalowane tytuły</a>. - + App Encrypted Aplikacja jest zaszyfrowana - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Twoja aplikacja jest zaszyfrowana. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji można znaleźć na naszym blogu.</a> - + Unsupported App Nieobsługiwana aplikacja - + GBA Virtual Console is not supported by Azahar. Wirtualnej konsola GBA nie są obsługiwana przez Azahar. - - + + Artic Server Serwer Artic - + Invalid system mode Nieprawidłowy moduł systemu - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Aplikacje dostępne wyłącznie na konsoli New 3DS nie mogą być uruchamiane bez włączenia trybu New 3DS. - + Error while loading App! Błąd podczas ładowania aplikacji! - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w logu. - + CIA must be installed before usage CIA musi być zainstalowana przed użyciem - + Before using this CIA, you must install it. Do you want to install it now? Przed użyciem CIA należy ją zainstalować. Czy chcesz zainstalować ją teraz? - + Quick Load Szybkie wczytywanie - + Quick Save Szybkie zapisywanie - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Szybkie zapisywanie - %1 - + Quick Load - %1 Szybkie wczytywanie - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Play Time Data Usuń dane czasu odtwarzania - + Reset play time? Zresetować czas gry? - - - - + + + + Create Shortcut Utwórz skrót - + Do you want to launch the application in fullscreen? Czy chcesz uruchomić aplikacje na pełnym ekranie? - + Successfully created a shortcut to %1 Pomyślnie utworzono skrót do %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Spowoduje to utworzenie skrótu do bieżącego obrazu aplikacji. Może to nie działać dobrze po aktualizacji. Kontynuować? - + Failed to create a shortcut to %1 Nie udało się utworzyć skrótu do %1 - + Create Icon Stwórz ikonę - + Cannot create icon file. Path "%1" does not exist and cannot be created. Nie można utworzyć pliku ikony. Ścieżka "%1" nie istnieje i nie można jej utworzyć. - + Dumping... Zrzucanie... - - + + Cancel Anuluj - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Nie można zrzucić podstawowego RomFS. Szczegółowe informacje można znaleźć w logu. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz Folder - + Properties Właściwości - + The application properties could not be loaded. Nie można wczytać właściwości aplikacji. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Pliki wykonywalne 3DS (%1);;Wszystkie pliki (*.*) - + Load File Załaduj Plik - - + + Set Up System Files Konfiguracja plików systemowych - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar potrzebuje plików z rzeczywistej konsoli, aby móc korzystać z niektórych jej funkcji.<br>Możesz uzyskać te pliki za pomocą <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Uwagi:<ul><li><b>Ta operacja zainstaluje unikalne pliki konsoli do Azahar, nie udostępniaj swoich folderów użytkownika lub nand<br>po wykonaniu procesu konfiguracji!</b></li><li>Podczas procesu konfiguracji Azahar połączy się z konsolą, na której uruchomione jest narzędzie instalacyjne.<br>Konsolę można później odłączyć w zakładce System w menu konfiguracji emulatora.</li><li>Nie korzystaj jednocześnie z Azahar i konsoli 3DS po skonfigurowaniu plików systemowych,<br>bo może to spowodować błędy. </li><li>Old 3DS jest wymagany do działania konfiguracji New 3DS (zalecane jest wykonanie obu tych konfiguracji).</li><li>Oba tryby konfiguracji będą działać niezależnie od modelu konsoli, na której uruchomiono narzędzie konfiguracyjne.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Wprowadź adres narzędzia konfiguracyjnego Azahar Artic: - + <br>Choose setup mode: <br>Wybierz tryb konfiguracji: - + (ℹ️) Old 3DS setup (ℹ️) Konfiguracja Old 3DS - - + + Setup is possible. Konfiguracja jest możliwa. - + (⚠) New 3DS setup (⚠) Konfiguracja New 3DS - + Old 3DS setup is required first. Najpierw wymagana jest konfiguracja Old 3DS. - + (✅) Old 3DS setup (✅) Konfiguracja Old 3DS - - + + Setup completed. Konfiguracja została zakończona. - + (ℹ️) New 3DS setup (ℹ️) Konfiguracja New 3DS - + (✅) New 3DS setup (✅) Konfiguracja New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Pliki systemowe dla wybranego trybu są już skonfigurowane. Czy mimo to chcesz ponownie zainstalować pliki? - + Load Files Załaduj Pliki - + 3DS Installation File (*.cia *.zcia) Plik Instalacyjny 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Wszystkie Pliki (*.*) - + Connect to Artic Base Połącz z Artic Base - + Enter Artic Base server address: Wprowadź adres serwera Artic Base: - + %1 has been installed successfully. %1 został poprawnie zainstalowany. - + Unable to open File Nie można otworzyć Pliku - + Could not open %1 Nie można otworzyć %1 - + Installation aborted Instalacja przerwana - + The installation of %1 was aborted. Please see the log for more details Instalacja %1 została przerwana. Sprawdź logi, aby uzyskać więcej informacji. - + Invalid File Niepoprawny Plik - + %1 is not a valid CIA %1 nie jest prawidłowym plikiem CIA - + CIA Encrypted Plik CIA jest zaszyfrowany - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Twój plik CIA jest zaszyfrowany.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji można znaleźć na naszym blogu.</a> - + Unable to find File Nie można odnaleźć pliku - + Could not find %1 Nie można odnaleźć %1 - - + + Z3DS Compression Kompresuj pliki Z3DS - + Failed to compress some files, check log for details. Nie udało się skompresować niektórych plików, sprawdź log, aby uzyskać szczegółowe informacje. - + Failed to decompress some files, check log for details. Nie udało się rozpakować niektórych plików. Szczegółowe informacje można znaleźć w logu. - + All files have been compressed successfully. Wszystkie pliki zostały pomyślnie skompresowane. - + All files have been decompressed successfully. Wszystkie pliki zostały pomyślnie zdekompresowane. - + Uninstalling '%1'... Odinstalowywanie '%1'... - + Failed to uninstall '%1'. Nie udało się odinstalować '%1'. - + Successfully uninstalled '%1'. Pomyślnie odinstalowano '%1'. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + Savestates Savestate.y - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4764,86 +4769,86 @@ Use at your own risk! Używaj na własne ryzyko! - - - + + + Error opening amiibo data file Błąd podczas otwierania pliku danych amiibo - + A tag is already in use. Tag jest już używany. - + Application is not looking for amiibos. Aplikacja nie szuka amiibo. - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);; Wszystkie pliki (*.*) - + Load Amiibo Załaduj Amiibo - + Unable to open amiibo file "%1" for reading. Nie można otworzyć pliku amiibo "%1" do odczytu. - + Record Movie Nagraj Film - + Movie recording cancelled. Nagrywanie zostało przerwane. - - + + Movie Saved Zapisano Film - - + + The movie is successfully saved. Film został poprawnie zapisany. - + Application will unpause Aplikacja zostanie wstrzymana - + The application will be unpaused, and the next frame will be captured. Is this okay? Aplikacja zostanie zatrzymana, a następna klatka zostanie przechwycona. Czy jest to w porządku? - + Invalid Screenshot Directory Nieprawidłowy katalog zrzutów ekranu - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Nie można utworzyć określonego katalogu zrzutów ekranu. Ścieżka zrzutu ekranu zostanie przywrócona do wartości domyślnej. - + Could not load video dumper Nie można załadować zrzutu filmu - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4856,265 +4861,265 @@ Aby zainstalować FFmpeg do Azahar, naciśnij Otwórz i wybierz katalog FFmpeg. Aby wyświetlić poradnik dotyczący instalacji FFmpeg, naciśnij Pomoc. - + Load 3DS ROM Files Załaduj pliki ROMów 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Pliki ROMów 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Skompresowany plik ROMu 3DS (*.%1) - + Save 3DS Compressed ROM File Zapisz skompresowany plik ROMu 3DS - + Select Output 3DS Compressed ROM Folder Wybierz folder wyjściowy skompresowanych plików ROMów 3DS - + Load 3DS Compressed ROM Files Wczytaj skompresowane pliki ROMów 3DS - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Skompresowane pliki ROMów 3DS (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Plik ROMu 3DS (*.%1) - + Save 3DS ROM File Zapisz plik ROMu 3DS - + Select Output 3DS ROM Folder Wybierz folder wyjściowy ROMów 3DS - + Select FFmpeg Directory Wybierz katalog FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. W podanym katalogu FFmpeg brakuje %1. Upewnij się, że wybrany został poprawny katalog. - + FFmpeg has been sucessfully installed. FFmpeg został pomyślnie zainstalowany. - + Installation of FFmpeg failed. Check the log file for details. Instalacja FFmpeg nie powiodła się. Sprawdź plik dziennika, aby uzyskać szczegółowe informacje. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Nie można uruchomić zrzutu filmu.<br>Upewnij się, że koder filmu jest poprawnie skonfigurowany.<br>Szczegółowe informacje można znaleźć w logu. - + Recording %1 Nagrywanie %1 - + Playing %1 / %2 Odtwarzanie %1 / %2 - + Movie Finished Film ukończony - + (Accessing SharedExtData) (Uzyskiwanie dostępu do SharedExtData) - + (Accessing SystemSaveData) (Uzyskiwanie dostępu do SystemSaveData) - + (Accessing BossExtData) (Uzyskiwanie dostępu do BossExtData) - + (Accessing ExtData) (Uzyskiwanie dostępu do ExtData) - + (Accessing SaveData) (Uzyskiwanie dostępu do SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Ruch Artic: %1 %2%3 - + Speed: %1% Prędkość: %1% - + Speed: %1% / %2% Prędkość: %1% / %2% - + App: %1 FPS Aplikacja: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Klatka: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Klatka: %1 ms - + VOLUME: MUTE GŁOŚNOŚĆ: WYCISZONA - + VOLUME: %1% Volume percentage (e.g. 50%) GŁOŚNOŚĆ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Brakuje %1. Prosimy o <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>zrzucenie archiwów systemowych</a>.<br/>Dalsze korzystanie z emulacji może spowodować awarie i błędy. - + A system archive Archiwum systemu - + System Archive Not Found Archiwum Systemowe nie zostało odnalezione - + System Archive Missing Brak archiwum systemu - + Save/load Error Błąd zapisywania/wczytywania - + Fatal Error Krytyczny Błąd - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Wystąpił krytyczny błąd. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Sprawdź szczegóły w logu</a>.<br/>Dalsze korzystanie z emulacji może spowodować awarie i błędy. - + Fatal Error encountered Wystąpił błąd krytyczny - + Continue Kontynuuj - + Quit Application Wyjdź z aplikacji - + OK OK - + Would you like to exit now? Czy chcesz teraz wyjść? - + The application is still running. Would you like to stop emulation? Aplikacja jest nadal uruchomiona. Czy chcesz przerwać emulację? - + Playback Completed Odtwarzanie Zakończone - + Movie playback completed. Odtwarzanie filmu zostało zakończone. - + Update Available Dostępna jest aktualizacja - + Update %1 for Azahar is available. Would you like to download it? Aktualizacja %1 dla Azahar jest dostępna. Czy chcesz ją pobrać? - + Primary Window Główne okno - + Secondary Window Dodatkowe okno diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 1dde81f91..b634d9c60 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -3806,19 +3806,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found Estado: não encontrado - + Status: Invalid Estado: inválido - + Status: IO Error Estado: erro de E/S + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4230,12 +4240,12 @@ Por favor, verifique a instalação do FFmpeg usada para compilação. GMainWindow - + Warning Aviso - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4250,511 +4260,506 @@ Recomenda-se, em vez disso, iniciar o Azahar usando o comando open, por exemplo: `open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Nenhum Dispositivo Vulkan Adequado Detectado - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - O Vulkan falhou durante sua inicialização.<br/>Sua GPU pode não suportar o Vulkan 1.1 ou você não possui o driver gráfico mais recente. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Velocidade atual do tráfego do Artic. Valores mais altos indicam cargas de transferência maiores. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Velocidade atual de emulação. Valores maiores ou menores que 100% indicam que a emulação está funcionando mais rápida ou lentamente que num 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Quantos quadros por segundo que o app está mostrando atualmente. Pode variar de app para app e cena para cena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo levado para emular um quadro do 3DS, sem considerar o limitador de taxa de quadros ou a sincronização vertical. Valores menores ou iguais a 16,67 ms indicam que a emulação está em velocidade plena. - + + Emulated notification LED + LED de notificação emulado + + + MicroProfile (unavailable) Micro-perfil (indisponível) - + Clear Recent Files Limpar Arquivos Recentes - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar está executando um aplicativo - - + + Invalid App Format Formato de App inválido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. O formato do seu app não é suportado.<br/>Siga os guias para reextrair seus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de jogos</a> ou <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Corrupted App corrompido - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Seu app está corrompido. <br/>Siga os guias para reextrair seus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de jogos</a> ou <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Encrypted App criptografado - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Seu app está criptografado. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Confira nosso blog para mais informações.</a> - + Unsupported App App não suportado - + GBA Virtual Console is not supported by Azahar. O Console Virtual de GBA não é suportado pelo Azahar. - - + + Artic Server Servidor Artic - + Invalid system mode Modo de sistema inválido - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Aplicativos exclusivos do New 3DS não podem ser carregados sem ativar o modo New 3DS. - + Error while loading App! Erro ao carregar o App! - + An unknown error occurred. Please see the log for more details. Ocorreu um erro desconhecido. Verifique o registro para mais detalhes. - + CIA must be installed before usage É necessário instalar o CIA antes de usar - + Before using this CIA, you must install it. Do you want to install it now? É necessário instalar este CIA antes de poder usá-lo. Deseja instalá-lo agora? - + Quick Load Carregamento rápido - + Quick Save Salvamento rápido - - + + Slot %1 Espaço %1 - + %2 %3 %2 %3 - + Quick Save - %1 Salvamento rápido - %1 - + Quick Load - %1 Carregamento rápido - %1 - + Slot %1 - %2 %3 Espaço %1 - %2 %3 - + Error Opening %1 Folder Erro ao abrir a pasta %1 - - + + Folder does not exist! A pasta não existe! - + Remove Play Time Data Remover Dados de Tempo de Jogo - + Reset play time? Redefinir tempo de jogo? - - - - + + + + Create Shortcut Criar Atalho - + Do you want to launch the application in fullscreen? Você gostaria de iniciar o aplicativo em tela cheia? - + Successfully created a shortcut to %1 Atalho para %1 criado com sucesso - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Isso criará um atalho para o AppImage atual. Isso pode não funcionar bem se você atualizar. Deseja continuar? - + Failed to create a shortcut to %1 Não foi possível criar um atalho para %1 - + Create Icon Criar Ícone - + Cannot create icon file. Path "%1" does not exist and cannot be created. Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. - + Dumping... Extraindo... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Não foi possível extrair o RomFS base. Consulte o registro para ver os detalhes. - + Error Opening %1 Erro ao abrir %1 - + Select Directory Selecionar pasta - + Properties Propriedades - + The application properties could not be loaded. Não foi possível carregar as propriedades do aplicativo. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executável do 3DS (%1);;Todos os arquivos (*.*) - + Load File Carregar arquivo - - + + Set Up System Files Configurar arquivos do sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>O Azahar precisa dos dados exclusivos do console e arquivos de firmware de um console real para que seja possível usar alguns de seus recursos.<br>Tais arquivos e dados podem ser configurados através da <a href=https://github.com/azahar-emu/ArticSetupTool>Ferramenta de Configuração Artic do Azahar</a><br>Notas:<ul><li><b>Esta operação instalará os dados exclusivos do console para o Azahar, não compartilhe sua pasta de usuário ou nand<br>depois de realizar este processo!</b></li><li>Enquanto estiver realizando o processo de configuração, o Azahar irá vincular-se ao console executando a ferramenta de configuração. Você poderá desvincular<br>o console mais tarde na aba Sistema no menu de configuração do emulador.</li><li>Não entre no online com ambos Azahar e seu console 3DS ao mesmo tempo depois de configurar os arquivos de sistema,<br>já que isso poderá causar problemas.</li><li>A configuração do Antigo 3DS é necessária para a configuração do Novo 3DS funcionar (realizar ambas as configurações é recomendado).</li><li>Ambos os modos de configuração irão funcionar independente do modelo do console executando a ferramenta de configuração.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Digite o endereço da Ferramenta de Configuração Artic do Azahar: - + <br>Choose setup mode: <br>Escolha o modo de configuração: - + (ℹ️) Old 3DS setup (ℹ️) Configuração do Antigo 3DS - - + + Setup is possible. É possível configurar. - + (⚠) New 3DS setup (⚠) Configuração do Novo 3DS - + Old 3DS setup is required first. A configuração do Antigo 3DS é requisitada primeiro. - + (✅) Old 3DS setup (✅) Configuração do Antigo 3DS - - + + Setup completed. Configuração concluída. - + (ℹ️) New 3DS setup (ℹ️) Configuração do Novo 3DS - + (✅) New 3DS setup (✅) Configuração do Novo 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Os arquivos do sistema para o modo selecionado já foram configurados. Reinstalar os arquivos mesmo assim? - + Load Files Carregar arquivos - + 3DS Installation File (*.cia *.zcia) Arquivo de Instalação 3DS (.cia .zcia) - - - + + + All Files (*.*) Todos os arquivos (*.*) - + Connect to Artic Base Conectar-se ao Artic Base - + Enter Artic Base server address: Digite o endereço do servidor Artic Base: - + %1 has been installed successfully. %1 foi instalado. - + Unable to open File Não foi possível abrir o arquivo - + Could not open %1 Não foi possível abrir %1 - + Installation aborted Instalação cancelada - + The installation of %1 was aborted. Please see the log for more details A instalação de %1 foi interrompida. Consulte o registro para mais detalhes - + Invalid File Arquivo inválido - + %1 is not a valid CIA %1 não é um CIA válido - + CIA Encrypted CIA criptografado - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Seu arquivo CIA está criptografado.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Confira nosso blog para mais informações.</a> - + Unable to find File Não foi possível localizar o arquivo - + Could not find %1 Não foi possível localizar %1 - - + + Z3DS Compression Compressão Z3DS - + Failed to compress some files, check log for details. Falha ao comprimir alguns arquivos. Verifique o log para mais detalhes. - + Failed to decompress some files, check log for details. Falha ao descomprimir alguns arquivos. Verifique o log para mais detalhes. - + All files have been compressed successfully. Todos os arquivos foram comprimidos com sucesso. - + All files have been decompressed successfully. Todos os arquivos foram descomprimidos com sucesso. - + Uninstalling '%1'... Desinstalando '%1'... - + Failed to uninstall '%1'. Erro ao desinstalar '%1'. - + Successfully uninstalled '%1'. '%1' desinstalado com sucesso. - + File not found Arquivo não encontrado - + File "%1" not found Arquivo "%1" não encontrado - + Savestates Estados salvos - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4763,86 +4768,86 @@ Use at your own risk! Use por sua conta e risco! - - - + + + Error opening amiibo data file Erro ao abrir arquivo de dados do amiibo - + A tag is already in use. Uma tag já está em uso. - + Application is not looking for amiibos. O aplicativo não está procurando por amiibos. - + Amiibo File (%1);; All Files (*.*) Arquivo do Amiibo (%1);; Todos os arquivos (*.*) - + Load Amiibo Carregar Amiibo - + Unable to open amiibo file "%1" for reading. Não foi possível abrir o arquivo amiibo "%1" para realizar a leitura. - + Record Movie Gravar passos - + Movie recording cancelled. Gravação cancelada. - - + + Movie Saved Gravação salva - - + + The movie is successfully saved. A gravação foi salva. - + Application will unpause O aplicativo será retomado - + The application will be unpaused, and the next frame will be captured. Is this okay? O aplicativo será retomado, e o próximo quadro será capturado. Tudo bem? - + Invalid Screenshot Directory Pasta inválida - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Não é possível criar a pasta especificada. O caminho original foi restabelecido. - + Could not load video dumper Não foi possível carregar o gravador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4855,265 +4860,265 @@ Para instalar o FFmpeg no Azahar, pressione Abrir e selecione seu diretório FFm Para ver um guia sobre como instalar o FFmpeg, pressione Ajuda. - + Load 3DS ROM Files Carregar arquivos de ROM do 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) **Arquivos de ROM do 3DS (.cia *.cci *.3dsx .cxi .3ds) - + 3DS Compressed ROM File (*.%1) Arquivo de ROM 3DS Comprimido (*.%1) - + Save 3DS Compressed ROM File Salvar Arquivo de ROM 3DS Comprimido - + Select Output 3DS Compressed ROM Folder Selecionar Pasta de Saída das ROMs 3DS Comprimidas - + Load 3DS Compressed ROM Files Carregar Arquivos de ROM 3DS Comprimidos - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Arquivos de ROM 3DS Comprimidos (*.zcia *.zcci .z3dsx .zcxi) - + 3DS ROM File (*.%1) Arquivo de ROM 3DS (*.%1) - + Save 3DS ROM File Salvar Arquivo de ROM 3DS - + Select Output 3DS ROM Folder Selecionar Pasta de Saída das ROMs 3DS - + Select FFmpeg Directory Selecione o Diretório FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. O diretório FFmpeg fornecido não foi encontrado %1. Por favor, certifique-se de que o diretório correto foi selecionado. - + FFmpeg has been sucessfully installed. O FFmpeg foi instalado com sucesso. - + Installation of FFmpeg failed. Check the log file for details. A instalação do FFmpeg falhou. Verifique o arquivo de log para obter detalhes. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Não foi possível começar a gravação do vídeo.<br>Assegure-se que o codificador de vídeo está configurado corretamente.<br>Refira-se ao log para mais detalhes. - + Recording %1 Gravando %1 - + Playing %1 / %2 Reproduzindo %1 / %2 - + Movie Finished Reprodução concluída - + (Accessing SharedExtData) (Acessando SharedExtData) - + (Accessing SystemSaveData) (Acessando SystemSaveData) - + (Accessing BossExtData) (Accessando BossExtData) - + (Accessing ExtData) (Acessando ExtData) - + (Accessing SaveData) (Acessando SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tráfego do Artic: %1 %2%3 - + Speed: %1% Velocidade: %1% - + Speed: %1% / %2% Velocidade: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Quadro: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rest: %6 ms) - + Frame: %1 ms Quadro: %1 ms - + VOLUME: MUTE VOLUME: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 está ausente. Por favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>faça a extração dos arquivos do sistema</a>. <br/>Continuar a emulação pode causar falhas e bugs. - + A system archive Um arquivo do sistema - + System Archive Not Found Arquivo de sistema não encontrado - + System Archive Missing Arquivo de sistema em falta - + Save/load Error Erro ao salvar/carregar - + Fatal Error Erro fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ocorreu um erro fatal. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Verifique o log</a> para mais detalhes.<br/>Continuar a emulação pode causar falhas e bugs. - + Fatal Error encountered Erro fatal encontrado - + Continue Continuar - + Quit Application Sair do Aplicativo - + OK OK - + Would you like to exit now? Deseja sair agora? - + The application is still running. Would you like to stop emulation? O aplicativo ainda está em execução. Deseja parar a emulação? - + Playback Completed Reprodução concluída - + Movie playback completed. Reprodução dos passos concluída. - + Update Available Atualização disponível - + Update %1 for Azahar is available. Would you like to download it? A atualização %1 para o Azahar está disponível. Você gostaria de baixá-la? - + Primary Window Janela Principal - + Secondary Window Janela Secundária diff --git a/dist/languages/ro_RO.ts b/dist/languages/ro_RO.ts index 30bdd17e9..6b6e2a84a 100644 --- a/dist/languages/ro_RO.ts +++ b/dist/languages/ro_RO.ts @@ -3799,19 +3799,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4223,12 +4233,12 @@ Vă rugăm să verificați instalarea FFmpeg utilizată pentru compilare. GMainWindow - + Warning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4238,596 +4248,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - Nu au fost detectate dispozitive Vulkan adecvate Detected - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - Inițializarea Vulkan a eșuat în timpul pornirii.<br/>Este posibil ca GPU-ul dvs. să nu accepte Vulkan 1.1 sau să nu aveți cel mai recent driver grafic. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Viteza actuală de emulare. Valori mai mari sau mai mici de 100% indică cum emularea rulează mai repede sau mai încet decât un 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Timp luat pentru a emula un cadru 3DS, fără a pune în calcul limitarea de cadre sau v-sync. Pentru emulare la viteza maximă, această valoare ar trebui să fie maxim 16.67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Curăță Fișiere Recente - + &Continue &Continue - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. A apărut o eroare necunoscută. Vă rugăm să consultați jurnalul pentru mai multe detalii. - + CIA must be installed before usage CIA-ul trebuie instalat înainte de uz - + Before using this CIA, you must install it. Do you want to install it now? Înainte de a folosi acest CIA, trebuie să-l instalati. Doriți s-o faceți acum? - + Quick Load - + Quick Save - - + + Slot %1 Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Eroare Deschizând Folderul %1 - - + + Folder does not exist! Folderul nu există! - + Remove Play Time Data Eliminați datele privind timpul petrecut - + Reset play time? Resetați play time? - - - - + + + + Create Shortcut Creează un Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 Shortcut-ul către %1 a fost creat cu succes - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Asta va crea un shortcut la AppImage-ul curent. Este posibilitate că nu va lucra normal dacă veți actualiza. Continuă? - + Failed to create a shortcut to %1 Nu s-a putut crea o comandă rapidă către %1 - + Create Icon Creează un Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. Nu se poate crea fișierul de icon. Calea "%1" nu există și nu poate fi creat. - + Dumping... Dumping... - - + + Cancel Anulare - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Nu s-a putut să facă dump-ul bazei RomFS. Consultați log-urile pentru detalii. - + Error Opening %1 Eroare Deschizând %1 - + Select Directory Selectează Directorul - + Properties Proprietăți - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executabilă 3DS (%1);;Toate Fișierele (*.*) - + Load File Încarcă Fișier - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Încarcă Fișiere - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Toate Fișierele (*.*) - + Connect to Artic Base Conectează Arctic Base - + Enter Artic Base server address: Introduceți adresa serverului Arctic Base: - + %1 has been installed successfully. %1 a fost instalat cu succes. - + Unable to open File Nu s-a putut deschide Fișierul - + Could not open %1 Nu s-a putut deschide %1 - + Installation aborted Instalare anulată - + The installation of %1 was aborted. Please see the log for more details Instalarea lui %1 a fost anulată. Vă rugăm să vedeți log-ul pentru mai multe detalii. - + Invalid File Fișier Invalid - + %1 is not a valid CIA %1 nu este un CIA valid - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Nu se poate găsi Fișierul - + Could not find %1 %1 n-a fost găsit - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... Dezinstalarea '%1'... - + Failed to uninstall '%1'. Dezinstalarea '%1' a eșuat. - + Successfully uninstalled '%1'. '%1' era dezinstalat cu succes. - + File not found Fișier negăsit - + File "%1" not found Fișierul "%1" nu a fost găsit - + Savestates Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Eroare la deschiderea fișierului de date amiibo - + A tag is already in use. Un tag deja este in folosire. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Fișier Amiibo (%1);; Toate Fișierele (*.*) - + Load Amiibo Încarcă Amiibo - + Unable to open amiibo file "%1" for reading. Nu se poate deschide fișierul amiibo "%1" pentru citire. - + Record Movie Înregistrează Film - + Movie recording cancelled. Înregistrarea filmului a fost anulată. - - + + Movie Saved Film Salvat - - + + The movie is successfully saved. Filmul a fost salvat cu succes. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Directoria Capturii de Ecran este Invalidă - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Nu se poate crea directoria specificată a capturii de ecran. Calea capturii de ecran a fost setat implicit - + Could not load video dumper Dumperul video nu a putut fi încărcat - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4836,264 +4841,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory Selectați Directoria FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Directoria FFmpeg furnizată nu este prezentă %1. Vă rugăm să vă asigurați că ați selectat directoria corectă. - + FFmpeg has been sucessfully installed. FFmpeg era instalat cu succes. - + Installation of FFmpeg failed. Check the log file for details. Instalația FFmpeg a eșuat. Verificați log-urile pentru detalii. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Înregistrarea %1 - + Playing %1 / %2 Playing %1 / %2 - + Movie Finished Filmul finisat - + (Accessing SharedExtData) (Se accesează SharedExtData) - + (Accessing SystemSaveData) (Se accesează SystemSaveData) - + (Accessing BossExtData) (Se accesează BossExtData) - + (Accessing ExtData) (Se accesează ExtData) - + (Accessing SaveData) (Se accesează SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Viteză: %1% - + Speed: %1% / %2% Viteză: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Cadru: %1 ms - + VOLUME: MUTE VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Arhivul sistemului - + System Archive Not Found Fișier de Sistem Negăsit - + System Archive Missing Arhivul Sistemului nu este Prezent - + Save/load Error Eroare la salvare/încărcare - + Fatal Error Eroare Fatală - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered S-a Produs o Eroare Fatală - + Continue Continuă - + Quit Application - + OK OK - + Would you like to exit now? Doriți să ieșiți acum? - + The application is still running. Would you like to stop emulation? - + Playback Completed Redare Finalizată - + Movie playback completed. Redarea filmului a fost finalizată. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Fereastră Primară - + Secondary Window Fereastră Secundară diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index a32154e16..9f1e97d37 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -3805,19 +3805,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4230,12 +4240,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Предупреждение - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4245,596 +4255,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция работает быстрее или медленнее, чем в 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, затрачиваемое на эмуляцию кадра 3DS, без учёта ограничения кадров или вертикальной синхронизации. Для полноскоростной эмуляции это значение должно быть не более 16,67 мс. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Очистить последние файлы - + &Continue &Продолжить - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. Azahar не поддерживает GBA Virtual Console. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Подробную информацию см. в журнале. - + CIA must be installed before usage Перед использованием необходимо установить CIA-файл - + Before using this CIA, you must install it. Do you want to install it now? Перед использованием этого CIA-файла, необходимо его установить. Установить сейчас? - + Quick Load Быстрая загрузка - + Quick Save Быстрое сохранение - - + + Slot %1 Ячейка %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Ошибка открытия папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Play Time Data - + Reset play time? Сбросить игровое время? - - - - + + + + Create Shortcut Создать ярлык - + Do you want to launch the application in fullscreen? Запускать приложение в полном экране? - + Successfully created a shortcut to %1 Успешно создан ярлык для %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 Не удалось создать ярлык для %1 - + Create Icon Создать иконку - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Создание дампа... - - + + Cancel Отмена - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Не удалось создать дамп base RomFS. Подробную информацию см. в журнале. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать каталог - + Properties Свойства - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Исполняемый файл 3DS (%1);;Все файлы (*.*) - + Load File Загрузка файла - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: Выберите режим установки: - + (ℹ️) Old 3DS setup (ℹ️) Обычная 3DS - - + + Setup is possible. - + (⚠) New 3DS setup (⚠) New 3DS - + Old 3DS setup is required first. Сначала требуется установка обычной 3DS. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Загрузка файлов - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Все файлы (*.*) - + Connect to Artic Base Подключиться к Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 был успешно установлен. - + Unable to open File Не удалось открыть файл - + Could not open %1 Не удалось открыть %1 - + Installation aborted Установка прервана - + The installation of %1 was aborted. Please see the log for more details Установка %1 была прервана. Более подробную информацию см. в журнале. - + Invalid File Недопустимый файл - + %1 is not a valid CIA %1 — недопустимый CIA-файл - + CIA Encrypted CIA файл зашифрован - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Не удалось найти файл - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... Удаление '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. Успешно удалён '%1'. - + File not found Файл не найден - + File "%1" not found Файл «%1» не найден - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все файлы (*.*) - + Load Amiibo Загрузка Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Запись видеоролика - + Movie recording cancelled. Запись видеоролика отменена. - - + + Movie Saved Сохранение видеоролика - - + + The movie is successfully saved. Видеоролик сохранён успешно. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4843,264 +4848,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory Выберите каталог FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Скорость: %1% - + Speed: %1% / %2% Скорость: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Кадр: %1 мс - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Системный архив - + System Archive Not Found Системный архив не найден - + System Archive Missing Не удалось найти системный архив - + Save/load Error Ошибка сохранения/загрузки - + Fatal Error Неустранимая ошибка - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Произошла неустранимая ошибка - + Continue Продолжить - + Quit Application Закрыть Приложение - + OK OK - + Would you like to exit now? Выйти сейчас? - + The application is still running. Would you like to stop emulation? - + Playback Completed Воспроизведение завершено - + Movie playback completed. Воспроизведение видеоролика завершено. - + Update Available Доступно обновление - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Основной Экран - + Secondary Window Дополнительный Экран diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 71ca19c60..f6f269eb9 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -3807,19 +3807,29 @@ installerade applikationer. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found Status: Hittades inte - + Status: Invalid Status: Ogiltig - + Status: IO Error Status: In/ut-fel + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4231,12 +4241,12 @@ Kontrollera din FFmpeg-installation som användes för kompilering. GMainWindow - + Warning Varning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4251,511 +4261,506 @@ Det rekommenderas istället att köra Azahar med kommandot `open`, t.ex.: `open ./Azahar.app` - - No Suitable Vulkan Devices Detected - Inga lämpliga Vulkan-enheter upptäcktes - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - Vulkan-initialiseringen misslyckades under uppstarten.<br/>Din GPU kanske inte stöder Vulkan 1.1, eller så har du inte den senaste grafikdrivrutinen. - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Aktuell hastighet för Artic-trafiken. Högre värden indikerar större överföringslaster. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Aktuell emuleringshastighet. Värden som är högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Hur många bilder per sekund som appen visar för närvarande. Detta varierar från app till app och från scen till scen. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tidsåtgång för att emulera en 3DS-bildruta, utan att räkna med framelimiting eller v-sync. För emulering med full hastighet bör detta vara högst 16,67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) MicroProfile (inte tillgänglig) - + Clear Recent Files Töm senaste filer - + &Continue &Fortsätt - + &Pause &Paus - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar kör en applikation - - + + Invalid App Format Ogiltigt appformat - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Ditt appformat stöds inte.<br/>Följ anvisningarna för att återdumpa dina <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>spelkassetter</a> eller <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installerade titlar</a>. - + App Corrupted Appen skadad - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Din app är skadad. <br/>Följ guiderna för att återdumpa dina <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>spelkassetter</a> eller <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installerade titlar</a>. - + App Encrypted App krypterad - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Din app är krypterad. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Mer information finns på vår blogg.</a> - + Unsupported App App som inte stöds - + GBA Virtual Console is not supported by Azahar. GBA Virtual Console stöds inte av Azahar. - - + + Artic Server Artic-server - + Invalid system mode Ogiltigt systemläge - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Nya 3DS-exklusiva applikationer kan inte läsas in utan att aktivera Ny 3DS-läget. - + Error while loading App! Fel vid inläsning av app! - + An unknown error occurred. Please see the log for more details. Ett okänt fel har inträffat. Se loggen för mer information. - + CIA must be installed before usage CIA måste installeras före användning - + Before using this CIA, you must install it. Do you want to install it now? Innan du använder denna CIA måste du installera den. Vill du installera den nu? - + Quick Load Snabbinläsning - + Quick Save Snabbsparning - - + + Slot %1 Plats %1 - + %2 %3 %2 %3 - + Quick Save - %1 Snabbsparning - %1 - + Quick Load - %1 Snabbinläsning - %1 - + Slot %1 - %2 %3 Plats %1 - %2 %3 - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Återställ speltid? - - - - + + + + Create Shortcut Skapa genväg - + Do you want to launch the application in fullscreen? Vill du starta applikationen i helskärm? - + Successfully created a shortcut to %1 Skapade framgångsrikt en genväg till %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Detta kommer att skapa en genväg till den aktuella AppImage. Detta kanske inte fungerar så bra om du uppdaterar. Fortsätta? - + Failed to create a shortcut to %1 Misslyckades med att skapa en genväg till %1 - + Create Icon Skapa ikon - + Cannot create icon file. Path "%1" does not exist and cannot be created. Det går inte att skapa en ikonfil. Sökvägen "%1" finns inte och kan inte skapas. - + Dumping... Dumpar... - - + + Cancel Avbryt - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Kunde inte dumpa RomFS-basen. Se loggen för mer information. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The application properties could not be loaded. Applikationsegenskaperna kunde inte läsas in. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Körbar 3DS-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - - + + Set Up System Files Konfigurera systemfiler - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar behöver konsolunika data och firmware-filer från en riktig konsol för att kunna använda vissa av dess funktioner. <br>Sådana filer och data kan konfigureras med <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool </a><br>Observera:<ul><li><b> Den här åtgärden installerar konsolunika data till Azahar, dela inte dina användar- eller nand-mappar<br> efter att du har utfört installationsprocessen!</b></li><li> Under installationsprocessen kommer Azahar att länkas till den konsol som kör installationsverktyget. Du kan koppla bort <br>konsolen senare från fliken System i emulatorns konfigurationsmeny. </li><li>Gå inte online med både Azahar och din 3DS-konsol samtidigt efter att du har konfigurerat systemfiler, <br>eftersom det kan orsaka problem.</li><li> En installation av den gamla 3DS:en behövs för att installationen av den nya 3DS:en ska fungera (vi rekommenderar att du gör båda installationslägena).</li><li> Båda installationslägena fungerar oavsett vilken konsolmodell som kör installationsverktyget.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Ange adressen till Azahar Artic Setup Tool: - + <br>Choose setup mode: <br>Välj konfigurationsläge: - + (ℹ️) Old 3DS setup (ℹ️) Gammal 3DS-konfiguration - - + + Setup is possible. Konfiguration är möjlig. - + (⚠) New 3DS setup (⚠) Ny 3DS-konfiguration - + Old 3DS setup is required first. Gammal 3DS-konfiguration krävs först. - + (✅) Old 3DS setup (✅) Gammal 3DS-konfiguration - - + + Setup completed. Konfigurationen är färdig. - + (ℹ️) New 3DS setup (ℹ️) Ny 3DS-konfiguration - + (✅) New 3DS setup (✅) Ny 3DS-konfiguration - + The system files for the selected mode are already set up. Reinstall the files anyway? Systemfilerna för det valda läget är redan konfigurerade. Installera om filerna i alla fall? - + Load Files Läs in filer - + 3DS Installation File (*.cia *.zcia) 3DS-installationsfil (*.cia *.zcia) - - - + + + All Files (*.*) Alla filer (*.*) - + Connect to Artic Base Anslut till Artic Base - + Enter Artic Base server address: Ange Artic Base-serveradress: - + %1 has been installed successfully. %1 har installerats. - + Unable to open File Kunde inte öppna filen - + Could not open %1 Kunde inte öppna %1 - + Installation aborted Installationen avbröts - + The installation of %1 was aborted. Please see the log for more details Installationen av %1 avbröts. Se loggen för mer information - + Invalid File Ogiltig fil - + %1 is not a valid CIA %1 är inte en giltig CIA - + CIA Encrypted CIA-krypterad - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Din CIA-fil är krypterad.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Kolla vår blogg för mer info</a> - + Unable to find File Det går inte att hitta filen - + Could not find %1 Kunde inte hitta %1 - - + + Z3DS Compression Z3DS-komprimering - + Failed to compress some files, check log for details. Misslyckades med att komprimera några filer. Kontrollera loggen. - + Failed to decompress some files, check log for details. Misslyckades med att packa upp några filer. Kontrollera loggen. - + All files have been compressed successfully. Alla filer har komprimerats utan problem. - + All files have been decompressed successfully. Alla filer har packats upp utan problem. - + Uninstalling '%1'... Avinstallation av "%1"... - + Failed to uninstall '%1'. Misslyckades med att avinstallera "%1". - + Successfully uninstalled '%1'. Avinstallationen av "%1" har lyckats. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + Savestates Sparade tillstånd - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4764,86 +4769,86 @@ Use at your own risk! Använd på egen risk! - - - + + + Error opening amiibo data file Fel vid öppning av amiibo datafil - + A tag is already in use. En tagg är redan i bruk. - + Application is not looking for amiibos. Applikationen letar inte efter amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Unable to open amiibo file "%1" for reading. Det gick inte att öppna amiibo-filen "%1" för läsning. - + Record Movie Spela in film - + Movie recording cancelled. Filminspelning avbruten. - - + + Movie Saved Filmen sparades - - + + The movie is successfully saved. Filmen sparades. - + Application will unpause Applikationen kommer att återupptas - + The application will be unpaused, and the next frame will be captured. Is this okay? Applikationen kommer att återupptas och nästa bildruta kommer att fångas. Är det här okej? - + Invalid Screenshot Directory Ogiltig katalog för skärmbilder - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Det går inte att skapa angiven skärmbildskatalog. Sökvägen för skärmbilder återställs till sitt standardvärde. - + Could not load video dumper Kunde inte läsa in videodumpern - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4856,265 +4861,265 @@ För att installera FFmpeg till Azahar, tryck på Öppna och välj din FFmpeg-ka Om du vill visa en guide om hur du installerar FFmpeg trycker du på Hjälp. - + Load 3DS ROM Files Läs in 3DS ROM-filer - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) 3DS ROM-filer (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Komprimerad 3DS ROM-fil (*.%1) - + Save 3DS Compressed ROM File Spara komprimerad 3DS ROM-fil - + Select Output 3DS Compressed ROM Folder Välj utdatamapp för 3DS-komprimerad ROM - + Load 3DS Compressed ROM Files Läs in 3DS-komprimerade ROM-filer - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Komprimerade 3DS ROM-filer (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) 3DS ROM-fil (*.%1) - + Save 3DS ROM File Spara 3DS ROM-fil - + Select Output 3DS ROM Folder Välj utdatamapp för 3DS ROM - + Select FFmpeg Directory Välj FFmpeg-katalog - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Den angivna FFmpeg-katalogen saknar %1. Kontrollera att rätt katalog har valts. - + FFmpeg has been sucessfully installed. FFmpeg har installerats. - + Installation of FFmpeg failed. Check the log file for details. Installationen av FFmpeg misslyckades. Kontrollera loggfilen för mer information. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Det gick inte att starta videodumpningen.<br>Kontrollera att videokodaren är korrekt konfigurerad.<br>Se loggen för mer information. - + Recording %1 Spelar in %1 - + Playing %1 / %2 Spelar %1 / %2 - + Movie Finished Filmen är färdig - + (Accessing SharedExtData) (Åtkomst till SharedExtData) - + (Accessing SystemSaveData) (Åtkomst till SystemSaveData) - + (Accessing BossExtData) (Åtkomst till BossExtData) - + (Accessing ExtData) (Åtkomst till ExtData) - + (Accessing SaveData) (Åtkomst till SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic-trafik: %1 %2%3 - + Speed: %1% Hastighet: %1% - + Speed: %1% / %2% Hastighet: %1% / %2% - + App: %1 FPS App: %1 bilder/s - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Bildruta: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Bildruta: %1 ms - + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 saknas. <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>Dumpa dina systemarkiv</a>.<br/>Fortsatt emulering kan resultera i krascher och buggar. - + A system archive Ett systemarkiv - + System Archive Not Found Systemarkiv hittades inte - + System Archive Missing Systemarkiv saknas - + Save/load Error Fel vid spara/läs in - + Fatal Error Ödesdigert fel - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ett ödesdigert fel inträffade. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Kontrollera loggen</a> för detaljer.<br/>Fortsatt emulering kan resultera i krascher och buggar. - + Fatal Error encountered Allvarligt fel uppstod - + Continue Fortsätt - + Quit Application Avsluta applikation - + OK Ok - + Would you like to exit now? Vill du avsluta nu? - + The application is still running. Would you like to stop emulation? Applikationen körs fortfarande. Vill du stoppa emuleringen? - + Playback Completed Uppspelningen är färdig - + Movie playback completed. Uppspelning av film slutförd. - + Update Available Uppdatering tillgänglig - + Update %1 for Azahar is available. Would you like to download it? Uppdatering %1 för Azahar finns tillgänglig. Vill du hämta ner den? - + Primary Window Primärt fönster - + Secondary Window Sekundärt fönster diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 3ddc4f815..01c08ca35 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -3805,19 +3805,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found Durum: Bulunamadı - + Status: Invalid Durum: Geçersiz - + Status: IO Error Durum: IO Hatası + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4227,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Uyarı - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4242,509 +4252,504 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Geçerli emülasyon hızı. 100%'den az veya çok olan değerler emülasyonun bir 3DS'den daha yavaş veya daha hızlı çalıştığını gösterir. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Bir 3DS karesini emüle etmekte geçen zaman, karelimitleme ve v-sync hariç. Tam hız emülasyon için bu en çok 16,67 ms. olmalı. - + + Emulated notification LED + + + + MicroProfile (unavailable) MikroProfil (kullanılamaz) - + Clear Recent Files Son Dosyaları Temizle - + &Continue &Devam et - + &Pause &Duraklat - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar bir uygulama çalıştırıyor - - + + Invalid App Format Geçersiz Uygulama Biçimi - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted Uygulama Şifreli - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App Desteklenmeyen Uygulama - + GBA Virtual Console is not supported by Azahar. GBA Sanal Konsolu Azahar tarafından desteklenmiyor. - - + + Artic Server Artic Sunucusu - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! Uygulama yüklenirken hata oluştu! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA dosyası kullanılmadan önce yüklenmelidir - + Before using this CIA, you must install it. Do you want to install it now? Bu CIA dosyasını kullanmadan önce yüklemeniz gerekir. Şimdi yüklemek ister misiniz? - + Quick Load Hızlı Yükle - + Quick Save Hızlı Kaydet - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Hızlı Kayıt - %1 - + Quick Load - %1 Hızlı Yükleme - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder %1 Klasörü Açılırken Hata Oluştu - - + + Folder does not exist! Klasör mevcut değil! - + Remove Play Time Data - + Reset play time? Oynama süresi sıfırlansın mı? - - - - + + + + Create Shortcut Kısayol Oluştur - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Simge Oluştur - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dump ediliyor... - - + + Cancel İptal et - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Temel RomFS dump edilemedi. Detaylar için kütük dosyasına bakınız. - + Error Opening %1 %1 Açılırken Hata Oluştu - + Select Directory Dizin Seç - + Properties Özellikler - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Çalıştırılabiliri (%1);; Bütün Dosyalar (*.*) - + Load File Dosya Yükle - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. Kurulum tamamlandı. - + (ℹ️) New 3DS setup (ℹ️) Yeni 3DS kurulumu - + (✅) New 3DS setup (✅) Yeni 3DS kurulumu - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Dosyaları Yükle - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Tüm Dosyalar (*.*) - + Connect to Artic Base Artic Base'e Bağla - + Enter Artic Base server address: - + %1 has been installed successfully. %1 başarıyla yüklendi. - + Unable to open File Dosya açılamıyor - + Could not open %1 %1 açılamıyor - + Installation aborted Yükleme iptal edildi - + The installation of %1 was aborted. Please see the log for more details %1'in yüklemesi iptal edildi. Daha fazla detay için lütfen kütüğe bakınız. - + Invalid File Geçersiz Dosya - + %1 is not a valid CIA %1 geçerli bir CIA dosyası değil - + CIA Encrypted CİA Şifreli - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Dosya bulunamadı - + Could not find %1 %1 bulunamadı - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1' siliniyor... - + Failed to uninstall '%1'. '%1' silinemedi. - + Successfully uninstalled '%1'. '%1' başarıyla silindi. - + File not found Dosya bulunamadı - + File "%1" not found "%1" Dosyası bulunamadı - + Savestates Kayıt Durumları - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4753,86 +4758,86 @@ Use at your own risk! Kullanım riski size aittir! - - - + + + Error opening amiibo data file Amiibo veri dosyasını açarken bir hata oldu - + A tag is already in use. Bir etiket zaten kullanılıyor. - + Application is not looking for amiibos. Uygulama amiibo aramıyor. - + Amiibo File (%1);; All Files (*.*) Amiibo Dosyası (%1);; Tüm Dosyalar (*.*) - + Load Amiibo Amiibo Yükle - + Unable to open amiibo file "%1" for reading. - + Record Movie Klip Kaydet - + Movie recording cancelled. Klip kaydı iptal edildi. - - + + Movie Saved Klip Kaydedildi - - + + The movie is successfully saved. Klip başarıyla kayıt edildi. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Geçersiz Ekran Görüntüsü Dizini - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4841,264 +4846,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory FFmpeg Dizini Seç - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. FFmpeg başarıyla yüklendi. - + Installation of FFmpeg failed. Check the log file for details. FFmpeg yüklemesi başarısız oldu. Detaylar için log dosyasına bakınız. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Ekran Kaydediliyor %1 - + Playing %1 / %2 Oynatılıyor %1 / %2 - + Movie Finished Film Bitti - + (Accessing SharedExtData) (SharedExtData'ya Erişiliyor) - + (Accessing SystemSaveData) (SystemSaveData'ya Erişiliyor) - + (Accessing BossExtData) (BossExtData'ya Erişiliyor) - + (Accessing ExtData) (ExtData'ya Erişiliyor) - + (Accessing SaveData) (SaveData'ya Erişiliyor) - + MB/s MB/sn - + KB/s KB/sn - + Artic Traffic: %1 %2%3 - + Speed: %1% Hız: %1% - + Speed: %1% / %2% Hız: %1% / %2% - + App: %1 FPS Uygulama: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kare: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Bir sistem arşivi - + System Archive Not Found Sistem Arşivi Bulunamadı - + System Archive Missing Sistem Arşivi Eksik - + Save/load Error Kaydetme/yükleme Hatası - + Fatal Error Önemli Hata - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Kritik hatayla karşılaşıldı - + Continue Devam - + Quit Application Uygulamadan Çık - + OK Tamam - + Would you like to exit now? Çıkmak istediğinize emin misiniz? - + The application is still running. Would you like to stop emulation? Uygulama hala çalışıyor. Emülasyonu durdurmak ister misiniz? - + Playback Completed Oynatma Tamamlandı - + Movie playback completed. Klip oynatması tamamlandı. - + Update Available Güncelleme Mevcut - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Birincil Pencere - + Secondary Window İkincil Pencere diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 5da5fbee5..22390537b 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -3798,19 +3798,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4220,12 +4230,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Cảnh báo - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4235,596 +4245,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Tốc độ giả lập hiện tại. Giá trị cao hoặc thấp hơn 100% thể hiện giả lập đang chạy nhanh hay chậm hơn một chiếc máy 3DS thực sự. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Thời gian để giả lập một khung hình của máy 3DS, không gồm giới hạn khung hay v-sync Một giả lập tốt nhất sẽ tiệm cận 16.67 ms. - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files Xóa danh sách tệp gần đây - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA cần được cài đặt trước khi dùng - + Before using this CIA, you must install it. Do you want to install it now? Trước khi sử dụng CIA, bạn cần cài đặt nó. Bạn có muốn cài đặt nó ngay không? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Lỗi khi mở thư mục %1 - - + + Folder does not exist! Thư mục này không tồn tại! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Đang trích xuất... - - + + Cancel Hủy bỏ - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Không thể trích xuất base RomFS. Kiểm tra log để biết thêm chi tiết. - + Error Opening %1 Lỗi khi mở %1 - + Select Directory Chọn thư mục - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Mở tệp tin - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Mở các tệp tin - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Tất cả tệp tin (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 đã được cài đặt thành công. - + Unable to open File Không thể mở tệp tin - + Could not open %1 Không thể mở %1 - + Installation aborted Việc cài đặt đã bị hoãn - + The installation of %1 was aborted. Please see the log for more details Việc cài đặt %1 đã bị hoãn. Vui lòng xem bản ghi nhật ký để biết thêm chi tiết. - + Invalid File Tệp tin không hợp lệ - + %1 is not a valid CIA %1 không phải là một tệp CIA hợp lệ - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Không tìm thấy tệp - + File "%1" not found Không tìm thấy tệp tin "%1" - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Tệp Amiibo (%1);; Tất cả tệp (*.*) - + Load Amiibo Tải Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Quay phim - + Movie recording cancelled. Ghi hình đã bị hủy. - - + + Movie Saved Đã lưu phim. - - + + The movie is successfully saved. Phim đã được lưu lại thành công. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4833,264 +4838,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Tốc độ: %1% - + Speed: %1% / %2% Tốc độ: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Khung: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Một tập tin hệ thống - + System Archive Not Found Không tìm thấy tập tin hệ thống - + System Archive Missing Thiếu tập tin hệ thống - + Save/load Error - + Fatal Error Lỗi nghiêm trọng - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Tiếp tục - + Quit Application - + OK OK - + Would you like to exit now? Bạn có muốn thoát ngay bây giờ không? - + The application is still running. Would you like to stop emulation? - + Playback Completed Phát lại hoàn tất - + Movie playback completed. Phát lại phim hoàn tất. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 47cc54ee8..6b052e9a8 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -3806,19 +3806,29 @@ installed applications. + Status: Loaded (Cannot Validate Signature) + + + + Status: Not Found 状态:未找到 - + Status: Invalid 状态:无效 - + Status: IO Error 状态:IO 错误 + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4230,12 +4240,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 警告 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4245,511 +4255,506 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - 未检测到可用的 Vulkan 设备 - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - Vulkan 初始化失败。<br/>您的 GPU 可能不支持 Vulkan 1.1,或者您没有安装最新的图形驱动程序。 - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. 当前 Artic 连接速度。数值越高,表示传递载荷越大。 - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 当前模拟速度。高于或低于 100% 的值表示模拟正在运行得比实际 3DS 更快或更慢。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. 应用当前显示的每秒帧数。这会因应用和场景而异。 - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 在不计算速度限制和垂直同步的情况下,模拟一个 3DS 帧的实际时间。若要进行全速模拟,这个数值不应超过 16.67 毫秒。 - + + Emulated notification LED + + + + MicroProfile (unavailable) 微档案文件(不可用) - + Clear Recent Files 清除最近文件 - + &Continue 继续(&C) - + &Pause 暂停(&P) - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar 正在运行应用 - - + + Invalid App Format 无效的应用格式 - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. 您的应用格式不受支持。<br/>请遵循以下指引重新转储您的<a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>游戏卡带</a>或<a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>已安装的应用</a>。 - + App Corrupted 应用已损坏 - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. 您的应用已损坏。<br/>请遵循以下指引重新转储您的<a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>游戏卡带</a>或<a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>已安装的应用</a>。 - + App Encrypted 应用已加密 - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> 您的应用已加密。 <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>请查看我们的博客以了解更多信息。</a> - + Unsupported App 不支持的应用 - + GBA Virtual Console is not supported by Azahar. GBA 虚拟主机不受 Azahar 支持。 - - + + Artic Server Artic 服务器 - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! 加载应用时出错! - + An unknown error occurred. Please see the log for more details. 发生了一个未知错误。详情请参阅日志。 - + CIA must be installed before usage CIA 文件必须安装后才能使用 - + Before using this CIA, you must install it. Do you want to install it now? 在使用这个 CIA 文件前,您必须先进行安装。您希望现在就安装它吗? - + Quick Load 快速载入 - + Quick Save 快速保存 - - + + Slot %1 插槽 %1 - + %2 %3 %2 %3 - + Quick Save - %1 快速保存 - %1 - + Quick Load - %1 快速载入 - %1 - + Slot %1 - %2 %3 插槽 %1 - %2 %3 - + Error Opening %1 Folder 无法打开 %1 文件夹 - - + + Folder does not exist! 文件夹不存在! - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 重置游戏时间? - - - - + + + + Create Shortcut 创建快捷方式 - + Do you want to launch the application in fullscreen? 您想以全屏幕运行应用吗? - + Successfully created a shortcut to %1 已经在 %1 上创建了快捷方式。 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? 这将会为当前的 AppImage 创建一个快捷方式。如果您更新,此快捷方式可能会无效。继续吗? - + Failed to create a shortcut to %1 在 %1 上创建快捷方式失败。 - + Create Icon 创建图标 - + Cannot create icon file. Path "%1" does not exist and cannot be created. 无法创建图标文件。路径“%1”不存在,且无法创建。 - + Dumping... 转储中... - - + + Cancel 取消 - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. 无法转储 RomFS 。 有关详细信息,请参考日志文件。 - + Error Opening %1 无法打开 %1 - + Select Directory 选择目录 - + Properties 属性 - + The application properties could not be loaded. 无法加载应用属性。 - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - - + + Set Up System Files 设置系统文件 - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar 需要来自真实掌机的独有数据和固件文件才能使用其部分功能。<br>此类文件和数据可通过 <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic 设置工具</a>进行设置<br>注意:<ul><li><b>此操作会将掌机独有数据安装到 Azahar,<br>执行设置过程后请勿共享您的用户或 nand 文件夹!</b></li><li>在执行设置过程时,Azahar 将关联到运行设置工具的掌机。<br>您可以随时从模拟器配置菜单的“系统”选项卡中取消关联掌机。</li><li>设置系统文件后,请勿同时使用 Azahar 和 3DS 掌机联网,<br>因为这可能会导致问题。</li><li>新 3DS 设置需要先进行老 3DS 设置才能运作(建议两种设置模式都执行)。</li><li>无论运行设置工具的掌机型号如何,两种设置模式均可运作。</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: 输入 Azahar Artic 设置工具地址: - + <br>Choose setup mode: <br>选择设置模式: - + (ℹ️) Old 3DS setup (ℹ️) 老 3DS 设置 - - + + Setup is possible. 可以进行设置。 - + (⚠) New 3DS setup (⚠) 新 3DS 设置 - + Old 3DS setup is required first. 首先需要设置老 3DS。 - + (✅) Old 3DS setup (✅) 老 3DS 设置 - - + + Setup completed. 设置完成。 - + (ℹ️) New 3DS setup (ℹ️) 新 3DS 设置 - + (✅) New 3DS setup (✅) 新 3DS 设置 - + The system files for the selected mode are already set up. Reinstall the files anyway? 所选模式的系统文件已设置。 是否要重新安装文件? - + Load Files 加载多个文件 - + 3DS Installation File (*.cia *.zcia) 3DS 安装文件 (*.cia *.zcia) - - - + + + All Files (*.*) 所有文件 (*.*) - + Connect to Artic Base 连接到 Artic Base - + Enter Artic Base server address: 输入 Artic Base 服务器地址: - + %1 has been installed successfully. %1 已成功安装。 - + Unable to open File 无法打开文件 - + Could not open %1 无法打开 %1 - + Installation aborted 安装失败 - + The installation of %1 was aborted. Please see the log for more details %1 的安装过程失败。请参阅日志以了解细节。 - + Invalid File 文件无效 - + %1 is not a valid CIA %1 不是有效的 CIA 文件 - + CIA Encrypted CIA 已加密 - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> 您的 CIA 文件已加密。 <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>请查看我们的博客以了解更多信息。</a> - + Unable to find File 无法找到文件 - + Could not find %1 找不到 %1 - - + + Z3DS Compression Z3DS 压缩 - + Failed to compress some files, check log for details. 部分文件压缩失败,请查看日志了解详情。 - + Failed to decompress some files, check log for details. 部分文件解压缩失败,请查看日志了解详情。 - + All files have been compressed successfully. 所有文件已成功压缩。 - + All files have been decompressed successfully. 所有文件已成功解压缩。 - + Uninstalling '%1'... 正在卸载“%1”... - + Failed to uninstall '%1'. 卸载“%1”失败。 - + Successfully uninstalled '%1'. “%1”卸载成功。 - + File not found 找不到文件 - + File "%1" not found 找不到文件“%1” - + Savestates 保存状态 - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4758,86 +4763,86 @@ Use at your own risk! 您必须自行承担使用风险! - - - + + + Error opening amiibo data file 打开 Amiibo 数据文件时出错 - + A tag is already in use. 当前已有 Amiibo 标签在使用中。 - + Application is not looking for amiibos. 应用未在寻找 Amiibo。 - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);;所有文件 (*.*) - + Load Amiibo 加载 Amiibo - + Unable to open amiibo file "%1" for reading. 无法打开 Amiibo 文件 %1 。 - + Record Movie 录制影像 - + Movie recording cancelled. 影像录制已取消。 - - + + Movie Saved 影像已保存 - - + + The movie is successfully saved. 影像已成功保存。 - + Application will unpause 应用将取消暂停 - + The application will be unpaused, and the next frame will be captured. Is this okay? 将取消暂停应用,并捕获下一帧。这样可以吗? - + Invalid Screenshot Directory 无效的截图保存目录 - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. 无法创建指定的截图保存目录。截图保存路径将重设为默认值。 - + Could not load video dumper 无法加载视频转储器 - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4850,265 +4855,265 @@ To view a guide on how to install FFmpeg, press Help. 要查看如何安装 FFmpeg 的指南,请按“帮助”。 - + Load 3DS ROM Files 加载 3DS ROM 文件 - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) 3DS 压缩 ROM 文件 (*.%1) - + Save 3DS Compressed ROM File 保存 3DS 压缩 ROM 文件 - + Select Output 3DS Compressed ROM Folder 选择输出 3DS 压缩 ROM 的文件夹 - + Load 3DS Compressed ROM Files 加载 3DS 压缩 ROM 文件 - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) 3DS 压缩 ROM 文件 (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) 3DS ROM 文件 (*.%1) - + Save 3DS ROM File 保存 3DS ROM 文件 - + Select Output 3DS ROM Folder 选择输出 3DS ROM 的文件夹 - + Select FFmpeg Directory 选择 FFmpeg 目录 - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. 选择的 FFmpeg 目录中缺少 %1 。请确保选择了正确的目录。 - + FFmpeg has been sucessfully installed. FFmpeg 已成功安装。 - + Installation of FFmpeg failed. Check the log file for details. 安装 FFmpeg 失败。详情请参阅日志文件。 - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. 无法开始视频转储。<br>请确保视频编码器配置正确。<br>有关详细信息,请参阅日志。 - + Recording %1 录制中 %1 - + Playing %1 / %2 播放中 %1 / %2 - + Movie Finished 录像播放完毕 - + (Accessing SharedExtData) (正在获取 SharedExtData) - + (Accessing SystemSaveData) (正在获取 SystemSaveData) - + (Accessing BossExtData) (正在获取 BossExtData) - + (Accessing ExtData) (正在获取 ExtData) - + (Accessing SaveData) 正在获取(SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic 流量:%1 %2%3 - + Speed: %1% 速度:%1% - + Speed: %1% / %2% 速度:%1% / %2% - + App: %1 FPS 应用: %1 帧 - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) 帧: %1 毫秒 (GPU: [CMD: %2 毫秒, SWP: %3 毫秒], IPC: %4 毫秒, SVC: %5 毫秒, Rem: %6 毫秒) - + Frame: %1 ms 帧延迟:%1 毫秒 - + VOLUME: MUTE 音量:静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量:%1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 缺失。请 <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>转储您的系统档案</a>。<br/>继续进行模拟可能会导致崩溃和错误。 - + A system archive 系统档案 - + System Archive Not Found 未找到系统档案 - + System Archive Missing 系统档案丢失 - + Save/load Error 保存/读取出现错误 - + Fatal Error 致命错误 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. 发生了致命错误。请<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>参阅日志</a>了解详细信息。<br/>继续进行模拟可能会导致崩溃和错误。 - + Fatal Error encountered 发生致命错误 - + Continue 继续 - + Quit Application 退出应用 - + OK 确定 - + Would you like to exit now? 您现在要退出么? - + The application is still running. Would you like to stop emulation? 应用仍在运行。您想停止模拟吗? - + Playback Completed 播放完成 - + Movie playback completed. 影像播放完成。 - + Update Available 有可用更新 - + Update %1 for Azahar is available. Would you like to download it? Azahar 的更新 %1 已发布。 您要下载吗? - + Primary Window 主窗口 - + Secondary Window 次级窗口 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 9d55706f5..8ac9a0442 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -3799,19 +3799,29 @@ installed applications. - Status: Not Found + Status: Loaded (Cannot Validate Signature) - Status: Invalid + Status: Not Found + Status: Invalid + + + + Status: IO Error + + + Status: Missing Crypto Keys + + ConfigureTouchFromButton @@ -4221,12 +4231,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 警告 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4236,597 +4246,592 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - - No Suitable Vulkan Devices Detected - - - - - Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - - - - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 目前模擬速度, 「高於/低於」100% 代表模擬速度比 3DS 實機「更快/更慢」。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 不計算影格限制或垂直同步時, 模擬一個 3DS 影格所花的時間。全速模擬時,這個數值最多應為 16.67 毫秒。 - + + Emulated notification LED + + + + MicroProfile (unavailable) - + Clear Recent Files 清除檔案使用紀錄 - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA 檔案必須先安裝 - + Before using this CIA, you must install it. Do you want to install it now? CIA 檔案必須先安裝才能夠執行。您現在要安裝這個檔案嗎? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder 開啟 %1 資料夾時錯誤 - - + + Folder does not exist! 資料夾不存在! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel 取消 - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 開啟 %1 時錯誤 - + Select Directory 選擇目錄 - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 可執行檔案 (%1);;所有檔案 (*.*) - + Load File 讀取檔案 - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files 讀取多個檔案 - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) 所有檔案 (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. 已成功安裝 %1。 - + Unable to open File 無法開啟檔案 - + Could not open %1 無法開啟 %1 - + Installation aborted 安裝中斷 - + The installation of %1 was aborted. Please see the log for more details 安裝 %1 時中斷,請參閱日誌了解細節。 - + Invalid File 無效的檔案 - + %1 is not a valid CIA %1 不是有效的 CIA 檔案 - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found 找不到檔案 - + File "%1" not found 找不到「%1」 - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo 檔案 (%1);;所有檔案 (*.*) - + Load Amiibo 讀取 Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie 錄影 - + Movie recording cancelled. 錄影已取消。 - - + + Movie Saved 已儲存影片 - - + + The movie is successfully saved. 影片儲存成功。 - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4835,264 +4840,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% 速度:%1% - + Speed: %1% / %2% 速度:%1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms 影格:%1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found 找不到系統檔案 - + System Archive Missing - + Save/load Error - + Fatal Error 嚴重錯誤 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue 繼續 - + Quit Application - + OK 確定 - + Would you like to exit now? 您確定要離開嗎? - + The application is still running. Would you like to stop emulation? - + Playback Completed 播放完成 - + Movie playback completed. 影片已結束播放。 - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml index 1a242f551..ce2d4d9e4 100644 --- a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml +++ b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml @@ -566,6 +566,10 @@ S\'esperen errors gràfics temporals quan estigue activat. Preparant ombrejadors Construint%s + Eliminar cache d\'ombrejadors + Selecciona l\'API gràfica per a eliminar la cache d\'ombrejadors + Eliminant la caché d\'ombrejadors, per favor espere… + Caché d\'ombrejadors eliminada Jugar diff --git a/src/android/app/src/main/res/values-b+es+ES/strings.xml b/src/android/app/src/main/res/values-b+es+ES/strings.xml index 985a249fe..a12876632 100644 --- a/src/android/app/src/main/res/values-b+es+ES/strings.xml +++ b/src/android/app/src/main/res/values-b+es+ES/strings.xml @@ -566,6 +566,10 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Preparando shaders Construyendo%s + Eliminar caché de sombreadores + Selecciona la API gráfica para eliminar la caché de sombreadores + Eliminando la caché de sombreadores, por favor espere… + Caché de sombreadores eliminada Jugar diff --git a/src/android/app/src/main/res/values-b+pl+PL/strings.xml b/src/android/app/src/main/res/values-b+pl+PL/strings.xml index 6f19169a5..1d59d225d 100644 --- a/src/android/app/src/main/res/values-b+pl+PL/strings.xml +++ b/src/android/app/src/main/res/values-b+pl+PL/strings.xml @@ -565,7 +565,6 @@ Przygotowanie shaderów Tworzenie%s - Odtwórz Odinstaluj aktualizacje diff --git a/src/android/app/src/main/res/values-b+pt+BR/strings.xml b/src/android/app/src/main/res/values-b+pt+BR/strings.xml index f71991483..90c0875b2 100644 --- a/src/android/app/src/main/res/values-b+pt+BR/strings.xml +++ b/src/android/app/src/main/res/values-b+pt+BR/strings.xml @@ -565,7 +565,6 @@ Preparando Shaders Construindo %s - Jogar Desinstalar Aplicativo diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index a49ae0cff..578072879 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -66,6 +66,7 @@ Berechtigung erteilen Möchtest du keine Benachrichtigungsberechtigung gewähren? Azahar wird dich nicht über wichtige Informationen benachrichtigen. + Fehlende Berechtigungen Kamera Teile unten die Kameraberechtigung, um die 3DS-Kamera zu emulieren Mikrofon @@ -89,6 +90,7 @@ Der Nutzer Ordner muss gesetzt sein Dieser Schritt ist nötig, damit Azahar funktionieren kann. Bitte wähle ein Verzeichnis aus, damit du fortfahren kannst. Die Schreibrechte auf dein Nutzerdaten-Verzeichnis, wo deine Speicherstände und andere Informationen gespeichert sind, fehlen. Dies kann durch ein Anwendungsupdate, oder ein Androidupdate passiert sein. Bitte wähle das Verzeichnis erneut aus, damit die Berechtigungen wiederhergestellt werden können. + Ungültige Auswahl Design-Einstellung Konfigurieren sie ihre Designeinstellungen für Azahar. Design wählen @@ -100,6 +102,7 @@ Kürzlich hinzugefügt Installiert + Alle Bindungen zurücksetzen Schiebepad C-Stick Tastenkürzel @@ -214,6 +217,7 @@ Kompiliere Shader im Hintergrund, um das Stottern des Spiels zu reduzieren. Dadurch kann es zu temporären grafischen Fehlern während des Spielens kommen. Lineare Filterung Aktiviert lineare Filterung, welche die Spieltexturen glättet. + Integer-Skalierung Texturfilter Verbessert die Optik von Anwendungen durch Anwenden eines Filters auf Texturen. Die unterstützten Filter sind Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale und MMPX. Verzögert den Render-Thread des Spiels, wenn er Daten an die GPU sendet. Hilft bei Leistungsproblemen in den (sehr wenigen) Anwendungen mit dynamischen Frameraten. @@ -222,6 +226,7 @@ Setzt den von Spielen verwendeten Sampling-Filter außer Kraft. Dies kann in bestimmten Fällen nützlich sein, wenn sich die Spiele beim Hochskalieren schlecht verhalten. Wenn du dir unsicher bist, setze diese Einstellung auf „Spielgesteuert“ Genaue Multiplikation Benutzt genauere Multiplikation in Hardware-Shadern, welche einige Grafikbugs fixen kann. Wenn aktiviert, ist die Leistung reduziert. + Aktiviere Asynchrone GPU-Emulation Verwendet einen separaten Thread, um die GPU asynchron zu emulieren. Wenn aktiviert, wird die Leistung verbessert. Höchstgeschwindigkeit Wenn aktiviert, wird die Emulationsgeschwindigkeit auf einen angegebenen Prozentsatz der normalen Geschwindigkeit begrenzt. Wenn diese Option deaktiviert ist, wird die Emulationsgeschwindigkeit nicht begrenzt und der Hotkey für die Turbogeschwindigkeit funktioniert nicht. @@ -252,6 +257,7 @@ Gibt den Wert des 3D-Schiebereglers an. Dieser Wert sollte auf mehr als 0 % eingestellt werden, wenn Stereoskopisches 3D aktiviert ist.\nHinweis: Tiefenwerte über 100% werden nicht von echter Hardware unterstützt und könnten zu grafischen Fehlern führen. Rendering für das rechte Auge deaktivieren Verbessert die Leistung in einigen Anwendungen erheblich, kann in anderen jedoch zu Flackern führen. + Augen tauschen Karton-VR Karton-Bildschirmgröße Skaliert den Bildschirm auf einen Prozentsatz seiner Originalgröße. @@ -276,6 +282,7 @@ Lautstärke Audiodehnung Dehnt Audio, um Stottern zu reduzieren. Wenn aktiviert, wird die Audiolatenz erhöht und die Leistung leicht verschlechtert. + Echtzeitaudio aktivieren Skaliert die Tonabspielgeschwindigkeit, um Einbrüche in der Emulationsframerate zu minimieren. Das bedeutet, dass der Ton in voller Geschwindigkeit abspielt, selbst wenn die Framerate des Spiels niedrig ist. Kann zu Tonverschiebungen führen. Audioeingabegerät Tonausgabemodus @@ -289,7 +296,9 @@ V-Sync aktivieren Debug-Renderer Zusätzliche grafisch spezifische Debuginformationen werden protokolliert. Wenn dies aktiviert ist, ist die Leistung des Spiels minimal reduziert. + Log Output bei jeder Nachricht leeren Überträgt das Debugprotokoll sofort in eine Datei. Verwenden Sie dies, wenn Azahar abstürzt und die Protokollausgabe abgeschnitten wird. + Start mit LLE-Module verzögern Verzögert den Start der App, wenn die LLE-Module aktiviert sind. Deterministische asynchrone Operationen Asynchrone Operationen werden für Debug-Zwecke deterministisch. Die Aktivierung dieser Funktion kann zum Einfrieren führen. @@ -404,6 +413,10 @@ Original Standard Benutzerdefinierte Anordnung + Hintergrundfarbe + Rot + Grün + Blau Position des kleinen Bildschirms Wo soll der kleine Bildschirm im Verhältnis zum großen Bildschirm in der Großbild-Anordnung erscheinen? Oben Rechts @@ -520,11 +533,27 @@ Verknüpfung erstellen Verknüpfungsname darf nicht leer sein Bildgröße anpassen + ID: + Datei: + Spielkarte einsetzen + Spielkarte Entfernen + Leistungs-Overlay anzeigen Leistungs-Overlay Leistungsoverlay aktivieren Konfigurieren Sie, ob das Leistungs-Overlay angezeigt wird und welche Informationen angezeigt werden. + FPS anzeigen + Frametime anzeigen + Geschwindigkeit anzeigen + App-Speichernutzung anzeigen + Verfügbaren Speicher anzeigen + Batterietemperatur anzeigen + Overlay-Position + Oben Links + Oben Rechts + Unten Links + Unten Rechts Cheats Cheat hinzufügen @@ -815,4 +844,10 @@ Schnellspeichern - %1$tF %1$tR Kein Schnellspeicher vorhanden. + + Komprimiere + Wird komprimiert... + Dekomprimiere + Wird dekomprimiert... + Alle Dateien wurden erfolgreich komprimiert. diff --git a/src/android/app/src/main/res/values-es_419/strings.xml b/src/android/app/src/main/res/values-es_419/strings.xml new file mode 100644 index 000000000..0fec00c00 --- /dev/null +++ b/src/android/app/src/main/res/values-es_419/strings.xml @@ -0,0 +1,333 @@ + + + + Este software ejecutará aplicaciones para la consola portátil Nintendo 3DS. No se incluyen juegos.\n\nAntes de comenzar con la emulación, seleccione una carpeta para almacenar los datos de usuario de Azahar en.\n\nQué es ésto:\nWiki - Datos de usuario de Azahar Android y almacenamiento + Notificaciones del emulador 3DS Azahar + Azahar está ejecutándose + A continuación, deberás seleccionar una Carpeta de Aplicaciones. Azahar mostrará todas las ROM de 3DS de la carpeta seleccionada en la aplicación.\n\nLas ROM CIA, actualizaciones y los DLC deben instalarse por separado haciendo clic en el icono de la carpeta y seleccionando Instalar CIA. + + + Configuración + Opciones + Buscar + Aplicaciones + Configurar opciones del emulador + Instalar archivo CIA + Instalar aplicaciones, actualizaciones o DLC + Compartir Registro + Compartir el archivo de registro de Azahar para depurar problemas + Administrador de drivers de GPU + Instalar drivers de GPU + Instala drivers alternativos para intentar mejorar el rendimiento o la precisión + Driver ya instalado + Drivers personalizados no compatibles + La carga de drivers personalizados no es compatible en este dispositivo.\n¡Comprueba esta opción otra vez en el futuro para ver si ya está disponible! + No se encontró ningún archivo de registro + Selecciona el directorio de aplicaciones + Permite que Azahar llene la lista de aplicaciones + Acerca de + Un emulador de 3DS de código abierto + Versión de compilación, créditos y más + Directorio de aplicaciones seleccionado + Cambia los archivos que Azahar usa para cargar aplicaciones + Cambia la apariencia de la app + Instalar CIA + + + Seleccionar driver de GPU + ¿Quieres reemplazar tu driver actual de GPU? + Instalar + Por defecto + Instalado %s + Usando el driver por defecto de la GPU + ¡El driver seleccionado no es válido, se usará el driver por defecto del sistema! + Driver de la GPU del sistema + Instalando el driver... + + + Copiado al portapapeles + Colaboradores + Colaboradores que hicieron posible Azahar + Proyectos utilizados por Azahar para Android + Compilación + Licencias + + ¡Te damos la bienvenida! + Aprende a configurar <b>Azahar</b> y disfruta de la emulación. + Comenzar + ¡Completado! + Aplicaciones + Selecciona la carpeta de <b>Aplicaciones</b> con el botón de abajo. + Terminado + ¡Ya estás listo!\n¡Disfruta del emulador! + Continuar + Notificaciones + Concede el permiso de notificaciones con el botón de abajo. + Conceder permiso + ¿Omitir el permiso de notificaciones? + Azahar no podrá notificarte sobre información importante. + Faltan permisos + Azahar necesita permiso para administrar archivos en este dispositivo para poder almacenar y administrar los datos de usuario.\n\nPor favor, concede el permiso antes de continuar. + Cámara + Concede el permiso de cámara para emular la cámara de la 3DS. + Micrófono + Concede el permiso de micrófono para emular el micrófono de la 3DS. + Sistema de archivos + Concede el permiso de sistema de archivos para permitir que Azahar almacene archivos. + Permiso denegado + ¿Omitir la selección de la carpeta de aplicaciones? + No se mostrará nada en la lista de aplicaciones si no se selecciona una carpeta. + Permisos + Carpetas de datos + (Carpeta de usuario es necesaria)]]> + Concede permisos opcionales para usar funciones específicas del emulador + Ayuda + Omitir + Cancelar + Selecciona la carpeta de usuario + datos de usuario con el botón de abajo.]]> + Parece que tienes directorios de usuario configurados tanto para Lime3DS como para Azahar. Probablemente se deba a que actualizaste a Azahar y, cuando se te pidió, elegiste un directorio de usuario diferente al que usabas para Lime3DS.\n\nEsto puede haberte hecho pensar que perdiste partidas guardadas u otras configuraciones; te pedimos disculpas si eso ocurrió.\n\n¿Prefieres volver a usar tu directorio de usuario original de Lime3DS, restaurando la configuración y las partidas guardadas de Lime3DS, o conservar tu directorio de usuario actual de Azahar?\n\nNinguno de los directorios se eliminará, independientemente de tu elección, y puedes cambiar libremente entre ellos usando la opción \"Selecciona la carpeta de usuario\". + Mantener el directorio actual de Azahar + Usar el directorio de Lime3DS anterior + Seleccionar + No puedes omitir configurar la carpeta de usuario + Este paso es necesario para permitir que Azahar funcione. Por favor, selecciona un directorio y luego puedes continuar. + Has perdido los permisos de escritura en tu directorio de datos de usuario, donde se guardan las partidas guardadas y otra información. Esto puede ocurrir después de actualizar Android o algunas aplicaciones. Vuelve a seleccionar el directorio para recuperar los permisos y poder continuar. + Selección no válida + La selección del directorio de usuario no es válida.\nVuelve a seleccionar el directorio de usuario, asegurándote de navegar hasta él desde la raíz del almacenamiento del dispositivo. + Azahar ha perdido el permiso para administrar archivos en este dispositivo. Esto puede ocurrir después de actualizar Android o algunas aplicaciones. Vuelve a conceder este permiso en la siguiente pantalla para seguir usando la aplicación. + Configuración del tema + Configura tus preferencias de tema de Azahar. + Establecer tema + + + Buscar y filtrar aplicaciones + Buscar aplicaciones + Jugado recientemente + Añadido recientemente + Instalados + + + Asignar control automáticamente + Aplica la asignación de control estándar para todos los botones y ejes + ¡Presiona este botón en tu control! + Botones frontales de 3DS en rombo con el botón A resaltado + Eliminar todas las asignaciones + Esto eliminará todas los asignaciones del control actual. + Circle Pad + Palanca C + Teclas de atajo + Si la tecla \"Habilitar teclas de acceso rápido\" está asignada, se debe presionar esa tecla además de la tecla de acceso rápido asignada + Habilitar teclas de acceso rápido + Gatillos + Gatillo + Cruceta + Cruceta (eje) + Es posible que algunos controles no puedan asignar la Cruceta como un eje. Si ese es el caso, utilice la sección Cruceta (botones). + Cruceta (botón) + Solamente asigne la Cruceta a éstos si tiene problemas con las asignaciones de botones de la Cruceta (eje). + Eje vertical + Eje horizontal + Arriba + Abajo + Izquierda + Derecha + Asigna %1$s %2$s + Presiona un botón o mueve una palanca + Asignación de botones + Pulsa un botón o mueve una palanca para asignarlo a %1$s. + Presiona ARRIBA en tu joystick. + Presiona DERECHA en tu joystick. + HOME + Intercambiar pantallas + Turbo + ¡Este control debe asignarse a una palanca analógica o a un eje de la Cruceta! + ¡Este dispositivo debe asignarse a un botón del control! + Velocidad turbo + Velocidad turbo activada + Velocidad turbo desactivada + + + Archivos del sistema + Realizar operaciones de archivos del sistema, como instalar archivos del sistema o iniciar el Menú Home + Conectar con la herramienta de configuración Artic + herramienta de configuración Artic.
Notas:
  • Esta operación instalará archivos únicos de la consola en Azahar, ¡no compartas las carpetas de usuario ni nand después de realizar el proceso de configuración!
  • Tras la configuración, Azahar se vinculará a la consola que ha ejecutado la herramienta de configuración. Puedes desvincular la consola más tarde desde la pestaña \"Archivos de sistema\" del menú de opciones del emulador.
  • No te conectes en línea con Azahar y la consola 3DS al mismo tiempo después de configurar los archivos del sistema, ya que esto podría causar problemas.
  • Se necesita la configuración de Old 3DS para que la New 3DS funcione (se recomienda configurar ambos modos).
  • Ambos modos de configuración funcionarán independientemente del modelo de la consola donde se ejecute la herramienta.
]]>
+ Obteniendo el estado actual de los archivos del sistema, por favor espere... + Desvincular datos únicos de la consola +
  • OTP, SecureInfo y LocalFriendCodeSeed serán eliminados de Azahar.
  • Tu lista de amigos se restablecerá y se cerrará la sesión de tu cuenta NNID/PNID.
  • Los archivos del sistema y los títulos de la eShop obtenidos a través de Azahar obtenidos a través de Azahar se volverán inaccesibles hasta que la misma consola se vincule nuevamente usando la herramienta de configuración (los datos guardados no se perderán).

¿Continuar?]]>
+ Configuración de Old 3DS + Configuración de New 3DS + La configuración es posible. + La configuración Old 3DS es necesaria primero. + Configuración completa. + Ingresa la dirección de la herramienta de configuración Artic + Preparando configuración, por favor espere... + Cargar el Menú HOME + Mostrar las aplicaciones del menú HOME en la lista de aplicaciones + Ejecutar la configuración de la consola cuando se ejecute el Menú HOME + Menú HOME + + + Botones + Botón + + + Opciones de emulación + Nombre de usuario + Modo New 3DS + Usar Applets LLE (si están instaladas) + Aplicar parche de región libre a las aplicaciones instaladas + Parchea la región de las aplicaciones instaladas para que estén libres de región, de modo que siempre aparezcan en el menú home. + Habilitar los módulos LLE necesarios para las funciones en línea (si están instalados) + Habilita los módulos LLE necesarios para el modo multijugador en línea, acceso a la eShop, etc. + Reloj + Reloj + Configura el reloj emulado de la 3DS para que tenga la misma fecha y hora de tu dispositivo o para simular una distinta. + Reloj del sistema + Reloj simulado + Si el reloj está en \"Reloj simulado\", esto cambia la fecha y hora de inicio. + Opciones de perfil + Región + Idioma + Cumpleaños + Mes + Día + País + Monedas de juego + Pasos por hora del podómetro + Número de pasos por hora reportados por el podómetro. Rango de 0 a 65.535. + ID de la Consola + Regenerar ID de la consola + Esto reemplazará tu ID de consola de 3DS virtual por una nueva. Tu ID virtual actual será irrecuperable. Esto puede tener efectos inesperados en algunas aplicaciones. Si usas un archivo de configuración obsoleto esto podría fallar. ¿Quieres continuar? + Dirección MAC + Regenerar dirección MAC + Esto reemplazará tu dirección MAC actual por una nueva. No se recomienda hacerlo si obtuviste la dirección MAC de tu consola real con la herramienta de configuración. ¿Quieres continuar? + Cargador de complementos 3GX + Carga los complementos 3GX de la SD emulada si están disponibles. + Permite que las aplicaciones cambien el estado del cargador de complementos. + Permite que las apps de homebrew activen el cargador de complementos incluso cuando está desactivado. + Advertencia de región no válida + La configuración del país no es válida para la región emulada seleccionada. + La configuración del país no es válida para la consola vinculada actual. + Almacenamiento + Comprimir contenido CIA instalado + Comprime el contenido de archivos CIA cuando son instalados a la SD emulada. Solo afecta contenido CIA instalado con esta opción activada. + + + Cámara interior + Cámara izquierda externa + Cámara derecha externa + Fuente de la imagen de la cámara + Configura la fuente de imagen de la cámara virtual. Puedes usar un archivo de imagen o una cámara si es compatible. + Cámara + Si la \"Fuente de imagen\" está en \"Cámara del dispositivo\", se usará la cámara del propio dispositivo. + Frontal + Trasera + Externa + Rotación + + + Motor gráfico + API gráfica + Activar generación de shaders SPIR-V + Usa SPIR-V en vez de GLSL para emitir el shader de fragmentos usado para emular PICA. + Desactivar el optimizador de SPIR-V + Desactiva el paso de optimización SPIR-V reduciendo considerablemente los tirones y afectando muy poco el rendimiento. + Activar compilación asíncrona de shaders + Compila los shaders en segundo plano para reducir los tirones durante la partida. Habrá fallos gráficos temporales cuando esté activado. + Filtrado lineal + Activa el filtrado linear, que hace que los gráficos del juego se vean más suaves. + Escalado de enteros + Escala las pantallas usando un multiplicador entero basado en la resolución original de 3DS. En diseños con dos tamaños de pantalla diferentes, la más grande usará el escalado de enteros. + Filtrado de texturas + Mejora los gráficos visuales de las aplicaciones aplicando un filtro a las texturas. Los filtros compatibles son Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale y MMPX. + Atrasar hilo del motor gráfico del juego + Retrasa el hilo del motor gráfico del juego cuando envía datos a la GPU. Ayuda con los problemas de rendimiento en las (muy pocas) aplicaciones con tasas de fotogramas dinámicas. + Avanzado + Muestreo de texturas + Sobrescribe el filtro de muestreo original del juego. Puede ser útil en ciertos casos con juegos con problemas gráficos al aumentar la resolución. Si no estás seguro, déjalo en Controlado por juego. + Multiplicación precisa + Usa una multiplicación más precisa en los shaders por hardware, lo cual puede solucionar ciertos errores gráficos. Al activarse, el rendimiento disminuirá. + Activar emulación asíncrona de la GPU + Usa un hilo separado para emular la GPU de manera asíncrona. Al activarse, el rendimiento mejorará. + Límite de velocidad + Si se activa, la velocidad de emulación se limitará a un porcentaje determinado de velocidad normal. Si se desactiva, la velocidad no tendrá límite y el atajo para la velocidad velocidad turbo no funcionará. + Limitar porcentaje de velocidad + Especifica el valor al que se limita la velocidad de emulación. Con el valor por defecto del 100%, la emulación se limitará a la velocidad normal. Los valores altos o bajos aumentarán o reducirán el límite de velocidad. + Ocultar las imágenes de 3DS de la galería de Android + Evita que Android indexe las imágenes de la cámara, capturas de pantalla y texturas personalizadas de la 3DS y las muestre en la galería. Es posible que tengas que reiniciar el dispositivo después de cambiar esta configuración para que surta efecto. + Límite de velocidad turbo + Límite de velocidad de emulación que se aplica al activar el turbo. + Expandir al área de recorte + Amplía la pantalla para incluir el recorte de la cámara (o notch). + Resolución interna + Especifica la resolución de renderizado. Una alta resolución mejorará considerablemente la calidad visual, pero tendrá un gran impacto en el rendimiento y puede causar fallos en ciertas aplicaciones. + Auto (Tamaño pantalla) + Nativa (400x240) + 2x Nativa (800x480) + 3x Nativa (1200x720) + 4x Nativa (1600x960) + 5x Nativa (2000x1200) + 6x Nativa (2400x1440) + 7x Nativa (2800x1680) + 8x Nativa (3200x1920) + 9x Nativa (3600x2160) + 10x Nativa (4000x2400) + ¡Desactivar esta opción reducirá notablemente el rendimiento de la emulación! Para obtener la mejor experiencia, se recomienda dejarla activada. + Aviso: Modificar estos ajustes reducirá la velocidad de emulación. + Estereoscopia + Modo 3D estereoscópico + Elige el modo 3D estereoscópico para el renderizado 3D. Los modos de lado a lado son los más comunes en la actualidad. Los modos anaglifo y entrelazado se aplicarán siempre a todas las pantallas conectadas. + Profundidad + Especifica el valor del regulador 3D. Debería ajustarse por encima del 0% cuando el 3D estereoscópico esté activado.\nNota: Los valores de profundidad superiores al 100% no son posibles en el hardware real y pueden causar problemas gráficos. + Desactivar el renderizado de ojo derecho + Mejora mucho el rendimiento en algunas aplicaciones, pero puede causar parpadeo en otras. + Intercambiar ojos + Intercambia qué ojo se muestra en cada lado. Combinado con el modo lado a lado, ¡permite ver en 3D cruzando los ojos! + Renderizado 3D estereoscópico + Si se enciende el 3D estereoscópico, y en que pantallas. Las opciones para una sola pantalla solo son relevantes si hay varias pantallas conectadas. + Activado (todas las pantallas) + Encendido (Solo Pantalla Principal) + Encendido (Solo Pantalla Secundaria) + Cardboard VR + Tamaño de la pantalla para Cardboard + Escala la pantalla a un porcentaje de su tamaño original. + Desplazamiento horizontal + Especifica el porcentaje de espacio vacío para desplazar las pantallas horizontalmente. Los valores positivos acercan los dos ojos al medio, mientras que los negativos los alejan. + Desplazamiento vertical + Especifica el porcentaje de espacio vacío para desplazar las pantallas verticalmente. Los valores positivos mueven los dos ojos hacia abajo, mientras que los negativos los mueve hacia arriba. + Shader JIT + Caché de shader en disco + Reduce los tirones al guardar y cargar shaders generados en el disco. No se puede usar sin activar la opción shader por hardware. + Utilidades + Volcar texturas + Las texturas se vuelcan en dump/textures/[Title ID]/. + Texturas personalizadas + Las texturas se cargan desde load/textures/[Title ID]/. + Precargar texturas personalizadas + Carga todas las texturas personalizadas en la memoria. Esta función puede usar mucha memoria. + Carga asíncrona de texturas personalizadas + Carga las texturas personalizadas de manera asíncrona con hilos de fondo para reducir los tirones de carga. + + + Volumen + Estiramiento de audio + Estira el audio para reducir los tirones. Al activarse, la latencia del audio se incrementará y reducirá un poco el rendimiento. + Activar audio en tiempo real + Escala la velocidad de reproducción de audio para compensar por perdidas en la velocidad de fotogramas durante la emulación. Esto significa que el audio se reproducirá a velocidad completa incluso cuando la velocidad de fotogramas del juego sea baja. Puede causar problemas de desincronización de audio. + Dispositivo de entrada de audio + Modo de salida del audio + + + CPU JIT + Usa el compilador Just-in-Time (JIT) para emular la CPU. Cuando este encendido, el rendimiento de los juegos mejorará significativamente. + Activar shader por hardware + Usa el hardware para emular los shaders de la 3DS. Al activarse, el rendimiento mejorará notablemente. + Velocidad de reloj de la CPU + Activar V-Sync + Sincroniza la velocidad de fotogramas con la tasa de actualización de tu dispositivo. Puede causar latencia de entrada adicional, pero puede reducir el rasgado de imagen en algunos casos. + Renderizador de depuración + Alternar tipo de consola. + Alternar Controles + El diseño usado por una pantalla secundaria conectada, alámbrica o inalámbrica (Chromecast, Miracast) +
diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 93d855876..875e6b658 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -565,6 +565,10 @@ Préparation des shaders Construction %s + Supprimer le cache de shaders + Sélectionnez l\'API graphique pour laquelle vous voulez supprimer le cache de shaders + Suppression du cache de shaders pour cette application, veuillez patienter ... + Le cache de shaders a été supprimé. Jouer diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 46ee04737..2af71cb42 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -565,6 +565,10 @@ Preparazione degli shader Compilazione %s + Cancella cache shader + Seleziona per quale API grafica eliminare la cache shader + Eliminazione della cache shader per il titolo, attendi... + Cache shader cancellate Riproduci diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index f94484f18..085690c5b 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -75,7 +75,7 @@ Konfigurer Kontroller Endre Utseende Ferdig - Veksle Kontroller + Bytt Kontrollene Juster Skala Åpne Innstillinger Landskap Skjermoppsett diff --git a/src/android/app/src/main/res/values-sv/strings.xml b/src/android/app/src/main/res/values-sv/strings.xml index 037bb610c..52c276371 100644 --- a/src/android/app/src/main/res/values-sv/strings.xml +++ b/src/android/app/src/main/res/values-sv/strings.xml @@ -565,7 +565,6 @@ Förbereder shaders Bygger %s - Spela Avinstallera applikation From afbaf8e485d004e855f14c7063cadb3233f4e308 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 14 Apr 2026 21:17:40 +0100 Subject: [PATCH 61/98] android: Fixed incorrect location for Latin American Spanish locale files --- dist/languages/.tx/config | 2 +- .../src/main/res/{values-es_419 => values-b+es+419}/strings.xml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/android/app/src/main/res/{values-es_419 => values-b+es+419}/strings.xml (100%) diff --git a/dist/languages/.tx/config b/dist/languages/.tx/config index eca403ca4..b63c2c90b 100644 --- a/dist/languages/.tx/config +++ b/dist/languages/.tx/config @@ -12,4 +12,4 @@ lang_map = ca@valencia:ca_ES_valencia file_filter = ../../src/android/app/src/main/res/values-/strings.xml source_file = ../../src/android/app/src/main/res/values/strings.xml type = ANDROID -lang_map = es_ES:b+es+ES, hu_HU:b+hu+HU, ru_RU:b+ru+RU, pt_BR:b+pt+BR, zh_CN:b+zh+CN, pl_PL:b+pl+PL, ca@valencia:b+ca+ES+valencia, ko_KR:b+ko+KR, da_DK:b+da+DK, ja_JP:b+ja+JP, lt_LT:b+lt+LT, ro_RO:b+ro+RO, tr_TR:b+tr+TR, vi_VN:b+vi+VN, zh_TW:b+zh+TW +lang_map = es_ES:b+es+ES, hu_HU:b+hu+HU, ru_RU:b+ru+RU, pt_BR:b+pt+BR, zh_CN:b+zh+CN, pl_PL:b+pl+PL, ca@valencia:b+ca+ES+valencia, ko_KR:b+ko+KR, da_DK:b+da+DK, ja_JP:b+ja+JP, lt_LT:b+lt+LT, ro_RO:b+ro+RO, tr_TR:b+tr+TR, vi_VN:b+vi+VN, zh_TW:b+zh+TW, es_419:b+es+419 diff --git a/src/android/app/src/main/res/values-es_419/strings.xml b/src/android/app/src/main/res/values-b+es+419/strings.xml similarity index 100% rename from src/android/app/src/main/res/values-es_419/strings.xml rename to src/android/app/src/main/res/values-b+es+419/strings.xml From d4b5633cf0212ad8d347e012e10b4d5ef0bcd3f1 Mon Sep 17 00:00:00 2001 From: Cobalt <60624944+cobalt2727@users.noreply.github.com> Date: Thu, 16 Apr 2026 02:53:08 -0500 Subject: [PATCH 62/98] qt Fix compilation issues in status LED code (#2045) solves a build issue a ***lot*** of [L4T Megascript](https://github.com/cobalt2727/L4T-Megascript) users were reporting to me on Linux. C++ is definitely not my strong suit, but per https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/pow-powf-powl?view=msvc-170#remarks `pow` has identical behavior in C++ projects. no clue why `powf` worked fine on your environment when developing this but not other people's. ```cmake [ 98%] Building CXX object src/citra_qt/CMakeFiles/citra_qt.dir/qt_image_interface.cpp.o /home/runner/azahar/src/citra_qt/notification_led.cpp:56:15: error: no member named 'powf' in namespace 'std'; did you mean simply 'powf'? 56 | float t = std::powf(pwm, 1.f / gamma); | ^~~~~~~~~ | powf /usr/include/aarch64-linux-gnu/bits/mathcalls.h:140:1: note: 'powf' declared here 140 | __MATHCALL_VEC (pow,, (_Mdouble_ __x, _Mdouble_ __y)); | ^ /usr/include/math.h:280:3: note: expanded from macro '__MATHCALL_VEC' 280 | __MATHCALL (function, suffix, args) | ^ /usr/include/math.h:287:3: note: expanded from macro '__MATHCALL' 287 | __MATHDECL (_Mdouble_,function,suffix, args) | ^ /usr/include/math.h:289:3: note: expanded from macro '__MATHDECL' 289 | __MATHDECL_1(type, function,suffix, args); \ | ^ note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all) /usr/include/math.h:297:15: note: expanded from macro '__MATHDECL_1_IMPL' 297 | extern type __MATH_PRECNAME(function,suffix) args __THROW | ^ /usr/include/math.h:326:34: note: expanded from macro '__MATH_PRECNAME' 326 | # define __MATH_PRECNAME(name,r) name##f##r | ^ :97:1: note: expanded from here 97 | powf | ^ 1 error generated. make[2]: *** [src/citra_qt/CMakeFiles/citra_qt.dir/build.make:1573: src/citra_qt/CMakeFiles/citra_qt.dir/notification_led.cpp.o] Error 1 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [CMakeFiles/Makefile2:3481: src/citra_qt/CMakeFiles/citra_qt.dir/all] Error 2 make: *** [Makefile:166: all] Error 2 ``` --- src/citra_qt/notification_led.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/citra_qt/notification_led.cpp b/src/citra_qt/notification_led.cpp index e7d9e0d33..3966b8bda 100644 --- a/src/citra_qt/notification_led.cpp +++ b/src/citra_qt/notification_led.cpp @@ -53,7 +53,7 @@ QColor LedWidget::blendLedColor(int r, int g, int b) const { // are not linear. constexpr float gamma = 2.4f; float pwm = max_c / 255.0; - float t = std::powf(pwm, 1.f / gamma); + float t = std::pow(pwm, 1.f / gamma); return lerpColor(off_color, lit_color, t * 0.8f); } From 0fe6a8c7dfd1b120fffda1647c0098bba3d55d0b Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Fri, 17 Apr 2026 21:45:50 +0200 Subject: [PATCH 63/98] video_core: Properly handle non RGBA8 shadow textures (#2047) --- .../rasterizer_cache/rasterizer_cache.h | 32 ++++++++++++------- .../rasterizer_cache/rasterizer_cache_base.h | 10 +++--- .../rasterizer_cache/surface_base.cpp | 5 +-- .../rasterizer_cache/surface_base.h | 8 ++--- .../renderer_opengl/gl_rasterizer.cpp | 4 +-- .../renderer_opengl/gl_texture_runtime.cpp | 17 ++++++---- .../renderer_opengl/gl_texture_runtime.h | 7 ++-- .../renderer_vulkan/vk_rasterizer.cpp | 4 +-- .../renderer_vulkan/vk_texture_runtime.cpp | 23 +++++++++---- .../renderer_vulkan/vk_texture_runtime.h | 5 +-- src/video_core/texture/texture_decode.cpp | 4 ++- src/video_core/texture/texture_decode.h | 3 +- 12 files changed, 76 insertions(+), 46 deletions(-) diff --git a/src/video_core/rasterizer_cache/rasterizer_cache.h b/src/video_core/rasterizer_cache/rasterizer_cache.h index 09d936020..26156cb56 100644 --- a/src/video_core/rasterizer_cache/rasterizer_cache.h +++ b/src/video_core/rasterizer_cache/rasterizer_cache.h @@ -460,7 +460,8 @@ void RasterizerCache::CopySurface(Surface& src_surface, Surface& dst_surface, template SurfaceId RasterizerCache::GetSurface(const SurfaceParams& params, ScaleMatch match_res_scale, - bool load_if_create) { + bool load_if_create, + const SurfaceFlagBits& create_initial_flags) { if (params.addr == 0 || params.height * params.width == 0) { return {}; } @@ -472,7 +473,7 @@ SurfaceId RasterizerCache::GetSurface(const SurfaceParams& params, ScaleMatch SurfaceId surface_id = FindMatch(params, match_res_scale); if (!surface_id) { - surface_id = CreateSurface(params); + surface_id = CreateSurface(params, create_initial_flags); RegisterSurface(surface_id); } @@ -485,7 +486,8 @@ SurfaceId RasterizerCache::GetSurface(const SurfaceParams& params, ScaleMatch template typename RasterizerCache::SurfaceRect_Tuple RasterizerCache::GetSurfaceSubRect( - const SurfaceParams& params, ScaleMatch match_res_scale, bool load_if_create) { + const SurfaceParams& params, ScaleMatch match_res_scale, bool load_if_create, + const SurfaceFlagBits& create_initial_flags) { if (params.addr == 0 || params.height * params.width == 0) { return std::make_pair(SurfaceId{}, Common::Rectangle{}); } @@ -501,7 +503,7 @@ typename RasterizerCache::SurfaceRect_Tuple RasterizerCache::GetSurfaceSub SurfaceParams new_params = slot_surfaces[surface_id]; new_params.res_scale = params.res_scale; - surface_id = CreateSurface(new_params); + surface_id = CreateSurface(new_params, create_initial_flags); RegisterSurface(surface_id); } } @@ -521,7 +523,7 @@ typename RasterizerCache::SurfaceRect_Tuple RasterizerCache::GetSurfaceSub new_params.width = aligned_params.stride; new_params.UpdateParams(); // GetSurface will create the new surface and possibly adjust res_scale if necessary - surface_id = GetSurface(new_params, match_res_scale, load_if_create); + surface_id = GetSurface(new_params, match_res_scale, load_if_create, create_initial_flags); } else if (load_if_create) { ValidateSurface(surface_id, aligned_params.addr, aligned_params.size); } @@ -560,6 +562,10 @@ SurfaceId RasterizerCache::GetTextureSurface(const Pica::Texture::TextureInfo params.is_tiled = true; params.pixel_format = PixelFormatFromTextureFormat(info.format); params.res_scale = filter != Settings::TextureFilter::NoFilter ? resolution_scale_factor : 1; + SurfaceFlagBits initial_flags{}; + if (info.is_shadow_source) { + initial_flags |= SurfaceFlagBits::ShadowSource; + } params.UpdateParams(); const u32 min_width = info.width >> max_level; @@ -570,11 +576,12 @@ SurfaceId RasterizerCache::GetTextureSurface(const Pica::Texture::TextureInfo min_height); return NULL_SURFACE_ID; } - const auto [src_surface_id, rect] = GetSurfaceSubRect(params, ScaleMatch::Ignore, true); + const auto [src_surface_id, rect] = + GetSurfaceSubRect(params, ScaleMatch::Ignore, true, initial_flags); Surface& src_surface = slot_surfaces[src_surface_id]; params.res_scale = src_surface.res_scale; - SurfaceId tmp_surface_id = CreateSurface(params); + SurfaceId tmp_surface_id = CreateSurface(params, initial_flags); Surface& tmp_surface = slot_surfaces[tmp_surface_id]; sentenced.emplace_back(tmp_surface_id, frame_tick); @@ -593,7 +600,7 @@ SurfaceId RasterizerCache::GetTextureSurface(const Pica::Texture::TextureInfo return NULL_SURFACE_ID; } - SurfaceId surface_id = GetSurface(params, ScaleMatch::Ignore, true); + SurfaceId surface_id = GetSurface(params, ScaleMatch::Ignore, true, initial_flags); return surface_id ? surface_id : NULL_SURFACE_ID; } @@ -1026,7 +1033,7 @@ void RasterizerCache::UploadSurface(Surface& surface, SurfaceInterval interva const auto upload_data = source_ptr.GetWriteBytes(load_info.end - load_info.addr); DecodeTexture(load_info, load_info.addr, load_info.end, upload_data, staging.mapped, - runtime.NeedsConversion(surface.pixel_format)); + runtime.NeedsConversion(surface)); const bool should_dump = False(surface.flags & SurfaceFlagBits::Custom) && False(surface.flags & SurfaceFlagBits::RenderTarget); @@ -1135,7 +1142,7 @@ void RasterizerCache::DownloadSurface(Surface& surface, SurfaceInterval inter const auto download_dest = dest_ptr.GetWriteBytes(flush_end - flush_start); EncodeTexture(flush_info, flush_start, flush_end, staging.mapped, download_dest, - runtime.NeedsConversion(surface.pixel_format)); + runtime.NeedsConversion(surface)); } template @@ -1336,13 +1343,14 @@ void RasterizerCache::InvalidateRegion(PAddr addr, u32 size, SurfaceId region } template -SurfaceId RasterizerCache::CreateSurface(const SurfaceParams& params) { +SurfaceId RasterizerCache::CreateSurface(const SurfaceParams& params, + const SurfaceFlagBits& initial_flags) { const SurfaceId surface_id = [&] { const auto it = std::find_if(sentenced.begin(), sentenced.end(), [&](const auto& pair) { return slot_surfaces[pair.first] == params; }); if (it == sentenced.end()) { - return slot_surfaces.insert(runtime, params); + return slot_surfaces.insert(runtime, params, initial_flags); } const SurfaceId surface_id = it->first; sentenced.erase(it); diff --git a/src/video_core/rasterizer_cache/rasterizer_cache_base.h b/src/video_core/rasterizer_cache/rasterizer_cache_base.h index afd3625be..406c374dc 100644 --- a/src/video_core/rasterizer_cache/rasterizer_cache_base.h +++ b/src/video_core/rasterizer_cache/rasterizer_cache_base.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -56,6 +56,7 @@ DECLARE_ENUM_FLAG_OPERATORS(MatchFlags); class CustomTexManager; class RendererBase; +enum class SurfaceFlagBits : u32; template class RasterizerCache { @@ -104,12 +105,13 @@ public: /// Load a texture from 3DS memory to OpenGL and cache it (if not already cached) SurfaceId GetSurface(const SurfaceParams& params, ScaleMatch match_res_scale, - bool load_if_create); + bool load_if_create, const SurfaceFlagBits& create_initial_flags = {}); /// Attempt to find a subrect (resolution scaled) of a surface, otherwise loads a texture from /// 3DS memory to OpenGL and caches it (if not already cached) SurfaceRect_Tuple GetSurfaceSubRect(const SurfaceParams& params, ScaleMatch match_res_scale, - bool load_if_create); + bool load_if_create, + const SurfaceFlagBits& create_initial_flags = {}); /// Get a surface based on the texture configuration Surface& GetTextureSurface(const Pica::TexturingRegs::FullTextureConfig& config); @@ -194,7 +196,7 @@ private: const SurfaceInterval& interval); /// Create a new surface - SurfaceId CreateSurface(const SurfaceParams& params); + SurfaceId CreateSurface(const SurfaceParams& params, const SurfaceFlagBits& initial_flags = {}); /// Register surface into the cache void RegisterSurface(SurfaceId surface); diff --git a/src/video_core/rasterizer_cache/surface_base.cpp b/src/video_core/rasterizer_cache/surface_base.cpp index 8d310dfe4..c9c645db6 100644 --- a/src/video_core/rasterizer_cache/surface_base.cpp +++ b/src/video_core/rasterizer_cache/surface_base.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -9,7 +9,8 @@ namespace VideoCore { -SurfaceBase::SurfaceBase(const SurfaceParams& params) : SurfaceParams{params} {} +SurfaceBase::SurfaceBase(const SurfaceParams& params, const SurfaceFlagBits& initial_flag_bits) + : SurfaceParams{params}, flags(initial_flag_bits) {} SurfaceBase::~SurfaceBase() = default; diff --git a/src/video_core/rasterizer_cache/surface_base.h b/src/video_core/rasterizer_cache/surface_base.h index b2ca33e61..6ac0147e0 100644 --- a/src/video_core/rasterizer_cache/surface_base.h +++ b/src/video_core/rasterizer_cache/surface_base.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -19,14 +19,14 @@ enum class SurfaceFlagBits : u32 { Picked = 1 << 1, ///< Surface has been picked when searching for a match. Tracked = 1 << 2, ///< Surface is part of a texture cube and should be tracked. Custom = 1 << 3, ///< Surface texture has been replaced with a custom texture. - ShadowMap = 1 << 4, ///< Surface is used during shadow rendering. + ShadowSource = 1 << 4, ///< Surface is used as a shadow source. RenderTarget = 1 << 5, ///< Surface was a render target. }; DECLARE_ENUM_FLAG_OPERATORS(SurfaceFlagBits); class SurfaceBase : public SurfaceParams { public: - SurfaceBase(const SurfaceParams& params); + SurfaceBase(const SurfaceParams& params, const SurfaceFlagBits& initial_flag_bits); ~SurfaceBase(); /// Returns true when this surface can be used to fill the fill_interval of dest_surface @@ -88,7 +88,7 @@ public: const Material* material = nullptr; SurfaceRegions invalid_regions; u32 fill_size = 0; - std::array fill_data; + std::array fill_data{}; u64 modification_tick = 1; }; diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 2c721bcf7..2f15dec9c 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -676,7 +676,7 @@ void RasterizerOpenGL::SyncTextureUnits(const Framebuffer* framebuffer) { switch (texture.config.type.Value()) { case TextureType::Shadow2D: { Surface& surface = res_cache.GetTextureSurface(texture); - surface.flags |= VideoCore::SurfaceFlagBits::ShadowMap; + surface.flags |= VideoCore::SurfaceFlagBits::ShadowSource; state.image_shadow_texture_px = surface.Handle(); continue; } @@ -724,7 +724,7 @@ void RasterizerOpenGL::BindShadowCube(const Pica::TexturingRegs::FullTextureConf VideoCore::SurfaceId surface_id = res_cache.GetTextureSurface(info); Surface& surface = res_cache.GetSurface(surface_id); - surface.flags |= VideoCore::SurfaceFlagBits::ShadowMap; + surface.flags |= VideoCore::SurfaceFlagBits::ShadowSource; state.image_shadow_texture[binding] = surface.Handle(); } } diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.cpp b/src/video_core/renderer_opengl/gl_texture_runtime.cpp index f93b033ed..fc14e949f 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.cpp +++ b/src/video_core/renderer_opengl/gl_texture_runtime.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -127,7 +127,8 @@ u32 TextureRuntime::RemoveThreshold() { return SWAP_CHAIN_SIZE; } -bool TextureRuntime::NeedsConversion(VideoCore::PixelFormat pixel_format) const { +bool TextureRuntime::NeedsConversion(const Surface& surface) const { + const auto& pixel_format = surface.pixel_format; const bool should_convert = pixel_format == PixelFormat::RGBA8 || // Needs byteswap pixel_format == PixelFormat::RGB8; // Is converted to RGBA8 return driver.IsOpenGLES() && should_convert; @@ -290,7 +291,7 @@ bool TextureRuntime::BlitTextures(Surface& source, Surface& dest, // Note: shadow map is treated as RGBA8 format in PICA, as well as in the rasterizer cache, but // doing linear intepolation componentwise would cause incorrect value. const GLbitfield buffer_mask = MakeBufferMask(source.type); - const bool is_shadow_map = True(source.flags & SurfaceFlagBits::ShadowMap); + const bool is_shadow_map = True(source.flags & SurfaceFlagBits::ShadowSource); const GLenum filter = buffer_mask == GL_COLOR_BUFFER_BIT && !is_shadow_map ? GL_LINEAR : GL_NEAREST; glBlitFramebuffer(blit.src_rect.left, blit.src_rect.bottom, blit.src_rect.right, @@ -316,8 +317,9 @@ void TextureRuntime::GenerateMipmaps(Surface& surface) { } } -Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& params) - : SurfaceBase{params}, driver{&runtime_.GetDriver()}, runtime{&runtime_}, +Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& params, + const VideoCore::SurfaceFlagBits& initial_flag_bits) + : SurfaceBase{params, initial_flag_bits}, driver{&runtime_.GetDriver()}, runtime{&runtime_}, tuple{runtime->GetFormatTuple(pixel_format)} { if (pixel_format == PixelFormat::Invalid) { return; @@ -334,9 +336,10 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& param } } -Surface::Surface(TextureRuntime& runtime, const VideoCore::SurfaceBase& surface, +Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceBase& surface, const VideoCore::Material* mat) - : SurfaceBase{surface}, tuple{runtime.GetFormatTuple(mat->format)} { + : SurfaceBase{surface, {}}, driver{&runtime_.GetDriver()}, runtime{&runtime_}, + tuple{runtime_.GetFormatTuple(mat->format)} { if (mat && !driver->IsCustomFormatSupported(mat->format)) { return; } diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.h b/src/video_core/renderer_opengl/gl_texture_runtime.h index 5fe7300a7..d25ba102c 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.h +++ b/src/video_core/renderer_opengl/gl_texture_runtime.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -49,7 +49,7 @@ public: void Finish() {} /// Returns true if the provided pixel format cannot be used natively by the runtime. - bool NeedsConversion(VideoCore::PixelFormat pixel_format) const; + bool NeedsConversion(const Surface& surface) const; /// Maps an internal staging buffer of the provided size of pixel uploads/downloads VideoCore::StagingData FindStaging(u32 size, bool upload); @@ -97,7 +97,8 @@ private: class Surface : public VideoCore::SurfaceBase { public: - explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceParams& params); + explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceParams& params, + const VideoCore::SurfaceFlagBits& initial_flag_bits = {}); explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceBase& surface, const VideoCore::Material* material); ~Surface(); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f772fa5f5..0f997d5e9 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -648,7 +648,7 @@ void RasterizerVulkan::SyncTextureUnits(const Framebuffer* framebuffer) { case TextureType::Shadow2D: { Surface& surface = res_cache.GetTextureSurface(texture); Sampler& sampler = res_cache.GetSampler(texture.config); - surface.flags |= VideoCore::SurfaceFlagBits::ShadowMap; + surface.flags |= VideoCore::SurfaceFlagBits::ShadowSource; update_queue.AddImageSampler(texture_set, texture_index, 0, surface.StorageView(), sampler.Handle()); continue; @@ -704,7 +704,7 @@ void RasterizerVulkan::BindShadowCube(const Pica::TexturingRegs::FullTextureConf const VideoCore::SurfaceId surface_id = res_cache.GetTextureSurface(info); Surface& surface = res_cache.GetSurface(surface_id); - surface.flags |= VideoCore::SurfaceFlagBits::ShadowMap; + surface.flags |= VideoCore::SurfaceFlagBits::ShadowSource; update_queue.AddImageSampler(texture_set, 0, binding, surface.StorageView(), sampler.Handle()); } diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index 52b7c6392..c62757384 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -720,15 +720,16 @@ void TextureRuntime::GenerateMipmaps(Surface& surface) { } } -bool TextureRuntime::NeedsConversion(VideoCore::PixelFormat format) const { - const FormatTraits traits = instance.GetTraits(format); +bool TextureRuntime::NeedsConversion(const Surface& surface) const { + const FormatTraits& traits = surface.traits; return traits.needs_conversion && // DepthStencil formats are handled elsewhere due to de-interleaving. traits.aspect != (vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil); } -Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& params) - : SurfaceBase{params}, runtime{runtime_}, instance{runtime_.GetInstance()}, +Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& params, + const VideoCore::SurfaceFlagBits& initial_flag_bits) + : SurfaceBase{params, initial_flag_bits}, runtime{runtime_}, instance{runtime_.GetInstance()}, scheduler{runtime_.GetScheduler()}, traits{instance.GetTraits(pixel_format)}, handles{Handle(instance), Handle(instance), Handle(instance), Handle(instance)} { @@ -736,7 +737,17 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& param return; } - const bool is_mutable = pixel_format == VideoCore::PixelFormat::RGBA8; + bool is_mutable = traits.native == vk::Format::eR8G8B8A8Unorm; + + if (True(flags & VideoCore::SurfaceFlagBits::ShadowSource) && + traits.native != vk::Format::eR8G8B8A8Unorm) { + // If the surface is a shadow source, it needs conversion + // to be forced as it always has to be RGBA8 + traits = instance.GetTraits(VideoCore::PixelFormat::RGBA8); + traits.needs_conversion = true; + is_mutable = true; + } + const vk::Format format = traits.native; ASSERT_MSG(format != vk::Format::eUndefined && levels >= 1, @@ -1278,7 +1289,7 @@ vk::ImageView Surface::ImageView(ViewType view_type, Type type) noexcept { auto aspect = traits.aspect; if (view_type == ViewType::Storage) { - ASSERT(pixel_format == PixelFormat::RGBA8); + ASSERT(traits.native == vk::Format::eR8G8B8A8Unorm); is_storage = true; } if (view_type == ViewType::Depth || view_type == ViewType::Stencil) { diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.h b/src/video_core/renderer_vulkan/vk_texture_runtime.h index 17ac89c91..b46479c58 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.h +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.h @@ -155,7 +155,7 @@ public: void GenerateMipmaps(Surface& surface); /// Returns true if the provided pixel format needs convertion - bool NeedsConversion(VideoCore::PixelFormat format) const; + bool NeedsConversion(const Surface& surface) const; private: /// Clears a partial texture rect using a clear rectangle @@ -175,7 +175,8 @@ class Surface : public VideoCore::SurfaceBase { friend class TextureRuntime; public: - explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceParams& params); + explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceParams& params, + const VideoCore::SurfaceFlagBits& initial_flag_bits = {}); explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceBase& surface, const VideoCore::Material* materal); diff --git a/src/video_core/texture/texture_decode.cpp b/src/video_core/texture/texture_decode.cpp index 8c5bea703..3b693e781 100644 --- a/src/video_core/texture/texture_decode.cpp +++ b/src/video_core/texture/texture_decode.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -219,6 +219,8 @@ TextureInfo TextureInfo::FromPicaRegister(const TexturingRegs::TextureConfig& co info.height = config.height; info.format = format; info.SetDefaultStride(); + info.is_shadow_source = config.type == TexturingRegs::TextureConfig::TextureType::Shadow2D || + config.type == TexturingRegs::TextureConfig::TextureType::ShadowCube; return info; } diff --git a/src/video_core/texture/texture_decode.h b/src/video_core/texture/texture_decode.h index 67ee03e5d..bbab95aca 100644 --- a/src/video_core/texture/texture_decode.h +++ b/src/video_core/texture/texture_decode.h @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -19,6 +19,7 @@ struct TextureInfo { u32 height; ptrdiff_t stride; TexturingRegs::TextureFormat format; + bool is_shadow_source; static TextureInfo FromPicaRegister(const TexturingRegs::TextureConfig& config, const TexturingRegs::TextureFormat& format); From 5bc58c78ed7907c640205e0d48524f11eeb77a2d Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sun, 19 Apr 2026 13:03:40 +0100 Subject: [PATCH 64/98] OpenBSD build fixes - Specify OpenBSD's X11 include directory - Add OpenBSD-specific linker flag to allow W|X --- CMakeLists.txt | 4 ++++ externals/CMakeLists.txt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28a9b115c..3d58cc70d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,10 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS") enable_language(OBJC OBJCXX) endif() +if (BSD STREQUAL "OpenBSD") + add_link_options(-z wxneeded) +endif() + option(ENABLE_LIBRETRO "Build as a LibRetro core" OFF) # Some submodules like to pick their own default build type if not specified. diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 50706a057..c799fe60d 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -508,6 +508,10 @@ if (ENABLE_VULKAN) # prefix location. -OS target_include_directories(vulkan-headers INTERFACE /usr/pkg/share/x11-links/include) + elseif (BSD STREQUAL "OpenBSD") + # This is fine to hardcode because it'll never change + target_include_directories(vulkan-headers INTERFACE + /usr/X11R6/include) endif() endif() From 2fff086e816b2e46561ca8ab396f7d81ded75ef6 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 19 Apr 2026 14:47:49 +0200 Subject: [PATCH 65/98] qt: Temporarily fix fullscreen on msys2 builds (#2049) * qt: Temporarily fix fullscreen on msys2 builds * Removed excessive endif comments We really only need these when nesting ifdefs * blockRoundedCorners: Invert if condition for readability --------- Co-authored-by: OpenSauce04 --- src/citra_qt/CMakeLists.txt | 4 ++ src/citra_qt/citra_qt.cpp | 73 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index 8be0aff56..839156723 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -277,6 +277,10 @@ target_link_libraries(citra_qt PRIVATE audio_core citra_common citra_core input_ target_link_libraries(citra_qt PRIVATE Boost::boost nihstro-headers Qt6::Widgets Qt6::Multimedia Qt6::Concurrent) target_link_libraries(citra_qt PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) +if (MINGW) + target_link_libraries(citra_qt PRIVATE dwmapi) +endif() + if (ENABLE_OPENGL) target_link_libraries(citra_qt PRIVATE glad) endif() diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index bf8d18bf9..62fb24b9b 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -142,6 +142,61 @@ constexpr int default_mouse_timeout = 2500; const int GMainWindow::max_recent_files_item; +// There is a bug in the QT implementation on MSYS2 builds +// that cause corners to appear when the app is switched to +// fullscreen. The following code aims to fix that issue +// until it is addressed upstream. It works by manually +// disabling corners through the DWM API. +// TODO(PabloMK7): Remove once the upstream bug is solved. +#if defined(_WIN32) && !defined(_MSC_VER) +#define NEEDS_ROUND_CORNERS_FIX +#endif + +#ifdef NEEDS_ROUND_CORNERS_FIX +#include +class WindowCornerManager { +public: + static WindowCornerManager& instance() { + static WindowCornerManager inst; + return inst; + } + + void blockRoundedCorners(QWidget* widget, bool block) { + HWND hwnd = reinterpret_cast(widget->winId()); + DWORD pref; + + if (block) { + pref = DWMWCP_DEFAULT; + if (SUCCEEDED(DwmGetWindowAttribute(hwnd, DWMWA_WINDOW_CORNER_PREFERENCE, &pref, + sizeof(pref)))) { + original_prefs[hwnd] = pref; + } else { + original_prefs[hwnd] = DWMWCP_DEFAULT; + } + + pref = DWMWCP_DONOTROUND; + DwmSetWindowAttribute(hwnd, DWMWA_WINDOW_CORNER_PREFERENCE, &pref, sizeof(pref)); + } else { + auto it = original_prefs.find(hwnd); + if (it == original_prefs.end()) + return; + + pref = it->second; + + DwmSetWindowAttribute(hwnd, DWMWA_WINDOW_CORNER_PREFERENCE, &pref, sizeof(pref)); + + original_prefs.erase(it); + } + } + +private: + WindowCornerManager() = default; + ~WindowCornerManager() = default; + + std::unordered_map original_prefs; +}; +#endif + static QString PrettyProductName() { #ifdef _WIN32 // After Windows 10 Version 2004, Microsoft decided to switch to a different notation: 20H2 @@ -2605,8 +2660,14 @@ void GMainWindow::ToggleSecondaryFullscreen() { return; } if (secondary_window->isFullScreen()) { +#ifdef NEEDS_ROUND_CORNERS_FIX + WindowCornerManager::instance().blockRoundedCorners(secondary_window, false); +#endif secondary_window->showNormal(); } else { +#ifdef NEEDS_ROUND_CORNERS_FIX + WindowCornerManager::instance().blockRoundedCorners(secondary_window, true); +#endif secondary_window->showFullScreen(); } } @@ -2616,9 +2677,15 @@ void GMainWindow::ShowFullscreen() { UISettings::values.geometry = saveGeometry(); ui->menubar->hide(); statusBar()->hide(); +#ifdef NEEDS_ROUND_CORNERS_FIX + WindowCornerManager::instance().blockRoundedCorners(this, true); +#endif showFullScreen(); } else { UISettings::values.renderwindow_geometry = render_window->saveGeometry(); +#ifdef NEEDS_ROUND_CORNERS_FIX + WindowCornerManager::instance().blockRoundedCorners(render_window, true); +#endif render_window->showFullScreen(); } } @@ -2627,9 +2694,15 @@ void GMainWindow::HideFullscreen() { if (ui->action_Single_Window_Mode->isChecked()) { statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked()); ui->menubar->show(); +#ifdef NEEDS_ROUND_CORNERS_FIX + WindowCornerManager::instance().blockRoundedCorners(this, false); +#endif showNormal(); restoreGeometry(UISettings::values.geometry); } else { +#ifdef NEEDS_ROUND_CORNERS_FIX + WindowCornerManager::instance().blockRoundedCorners(render_window, false); +#endif render_window->showNormal(); render_window->restoreGeometry(UISettings::values.renderwindow_geometry); } From a276623dbbd96f115e2cb48a3a770643e9035f1b Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 21 Apr 2026 10:47:49 +0100 Subject: [PATCH 66/98] Updated translations via Transifex --- dist/languages/ca_ES_valencia.ts | 392 +++++----- dist/languages/da_DK.ts | 392 +++++----- dist/languages/de.ts | 392 +++++----- dist/languages/el.ts | 392 +++++----- dist/languages/es_419.ts | 710 +++++++++--------- dist/languages/es_ES.ts | 392 +++++----- dist/languages/fi.ts | 392 +++++----- dist/languages/fr.ts | 392 +++++----- dist/languages/hu_HU.ts | 392 +++++----- dist/languages/id.ts | 392 +++++----- dist/languages/it.ts | 392 +++++----- dist/languages/ja_JP.ts | 392 +++++----- dist/languages/ko_KR.ts | 392 +++++----- dist/languages/lt_LT.ts | 392 +++++----- dist/languages/nb.ts | 392 +++++----- dist/languages/nl.ts | 392 +++++----- dist/languages/pl_PL.ts | 392 +++++----- dist/languages/pt_BR.ts | 396 +++++----- dist/languages/ro_RO.ts | 392 +++++----- dist/languages/ru_RU.ts | 392 +++++----- dist/languages/sv.ts | 396 +++++----- dist/languages/tr_TR.ts | 392 +++++----- dist/languages/vi_VN.ts | 392 +++++----- dist/languages/zh_CN.ts | 392 +++++----- dist/languages/zh_TW.ts | 392 +++++----- .../src/main/res/values-b+pt+BR/strings.xml | 5 + 26 files changed, 5068 insertions(+), 5063 deletions(-) diff --git a/dist/languages/ca_ES_valencia.ts b/dist/languages/ca_ES_valencia.ts index d72e8669b..768493ae2 100644 --- a/dist/languages/ca_ES_valencia.ts +++ b/dist/languages/ca_ES_valencia.ts @@ -4239,12 +4239,12 @@ Per favor, comprove la instal·lació de FFmpeg usada per a la compilació. GMainWindow - + Warning Advertència - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4258,506 +4258,506 @@ En executar-se d'esta manera, és possible que l'aplicació no tinga c Es recomana executar Azahar amb el comando `*open`, per exemple: `*open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Velocitat actual del trànsit Artic. Valors més alts indiquen major càrrega de transferència. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. La velocitat d'emulació actual. Valors majors o menors de 100% indiquen que la velocitat d'emulació funciona més ràpida o lentament que en una 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Els fotogrames per segon que està mostrant el joc. Variaran d'aplicació en aplicació i d'escena a escena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. El temps que porta emular un fotograma de 3DS, sense tindre en compte el limitador de fotogrames, ni la sincronització vertical. Per a una emulació òptima, este valor no ha de superar els 16.67 ms. - + Emulated notification LED LED de notificació emulada - + MicroProfile (unavailable) MicroProfile (no disponible) - + Clear Recent Files Netejar Fitxers Recents - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar està executant una aplicació - - + + Invalid App Format Format d'aplicació invàlid - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. El teu format d'aplicació no és vàlid.<br/>Per favor, seguix les instruccions per a tornar a bolcar les teues <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartutxos de joc</a> i/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títols instal·lats</a>. - + App Corrupted Aplicació corrupta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. La teua aplicació està corrupta. <br/>Per favor, seguix les instruccions per a tornar a bolcar les teues <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartutxos de joc</a> i/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títols instal·lats</a>. - + App Encrypted Aplicació encriptada - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> La teua aplicació està encriptada. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Per favor visita el nostre blog per a més informació.</a> - + Unsupported App Aplicació no suportada - + GBA Virtual Console is not supported by Azahar. Consola Virtual de GBA no està suportada per Azahar. - - + + Artic Server Artic Server - + Invalid system mode Mode de sistema no vàlid - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Les aplicacions exclusives de New 3DS no es poden carregar sense activar el mode New 3DS. - + Error while loading App! Error en carregar l'aplicació! - + An unknown error occurred. Please see the log for more details. Un error desconegut ha ocorregut. Per favor, mira el log per a més detalls. - + CIA must be installed before usage El CIA ha d'estar instal·lat abans d'usar-se - + Before using this CIA, you must install it. Do you want to install it now? Abans d'usar este CIA, has d'instal·lar-ho. Vols instal·lar-ho ara? - + Quick Load Càrrega Ràpida - + Quick Save Guardat Ràpid - - + + Slot %1 Ranura %1 - + %2 %3 %2 %3 - + Quick Save - %1 Guardat Ràpid - %1 - + Quick Load - %1 Càrrega Ràpida - %1 - + Slot %1 - %2 %3 Ranura %1 - %2 %3 - + Error Opening %1 Folder Error en obrir la carpeta %1 - - + + Folder does not exist! La carpeta no existix! - + Remove Play Time Data Llevar Dades de Temps de Joc - + Reset play time? Reiniciar temps de joc? - - - - + + + + Create Shortcut Crear drecera - + Do you want to launch the application in fullscreen? Desitja llançar esta aplicació en pantalla completa? - + Successfully created a shortcut to %1 Drecera a %1 creat amb èxit - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Aixó crearà una drecera a la AppImage actual. Pot no funcionar bé si actualitzes. Continuar? - + Failed to create a shortcut to %1 Fallada en crear una drecera a %1 - + Create Icon Crear icona - + Cannot create icon file. Path "%1" does not exist and cannot be created. No es va poder crear un arxiu d'icona. La ruta "%1" no existix i no pot ser creada. - + Dumping... Bolcant... - - + + Cancel Cancel·lar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. No es va poder bolcar el RomFS base. Comprove el registre per a més detalls. - + Error Opening %1 Error en obrir %1 - + Select Directory Seleccionar directori - + Properties Propietats - + The application properties could not be loaded. Les propietats de l'aplicació no han pogut ser carregades. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executable 3DS(%1);;Tots els arxius(*.*) - + Load File Carregar Fitxer - - + + Set Up System Files Configurar Fitxers del Sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necessita fitxers d'una consola real per poder utilitzar algunes de les seues funcions.<br>Pots obtindre els fitxers amb la <a href=https://github.com/azahar-emu/ArticSetupTool>ferramenta de configuració Azahar</a><br>Notes:<ul><li><b>Aquesta operació instal·larà fitxers únics de la consola a Azahar, no compartisques les teues carpetes d'usuari o nand<br>després de completar el procés de configuració!</b></li><li>Després de la configuració, Azahar s'enllaçarà a la consola que ha executat la ferramenta de configuració. Pots desvincular la<br>consola més tard des de la pestanya "Fitxers de sistema" del menú d'opcions de l'emulador.</li><li>No et connectes en línia amb Azahar i la consola 3DS al mateix temps després de configurar els arxius del sistema,<br>ja que això podria causar problemes.</li><li>La configuració de Old 3DS és necessària perquè funcione la configuració de New 3DS (configurar els dos modes és recomanat).</li><li>Els dos modes de configuració funcionaran independentment del model de la consola que execute la ferramenta de configuració.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Introduïx la direcció de la ferramenta de configuració: - + <br>Choose setup mode: <br>Tria mode de configuració: - + (ℹ️) Old 3DS setup (ℹ️) Configuració Old 3DS - - + + Setup is possible. La configuració és possible. - + (⚠) New 3DS setup (⚠) Configuració New 3DS - + Old 3DS setup is required first. La configuració Old 3DS es neccessaria abans. - + (✅) Old 3DS setup (✅) Configuració Old 3DS - - + + Setup completed. Configuració completada. - + (ℹ️) New 3DS setup (ℹ️) Configuració New 3DS - + (✅) New 3DS setup (✅) Configuració New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Els fitxers de sistema per al mode seleccionat ja estan configurats. Vols reinstal·lar els arxius de totes maneres? - + Load Files Carregar Fitxers - + 3DS Installation File (*.cia *.zcia) Fitxers d'Instalació de 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tots els fitxers (*.*) - + Connect to Artic Base Connectar amb Artic Base - + Enter Artic Base server address: Introduïx la direcció del servidor Artic Base - + %1 has been installed successfully. %1 s'ha instal·lat amb èxit. - + Unable to open File No es va poder obrir el Fitxer - + Could not open %1 No es va poder obrir %1 - + Installation aborted Instal·lació interrompuda - + The installation of %1 was aborted. Please see the log for more details La instal·lació de %1 ha sigut avortada.\n Per favor, mira el log per a més informació. - + Invalid File Fitxer no vàlid - + %1 is not a valid CIA %1 no és un CIA vàlid. - + CIA Encrypted CIA encriptat - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> El teu fitxer CIA està encriptat. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Per favor visita el nostre blog per a més informació.</a> - + Unable to find File No es pot trobar el Fitxer - + Could not find %1 No es va poder trobar %1 - - - - + + + + Z3DS Compression Compressió Z3DS - + Failed to compress some files, check log for details. No es van poder comprimir alguns arxius, mira el registre per a més detalls. - + Failed to decompress some files, check log for details. No es van poder descomprimir alguns arxius, mira el registre per a més detalls. - + All files have been compressed successfully. Tots els fitxers s'han comprimit amb èxit. - + All files have been decompressed successfully. Tots els fitxers s'han descomprimit amb èxit. - + Uninstalling '%1'... Desinstal·lant '%1'... - + Failed to uninstall '%1'. Va fallar la desinstal·lació de '%1'. - + Successfully uninstalled '%1'. '%1' desinstal·lat amb èxit. - + File not found Fitxer no trobat - + File "%1" not found Fitxer "%1" no trobat - + Savestates Estats - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4766,86 +4766,86 @@ Use at your own risk! Usa'ls sota el teu propi risc! - - - + + + Error opening amiibo data file Error en obrir els fitxers de dades de l'Amiibo - + A tag is already in use. Ja està en ús una etiqueta. - + Application is not looking for amiibos. L'aplicació no està buscant amiibos. - + Amiibo File (%1);; All Files (*.*) Fitxer d'Amiibo (%1);; Tots els arxius (*.*) - + Load Amiibo Carregar Amiibo - + Unable to open amiibo file "%1" for reading. No es va poder obrir el fitxer amiibo "%1" per a la seua lectura. - + Record Movie Gravar Pel·lícula - + Movie recording cancelled. Gravació de pel·lícula cancel·lada. - - + + Movie Saved Pel·lícula Guardada - - + + The movie is successfully saved. Pel·lícula guardada amb èxit. - + Application will unpause L'aplicació es resumirà - + The application will be unpaused, and the next frame will be captured. Is this okay? L'aplicació es resumirà, i el següent fotograma serà capturat. Estàs d'acord? - + Invalid Screenshot Directory Directori de captures de pantalla no vàlid - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. No es pot crear el directori de captures de pantalla. La ruta de captures de pantalla torna al seu valor per omissió. - + Could not load video dumper No es va poder carregar el bolcador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4858,265 +4858,265 @@ Per a instal·lar FFmpeg en Azahar, polsa Obrir i tria el directori de FFmpeg. Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda. - + Load 3DS ROM Files Carregar ROM de 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Fitxers ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Fitxer ROM 3DS comprimit (*.%1) - + Save 3DS Compressed ROM File Desar fitxer 3DS comprimit - + Select Output 3DS Compressed ROM Folder Seleccione la carpeta d'eixida comprimida dels ROMs 3DS - + Load 3DS Compressed ROM Files Carregar fitxers 3DS comprimits - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Fitxer ROM 3DS comprimit (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Fitxer ROM 3DS (*.%1) - + Save 3DS ROM File Desar fitxer ROM 3DS - + Select Output 3DS ROM Folder Seleccione la carpeta d'eixida dels ROMs 3DS - + Select FFmpeg Directory Seleccionar Directori FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Al directori de FFmpeg indicat li falta %1. Per favor, assegura't d'haver seleccionat el directori correcte. - + FFmpeg has been sucessfully installed. FFmpeg ha sigut instal·lat amb èxit. - + Installation of FFmpeg failed. Check the log file for details. La instal·lació de FFmpeg ha fallat. Comprova l'arxiu del registre per a més detalls. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. No es va poder començar a gravar vídeo.<br>Assegura't que el codificador de vídeo està configurat correctament.<br>Per a més detalls, observa el registre. - + Recording %1 Gravant %1 - + Playing %1 / %2 Reproduint %1 / %2 - + Movie Finished Pel·lícula acabada - + (Accessing SharedExtData) (Accedint al SharedExtData) - + (Accessing SystemSaveData) (Accedint al SystemSaveData) - + (Accessing BossExtData) (Accedint al BossExtData) - + (Accessing ExtData) (Accedint al ExtData) - + (Accessing SaveData) (Accedint al SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tràfic Artic: %1 %2%3 - + Speed: %1% Velocitat: %1% - + Speed: %1% / %2% Velocitat: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUM: SILENCI - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Falta %1 . Per favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>bolca els teus arxius de sistema</a>.<br/>Continuar l'emulació pot resultar en penges i errors. - + A system archive Un fitxer del sistema - + System Archive Not Found El fitxer del sistema no s'ha trobat - + System Archive Missing Falta un Fitxer de Sistema - + Save/load Error Error de guardat/càrrega - + Fatal Error Error Fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Error fatal.<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Mira el log</a>per a més detalls.<br/>Continuar l'emulació pot resultar en penges i errors. - + Fatal Error encountered Error Fatal trobat - + Continue Continuar - + Quit Application Tancar aplicació - + OK Aceptar - + Would you like to exit now? Vols eixir ara? - + The application is still running. Would you like to stop emulation? L'aplicació seguix en execució. Vols parar l'emulació? - + Playback Completed Reproducció Completada - + Movie playback completed. Reproducció de pel·lícula completada. - + Update Available Actualització disponible - + Update %1 for Azahar is available. Would you like to download it? L'actualització %1 d'Azahar ja està disponible. Vols descarregar-la? - + Primary Window Finestra Primària - + Secondary Window Finestra Secundària diff --git a/dist/languages/da_DK.ts b/dist/languages/da_DK.ts index be3fbd643..2739904bd 100644 --- a/dist/languages/da_DK.ts +++ b/dist/languages/da_DK.ts @@ -4237,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Advarsel - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4252,590 +4252,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nuværende emuleringshastighed. Værdier højere eller lavere end 100% indikerer at emuleringen kører hurtigere eller langsommere end en 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid det tog at emulere en 3DS-skærmbillede, hastighedsbegrænsning og v-sync er tille talt med. For emulering med fuld hastighed skal dette højest være 16,67ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Ryd seneste filer - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA skal installeres før brug - + Before using this CIA, you must install it. Do you want to install it now? Før du kan bruge denne CIA, skal den være installeret. Vil du installere den nu? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Fejl ved åbning af %1-mappen - - + + Folder does not exist! Mappen findes ikke! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Annuller - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Fejl ved åbning af %1 - + Select Directory Vælg mappe - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS-program (%1);;Alle filer (*.*) - + Load File Indlæs fil - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Indlæs filer - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle filer (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 blev succesfuldt installeret. - + Unable to open File Kunne ikke åbne filen - + Could not open %1 Kunne ikke åbne %1 - + Installation aborted Installation afbrudt - + The installation of %1 was aborted. Please see the log for more details Installationen af %1 blev afbrudt. Se logfilen for flere detaljer. - + Invalid File Ugyldig fil - + %1 is not a valid CIA %1 er ikke en gyldig CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Filen blev ikke fundet - + File "%1" not found Filen "%1" blev ikke fundet - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);;Alle filer (*.*) - + Load Amiibo Indlæs Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Optag film - + Movie recording cancelled. Filmoptagelse afbrudt - - + + Movie Saved Film gemt - - + + The movie is successfully saved. Filmen er succesfuldt blevet gemt. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4844,264 +4844,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Hastighed: %1% - + Speed: %1% / %2% Hastighed: %1%/%2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Billede: %1ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found Systemarkiver blev ikke fundet - + System Archive Missing - + Save/load Error - + Fatal Error Alvorlig fejl - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Fortsæt - + Quit Application - + OK OK - + Would you like to exit now? Vil du afslutte nu? - + The application is still running. Would you like to stop emulation? - + Playback Completed Afspilning færdig - + Movie playback completed. Afspilning af filmen er færdig. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/de.ts b/dist/languages/de.ts index b8ea368c1..e1f0be4c9 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -4241,12 +4241,12 @@ Bitte überprüfe deine FFmpeg-Installation, die für die Kompilierung verwendet GMainWindow - + Warning Warnung - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4261,506 +4261,506 @@ Es wird empfohlen, Azahar stattdessen mit dem Befehl `open` zu starten, z. B.: `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Aktuelle Artic Daten-Verkehrsgeschwindigkeit. Höhere Werte weisen auf größere Übertragungslasten hin. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Derzeitige Emulationsgeschwindigkeit. Werte höher oder niedriger als 100% zeigen, dass die Emulation schneller oder langsamer läuft als auf einem 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Wie viele Bilder pro Sekunde die App aktuell anzeigt. Dies ist von App zu App und von Szene zu Szene unterschiedlich. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die benötigte Zeit um ein 3DS-Einzelbild zu emulieren (V-Sync oder Bildratenbegrenzung nicht mitgezählt). Bei Echtzeitemulation sollte dieser Wert höchstens 16,67ms betragen. - + Emulated notification LED - + MicroProfile (unavailable) MicroProfile (Nicht verfügbar) - + Clear Recent Files Zuletzt verwendete Dateien zurücksetzen - + &Continue &Fortsetzen - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar führt eine Anwendung aus - - + + Invalid App Format Falsches App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Dein App-Format wird nicht unterstützt. <br/>Bitte folge den Anleitungen um deine <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>Spielkarten</a> oder <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installierten Titel</a> erneut zu dumpen. - + App Corrupted Anwendung beschädigt - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Deine App ist beschädigt. <br/>Folge bitte den Anleitungen um deine <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>Spielkarten</a> oder <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installierten Titel</a> erneut zu dumpen. - + App Encrypted Anwendung verschlüsselt - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Deine App ist verschlüsselt. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Bitte lies unseren Blog für weitere Informationen.</a> - + Unsupported App Nicht unterstützte Anwendung - + GBA Virtual Console is not supported by Azahar. GBA Virtual Console wird nicht von Azahar unterstützt - - + + Artic Server Artic Server - + Invalid system mode Ungültiger Systemmodus - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. New 3DS eksklusive Applikationen können nicht ohne den New 3DS Modus geladen werden. - + Error while loading App! Fehler beim Laden der Anwendung! - + An unknown error occurred. Please see the log for more details. Ein unbekannter Fehler ist aufgetreten. Mehr Details im Protokoll. - + CIA must be installed before usage CIA muss vor der Benutzung installiert sein - + Before using this CIA, you must install it. Do you want to install it now? Vor dem Nutzen dieser CIA muss sie installiert werden. Soll dies jetzt getan werden? - + Quick Load Schnellladen - + Quick Save Schnellspeichern - - + + Slot %1 Speicherplatz %1 - + %2 %3 %2 %3 - + Quick Save - %1 Schnellspeichern - %1 - + Quick Load - %1 Schnellladen - %1 - + Slot %1 - %2 %3 Speicherplatz %1 - %2 %3 - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Ordner existiert nicht! - + Remove Play Time Data Spielzeitdaten löschen - + Reset play time? Spielzeit zurücksetzen - - - - + + + + Create Shortcut Verknüpfung erstellen - + Do you want to launch the application in fullscreen? Möchtest du die Anwendung in Vollbild starten? - + Successfully created a shortcut to %1 Es wurde erfolgreich eine Verknüpfung für %1 erstellt - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Dadurch wird eine Verknüpfung zum aktuellen AppImage erstellt. Dies funktioniert möglicherweise nicht mehr richtig, wenn du aktualisierst. Möchtest du fortfahren? - + Failed to create a shortcut to %1 Es konnte keine Verknüpfung für %1 erstellt werden - + Create Icon Icon erstellen - + Cannot create icon file. Path "%1" does not exist and cannot be created. Es konnte kein Icon-Pfad erstellt werden. „%1“ existiert nicht, oder kann nicht erstellt werden. - + Dumping... Dumpvorgang... - - + + Cancel Abbrechen - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Konnte Base-RomFS nicht dumpen. Schau im Protokoll für weitere Informationen nach. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The application properties could not be loaded. Die Anwendungseigenschaften konnten nicht geladen werden. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Programmdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - - + + Set Up System Files Systemdateien einrichten - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar benötigt Konsolendaten und Firmware-Dateien von einer echten Konsole, um einige Funktionen nutzen zu können. <br>Du kannst solche Dateien mit dem <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Einrichtungs-Tool</a> einrichten.<br>Hinweise:<ul><li><b>Bei diesem Vorgang werden konsolenspezifische Dateien in Azahar installiert. Gib deine Benutzer- oder NAND-Ordner nicht frei, <br>nachdem der Einrichtungsvorgang durchgeführt wurde!</b></li><li>Während des Einrichtungsvorgangs verknüpft Azahar deine Konsole mit dem Einrichtungstool. Du kannst die Verknüpfung <br>jederzeit im „Systemdateien“-Reiter in den Emulatoreinstellungen trennen.</li><li>Gehe nicht zeitgleich mit deinem eigenen 3DS und Azahar online, <br>da dies sonst zu Problemen führen könnte.</li><li>Damit die New 3DS-Einrichtung funktioniert, ist zuerst eine Old 3DS-Einrichtung erforderlich (Es wird empfohlen, beides einzurichten).</li><li>Beide Setup-Modi funktionieren unabhängig vom Modell der Konsole, auf dem das Setup-Tool ausgeführt wird.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Gib die Adresse des Azahar Artic Einrichtung-Tools ein: - + <br>Choose setup mode: <br>Wähle den Einrichtungsmodus: - + (ℹ️) Old 3DS setup (ℹ️) Old 3DS-Einrichtung - - + + Setup is possible. Einrichtung ist möglich. - + (⚠) New 3DS setup (⚠) New 3DS-Einrichtung - + Old 3DS setup is required first. Du musst zuerst die Old 3DS-Einrichtung abschließen. - + (✅) Old 3DS setup (✅) Old 3DS-Einrichtung - - + + Setup completed. Einrichtung abgeschlossen - + (ℹ️) New 3DS setup (ℹ️) New 3DS-Einrichtung - + (✅) New 3DS setup (✅) New 3DS-Einrichtung - + The system files for the selected mode are already set up. Reinstall the files anyway? Die Systemdateien für den ausgewählten Modus sind bereits eingerichtet. Die Dateien trotzdem neu installieren? - + Load Files Dateien laden - + 3DS Installation File (*.cia *.zcia) 3DS Installationsdatei (*.cia *.zcia) - - - + + + All Files (*.*) Alle Dateien (*.*) - + Connect to Artic Base Verbinde dich mit Artic-Base - + Enter Artic Base server address: Gib die Artic-Base-Serveradresse ein - + %1 has been installed successfully. %1 wurde erfolgreich installiert. - + Unable to open File Datei konnte nicht geöffnet werden - + Could not open %1 Konnte %1 nicht öffnen - + Installation aborted Installation abgebrochen - + The installation of %1 was aborted. Please see the log for more details Die Installation von %1 wurde abgebrochen. Schaue im Protokoll für weitere Informationen nach - + Invalid File Ungültige Datei - + %1 is not a valid CIA %1 ist keine gültige CIA - + CIA Encrypted CIA verschlüsselt - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Deine CIA Datei ist verschlüsselt. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Bitte lese unseren Blog für mehr Info.</a> - + Unable to find File Datei konnte nicht gefunden werden - + Could not find %1 %1 konnte nicht gefunden werden - - - - + + + + Z3DS Compression Z3DS Komprimierung - + Failed to compress some files, check log for details. Fehler beim komprimieren von Dateien, checke den Log für Details. - + Failed to decompress some files, check log for details. Fehler beim dekomprimieren von Dateien, checke den Log für Details. - + All files have been compressed successfully. Alle Dateien wurden erfolgreich komprimiert. - + All files have been decompressed successfully. Alle Dateien wurden erfolgreich dekomprimiert. - + Uninstalling '%1'... '%1' wird deinstalliert… - + Failed to uninstall '%1'. Deinstallation von '%1' fehlgeschlagen. - + Successfully uninstalled '%1'. '%1' erfolgreich deinstalliert. - + File not found Datei nicht gefunden - + File "%1" not found Datei "%1" nicht gefunden - + Savestates Speicherstände - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4769,86 +4769,86 @@ Use at your own risk! Nutzung auf eigene Gefahr! - - - + + + Error opening amiibo data file Fehler beim Öffnen der Amiibo-Datei - + A tag is already in use. Eine Markierung wird schon genutzt. - + Application is not looking for amiibos. Die Anwendung sucht keine Amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo wird geladen - + Unable to open amiibo file "%1" for reading. Die Amiibo-Datei "%1" konnte nicht zum Lesen geöffnet werden. - + Record Movie Aufnahme starten - + Movie recording cancelled. Aufnahme abgebrochen. - - + + Movie Saved Aufnahme gespeichert - - + + The movie is successfully saved. Die Aufnahme wurde erfolgreich gespeichert. - + Application will unpause Die Anwendung wird fortgesetzt - + The application will be unpaused, and the next frame will be captured. Is this okay? Die Anwendung wird fortgesetzt und das nächste Bild wird aufgenommen. Ist das okay? - + Invalid Screenshot Directory Ungültiges Bildschirmfoto-Verzeichnis - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Das angegebene Bildschirmfoto-Verzeichnis kann nicht erstellt werden. Der Bildschirmfotopfad wurde auf die Voreinstellung zurückgesetzt. - + Could not load video dumper Konnte Video-Dumper nicht laden - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4861,265 +4861,265 @@ Um FFmpeg in Azahar zu installieren, klicke auf „Offnen“ und wähle dein FFm Um eine Anleitung zur Installation von FFmpeg anzuzeigen, klicke auf „Hilfe“. - + Load 3DS ROM Files Lade 3DS ROM Dateien - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) 3DS ROM Dateien (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) 3DS Komprimierte ROM Datei (*.%1) - + Save 3DS Compressed ROM File Speichere 3DS Komprimierte ROM Datei - + Select Output 3DS Compressed ROM Folder Wähle einen 3DS komprimierten ROM Output Ordner - + Load 3DS Compressed ROM Files Lade 3DS Komprimierte ROM Datei - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) 3DS Komprimierte ROM Dateien (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) 3DS ROM Datei (*.%1) - + Save 3DS ROM File Speichere 3DS ROM Datei - + Select Output 3DS ROM Folder Wähle einen 3DS ROM Output Ordner - + Select FFmpeg Directory Wähle FFmpeg-Verzeichnis - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Das angegebene FFmpeg-Verzeichnis fehlt %1. Bitte stelle sicher, dass du das richtige Verzeichnis ausgewählt hast. - + FFmpeg has been sucessfully installed. FFmpeg wurde erfolgreich installiert. - + Installation of FFmpeg failed. Check the log file for details. Installation von FFmpeg fehlgeschlagen. Prüfe die Protokolldatei für Details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Video-Dump konnte nicht gestartet werden.<br>Bitte überprüfe, ob der Video-Encoder richtig eingestellt ist.<br>Schau im Protokoll für weitere Informationen nach. - + Recording %1 %1 wird aufgenommen - + Playing %1 / %2 %1 / %2 wird abgespielt - + Movie Finished Aufnahme beendet - + (Accessing SharedExtData) (Zugriff auf SharedExtData) - + (Accessing SystemSaveData) (Zugriff auf SystemSaveData) - + (Accessing BossExtData) (Zugriff auf BossExtData) - + (Accessing ExtData) (Zugriff auf ExtData) - + (Accessing SaveData) (Zugriff auf SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic Traffic: %1 %2%3 - + Speed: %1% Geschwindigkeit: %1% - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Einzelbild: %1 ms - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 fehlt. Bitte <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dumpe deine Systemdateien</a>.<br/>Das Fortfahren der Emulation könnte zu Abstürzen oder Problemen führen - + A system archive Ein Systemarchiv - + System Archive Not Found Systemarchiv nicht gefunden - + System Archive Missing Systemarchiv fehlt - + Save/load Error Speichern/Laden Fehler - + Fatal Error Schwerwiegender Fehler - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ein fataler Fehler ist aufgetreten. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Checke den Log</a> für Details.<br/>Das Fortfahren der Emulation könnte zu Abstürzen oder Problemen führen. - + Fatal Error encountered Auf schwerwiegenden Fehler gestoßen - + Continue Fortsetzen - + Quit Application Beende die Anwendung - + OK O.K. - + Would you like to exit now? Möchtest du die Anwendung jetzt verlassen? - + The application is still running. Would you like to stop emulation? Die Anwendung läuft noch. Möchtest du die Emulation stoppen? - + Playback Completed Wiedergabe abgeschlossen - + Movie playback completed. Wiedergabe der Aufnahme abgeschlossen. - + Update Available Aktualisierung verfügbar - + Update %1 for Azahar is available. Would you like to download it? Für Azahar ist die Aktualisierung %1 verfügbar. Soll es heruntergeladen werden? - + Primary Window Hauptfenster - + Secondary Window Zweifenster diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 504f20f7b..8f7bd77fb 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -4238,12 +4238,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Προειδοποίηση - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4258,505 +4258,505 @@ It is recommended to instead run Azahar using the `open` command, e.g.: `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Η τρέχουσα ταχύτητα κίνησης του Artic. Οι υψηλότερες τιμές υποδεικνύουν μεγαλύτερους φόρτους μεταφορών. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Η τρέχουσα ταχύτητα εξομοίωσης. Οι τιμές που είναι μεγαλύτερες ή μικρότερες από 100% υποδεικνύουν ότι η εξομοίωση λειτουργεί πιο γρήγορα ή πιο αργά από ένα 3DS, αντίστοιχα. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Πόσα καρέ ανά δευτερόλεπτο εμφανίζει επί του παρόντος η εφαρμογή. Αυτό θα διαφέρει από εφαρμογή σε εφαρμογή και από σκηνικό σε σκηνικό. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Ο χρόνος που χρειάζεται για την εξομοίωση ενός καρέ 3DS, χωρίς να υπολογίζεται ο περιορισμός καρέ ή το v-sync. Για εξομοίωση σε πλήρη ταχύτητα, αυτό θα πρέπει να είναι το πολύ 16,67 ms. - + Emulated notification LED - + MicroProfile (unavailable) MicroProfile (μη διαθέσιμο) - + Clear Recent Files Απαλοιφή πρόσφατων αρχείων - + &Continue &Συνέχεια - + &Pause &Παύση - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Το Azahar εκτελεί μια εφαρμογή - - + + Invalid App Format Μη έγκυρη μορφή εφαρμογής - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Η μορφή της εφαρμογής σας δεν υποστηρίζεται.<br/>Ακολουθήστε τους οδηγούς για να κάνετε εκ νέου αποτύπωση των <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>κασετών</a> ή των <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>εγκατεστημένων τίτλων</a> σας. - + App Corrupted Κατεστραμμένη εφαρμογή - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted Κρυπτογραφημένη εφαρμογή - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Η εφαρμογή σας είναι κρυπτογραφημένη. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Ελέγξτε το ιστολόγιό μας για περισσότερες πληροφορίες.</a> - + Unsupported App Μη υποστηριζόμενη εφαρμογή - + GBA Virtual Console is not supported by Azahar. Η GBA Virtual Console δεν υποστηρίζεται από το Azahar. - - + + Artic Server Διακομιστής Artic - + Invalid system mode Μη έγκυρη λειτουργία συστήματος - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! Σφάλμα κατά τη φόρτωση της εφαρμογής! - + An unknown error occurred. Please see the log for more details. Προέκυψε άγνωστο σφάλμα. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες. - + CIA must be installed before usage Το CIA πρέπει να εγκατασταθεί πριν από τη χρήση - + Before using this CIA, you must install it. Do you want to install it now? Πριν από τη χρήση αυτού του CIA, πρέπει να το εγκαταστήσετε. Θέλετε να το εγκαταστήσετε τώρα; - + Quick Load Γρήγορη φόρτωση - + Quick Save Γρήγορη αποθήκευση - - + + Slot %1 Θέση %1 - + %2 %3 %2 %3 - + Quick Save - %1 Γρήγορη αποθήκευση - %1 - + Quick Load - %1 Γρήγορη φόρτωση - %1 - + Slot %1 - %2 %3 Θέση %1 - %2 %3 - + Error Opening %1 Folder Σφάλμα ανοίγματος %1 φακέλου - - + + Folder does not exist! Ο φάκελος δεν υπάρχει! - + Remove Play Time Data - + Reset play time? Επαναφορά χρόνου παιχνιδιού; - - - - + + + + Create Shortcut Δημιουργία συντόμευσης - + Do you want to launch the application in fullscreen? Θέλετε να εκκινήσετε την εφαρμογή σε πλήρη οθόνη; - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Δημηουργία εικονιδίου - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Αποτύπωση... - - + + Cancel Ακύρωση - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Δεν ήταν δυνατή η αποτύπωση του βασικού RomFS. Ανατρέξτε στο αρχείο καταγραφής για λεπτομέρειες. - + Error Opening %1 Σφάλμα ανοίγματος του «%1» - + Select Directory Επιλογή καταλόγου - + Properties Ιδιότητες - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Εκτελέσιμο 3DS (%1);;Όλα τα αρχεία (*.*) - + Load File Φόρτωση αρχείου - - + + Set Up System Files Ρύθμιση αρχείων συστήματος - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Για να χρησιμοποιήσετε ορισμένες από τις λειτουργίες του Azahar, απαιτούνται μοναδικά δεδομένα κονσόλας και αρχεία υλικολογισμικού από μια πραγματική κονσόλα.<br>Μπορείτε να ρυθμίσετε αυτά τα αρχεία και τα δεδομένα με το <a href=https://github.com/azahar-emu/ArticSetupTool>Εργαλείο ρύθμισης Azahar Artic</a><br>Σημειώσεις:<ul><li><b>Αυτή η ενέργεια θα εγκαταστήσει τα μοναδικά δεδομένα της κονσόλας στο Azahar. Μην κοινοποιήσετε τους φακέλους χρήστη ή nand<br>μετά την εκτέλεση της διαδικασίας ρύθμισης!</b></li><li>Κατά τη διαδικασία ρύθμισης, το Azahar θα συνδεθεί στην κονσόλα που εκτελεί το εργαλείο ρύθμισης. Μπορείτε να αποσυνδέσετε την<br>κονσόλα αργότερα, από την καρτέλα «Σύστημα» στο μενού διαμόρφωσης του εξομοιωτή.</li><li>Αφού ρυθμίσετε τα αρχεία συστήματος, φροντίστε να μην συνδέεστε στο διαδίκτυο με το Azahar και την κονσόλα 3DS σας ταυτόχρονα,<br>καθώς αυτό μπορεί να προκαλέσει προβλήματα.</li><li>Για να λειτουργήσει η ρύθμιση για συστήματα New 3DS, απαιτείται η ρύθμιση για Old 3DS (προτείνεται η εκτέλεση και των δύο τρόπων ρύθμισης).</li><li>Και οι δύο τρόποι ρύθμισης θα λειτουργήσουν ανεξάρτητα από το μοντέλο της κονσόλας που εκτελεί το εργαλείο ρύθμισης.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Εισαγάγετε τη διεύθυνση του εργαλείου ρύθμισης Azahar Artic: - + <br>Choose setup mode: <br>Επιλέξτε τρόπο ρύθμισης: - + (ℹ️) Old 3DS setup (ℹ️) Ρύθμιση για Old 3DS - - + + Setup is possible. Η ρύθμιση είναι δυνατή. - + (⚠) New 3DS setup (⚠) Ρύθμιση για New 3DS - + Old 3DS setup is required first. Απαιτείται πρώτα ρύθμιση για Old 3DS. - + (✅) Old 3DS setup (✅) Ρύθμιση για Old 3DS - - + + Setup completed. Η ρύθμιση ολοκληρώθηκε. - + (ℹ️) New 3DS setup (ℹ️) Ρύθμιση για New 3DS - + (✅) New 3DS setup (✅) Ρύθμιση για New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Φόρτωση αρχείων - + 3DS Installation File (*.cia *.zcia) Αρχείο εγκατάστασης 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Όλα τα αρχεία (*.*) - + Connect to Artic Base Σύνδεση στο Artic Base - + Enter Artic Base server address: Εισαγάγετε διεύθυνση διακομιστή Artic Base: - + %1 has been installed successfully. Το «%1» εγκαταστάθηκε επιτυχώς. - + Unable to open File Αδυναμία ανοίγματος του αρχείου - + Could not open %1 Δεν ήταν δυνατό το άνοιγμα του «%1» - + Installation aborted Η εγκατάσταση ακυρώθηκε - + The installation of %1 was aborted. Please see the log for more details Η εγκατάσταση του «%1» ακυρώθηκε. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες - + Invalid File Μη έγκυρο αρχείο - + %1 is not a valid CIA Το «%1» δεν είναι έγκυρο CIA - + CIA Encrypted Κρυπτογραφημένο CIA - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Αδυναμία εύρεσης του αρχείου - + Could not find %1 Δεν ήταν δυνατή η εύρεση του «%1» - - - - + + + + Z3DS Compression Συμπίεση Z3DS - + Failed to compress some files, check log for details. Η συμπίεση ορισμένων αρχείων απέτυχε, ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. - + Failed to decompress some files, check log for details. Η αποσυμπίεση ορισμένων αρχείων απέτυχε, ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. - + All files have been compressed successfully. Όλα τα αρχεία έχουν συμπιεστεί επιτυχώς. - + All files have been decompressed successfully. Όλα τα αρχεία έχουν αποσυμπιεστεί επιτυχώς. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. Έγινε επιτυχώς κατάργηση της εγκατάστασης του «%1». - + File not found Το αρχείο δεν βρέθηκε - + File "%1" not found Το αρχείο «%1» δεν βρέθηκε - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4765,86 +4765,86 @@ Use at your own risk! Χρησιμοποιήστε τες με δική σας ευθύνη! - - - + + + Error opening amiibo data file Σφάλμα κατά το άνοιγμα του αρχείου δεδομένων Amiibo - + A tag is already in use. Μια ετικέτα χρησιμοποιείται ήδη. - + Application is not looking for amiibos. Η εφαρμογή δεν αναζητά Amiibo. - + Amiibo File (%1);; All Files (*.*) Αρχείο Amiibo (%1);; Όλα τα αρχεία (*.*) - + Load Amiibo Φόρτωση Amiibo - + Unable to open amiibo file "%1" for reading. Δεν είναι δυνατό το άνοιγμα του αρχείου Amiibo «%1» για ανάγνωση. - + Record Movie Εγγραφή βίντεο - + Movie recording cancelled. Η εγγραφή βίντεο ακυρώθηκε. - - + + Movie Saved Το βίντεο αποθηκεύτηκε - - + + The movie is successfully saved. Το βίντεο αποθηκεύτηκε επιτυχώς. - + Application will unpause Η εφαρμογή θα συνεχιστεί - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Μη έγκυρος κατάλογος στιγμιότυπων - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4857,264 +4857,264 @@ To view a guide on how to install FFmpeg, press Help. Για να δείτε έναν οδηγό εγκατάστασης του FFmpeg, επιλέξτε «Βοήθεια». - + Load 3DS ROM Files Φόρτωση αρχείων ROM 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Αρχεία ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Συμπιεσμένο αρχείο ROM 3DS (*.%1) - + Save 3DS Compressed ROM File Αποθήκευση αρχείου συμπιεσμένης ROM 3DS - + Select Output 3DS Compressed ROM Folder Επιλογή φακέλου εξόδου συμπιεσμένης ROM 3DS - + Load 3DS Compressed ROM Files Φόρτωση αρχείων συμπιεσμένων ROM 3DS - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Συμπιεσμένα αρχεία ROM 3DS (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Αρχείο ROM 3DS (*.%1) - + Save 3DS ROM File Αποθήκευση αρχείου ROM 3DS - + Select Output 3DS ROM Folder Επιλογή φακέλου εξόδου ROM 3DS - + Select FFmpeg Directory Επιλογή καταλόγου FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. Το FFmpeg έχει εγκατασταθεί επιτυχώς. - + Installation of FFmpeg failed. Check the log file for details. Η εγκατάσταση του FFmpeg απέτυχε. Ελέγξτε το αρχείο καταγραφής για λεπτομέρειες. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Εγγραφή %1 - + Playing %1 / %2 Αναπαραγωγή %1 / %2 - + Movie Finished Το βίντεο τελείωσε - + (Accessing SharedExtData) (Πρόσβαση στα SharedExtData) - + (Accessing SystemSaveData) (Πρόσβαση στα SystemSaveData) - + (Accessing BossExtData) (Πρόσβαση στα BossExtData) - + (Accessing ExtData) (Πρόσβαση στα ExtData) - + (Accessing SaveData) (Πρόσβαση στα SaveData) - + MB/s MB/δ - + KB/s KB/δ - + Artic Traffic: %1 %2%3 Κίνηση Artic: %1 %2%3 - + Speed: %1% Ταχύτητα: %1% - + Speed: %1% / %2% Ταχύτητα: %1% / %2% - + App: %1 FPS Εφαρμογή: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Καρέ: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Καρέ: %1 ms - + VOLUME: MUTE ΕΝΤΑΣΗ: ΣΙΓΑΣΗ - + VOLUME: %1% Volume percentage (e.g. 50%) ΕΝΤΑΣΗ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Ένα αρχείο συστήματος - + System Archive Not Found Δεν βρέθηκε αρχείο συστήματος - + System Archive Missing Απουσία αρχείου συστήματος - + Save/load Error Σφάλμα αποθήκευσης/φόρτωσης - + Fatal Error Κρίσιμο σφάλμα - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Προέκυψε κρίσιμο σφάλμα - + Continue Συνέχεια - + Quit Application Έξοδος από την εφαρμογή - + OK OK - + Would you like to exit now? Θέλετε να κλείσετε το πρόγραμμα τώρα; - + The application is still running. Would you like to stop emulation? Η εφαρμογή εκτελείται ακόμα. Θέλετε να διακόψετε την εξομοίωση; - + Playback Completed Η αναπαραγωγή ολοκληρώθηκε - + Movie playback completed. Η αναπαραγωγή βίντεο ολοκληρώθηκε. - + Update Available Διαθέσιμη ενημέρωση - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Κύριο παράθυρο - + Secondary Window Δευτερεύον παράθυρο diff --git a/dist/languages/es_419.ts b/dist/languages/es_419.ts index c0727c6d9..4650a3f2c 100644 --- a/dist/languages/es_419.ts +++ b/dist/languages/es_419.ts @@ -848,7 +848,7 @@ Would you like to ignore the error and continue? Command buffer dumping not available - + Volcado del buffer de comandos no disponible. @@ -1185,7 +1185,7 @@ Would you like to ignore the error and continue? <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - + <html><head/><body><p>Vuelca las texturas a archivos PNG.</p><p>Las texturas son volcadas a dump/textures/[Title ID]/.</p></body></html> @@ -1475,7 +1475,7 @@ Would you like to ignore the error and continue? Advanced - Avanzado + Avanzado @@ -1578,7 +1578,7 @@ Would you like to ignore the error and continue? Action - + Acción @@ -1645,17 +1645,17 @@ Would you like to ignore the error and continue? Profile - + Perfil New - + Nuevo Delete - Eliminar + Borrar @@ -1670,22 +1670,22 @@ Would you like to ignore the error and continue? ZR: - + ZR: L: - + L: ZL: - + ZL: R: - + R: @@ -1695,22 +1695,22 @@ Would you like to ignore the error and continue? Y: - + Y: X: - + X: B: - + B: A: - + A: @@ -1722,7 +1722,7 @@ Would you like to ignore the error and continue? Up: - + Arriba: @@ -3017,7 +3017,7 @@ installed applications. Choose - + Elegir @@ -3032,7 +3032,7 @@ installed applications. movable.sed - + movable.sed @@ -3042,667 +3042,667 @@ installed applications. Japan - + Japón Anguilla - + Anguila Antigua and Barbuda - + Antigua y Barbuda Argentina - + Argentina Aruba - + Aruba Bahamas - + Bahamas Barbados - + Barbados Belize - + Belice Bolivia - + Bolivia Brazil - + Brasil British Virgin Islands - + Islas Vírgenes Británicas Canada - + Canadá Cayman Islands - + Islas Caimán Chile - + Chile Colombia - + Colombia Costa Rica - + Costa Rica Dominica - + Dominica Dominican Republic - + República Dominicana Ecuador - + Ecuador El Salvador - + El Salvador French Guiana - + Guayana Francesa Grenada - + Granada (América) Guadeloupe - + Guadalupe Guatemala - + Guatemala Guyana - + Guyana Haiti - + Haití Honduras - + Honduras Jamaica - + Jamaica Martinique - + Martinica Mexico - + México Montserrat - + Montserrat Netherlands Antilles - + Antillas Neerlandesas Nicaragua - + Nicaragua Panama - + Panamá Paraguay - + Paraguay Peru - + Perú Saint Kitts and Nevis - + San Cristóbal y Nieves Saint Lucia - + Santa Lucía Saint Vincent and the Grenadines - + San Vicente y las Granadinas Suriname - + Surinam Trinidad and Tobago - + Trinidad y Tobago Turks and Caicos Islands - + Islas Turcas y Caicos United States - + Estados Unidos Uruguay - + Uruguay US Virgin Islands - + Islas Vírgenes de los EEUU Venezuela - + Venezuela Albania - + Albania Australia - + Australia Austria - + Austria Belgium - + Bélgica Bosnia and Herzegovina - + Bosnia y Herzegovina Botswana - + Botsuana Bulgaria - + Bulgaria Croatia - + Croacia Cyprus - + Chipre Czech Republic - + República Checa Denmark - + Dinamarca Estonia - + Estonia Finland - + Finlandia France - + Francia Germany - + Alemania Greece - + Grecia Hungary - + Hungría Iceland - + Islandia Ireland - + Irlanda Italy - + Italia Latvia - + Letonia Lesotho - + Lesotho Liechtenstein - + Liechtenstein Lithuania - + Lituania Luxembourg - + Luxemburgo Macedonia - + Macedonia Malta - + Malta Montenegro - + Montenegro Mozambique - + Mozambique Namibia - + Namibia Netherlands - + Países Bajos New Zealand - + Nueva Zelanda Norway - + Noruega Poland - + Polonia Portugal - + Portugal Romania - + Rumanía Russia - + Rusia Serbia - + Serbia Slovakia - + Eslovaquia Slovenia - + Eslovenia South Africa - + Sudáfrica Spain - + España Swaziland - + Suazilandia Sweden - + Suecia Switzerland - + Suiza Turkey - + Turquía United Kingdom - + Reino Unido Zambia - + Zambia Zimbabwe - + Zimbabue Azerbaijan - + Azerbaiyán Mauritania - + Mauritania Mali - + Malí Niger - + Níger Chad - + Chad Sudan - + Sudán Eritrea - + Eritrea Djibouti - + Yibuti Somalia - + Somalia Andorra - + Andorra Gibraltar - + Gibraltar Guernsey - + Guernsey Isle of Man - + Isla de Man Jersey - + Jersey Monaco - + Mónaco Taiwan - + Taiwán South Korea - + Corea del Sur Hong Kong - + Hong Kong Macau - + Macao Indonesia - + Indonesia Singapore - + Singapur Thailand - + Tailandia Philippines - + Filipinas Malaysia - + Malasia China - + China United Arab Emirates - + Emiratos Árabes Unidos India - + India Egypt - + Egipto Oman - + Omán Qatar - + Catar Kuwait - + Kuwait Saudi Arabia - + Arabia Saudí Syria - + Siria Bahrain - + Baréin Jordan - + Jordán San Marino - + San Marino Vatican City - + Ciudad del Vaticano Bermuda - + Bermudas @@ -3844,12 +3844,12 @@ installed applications. New - + Nuevo Delete - Eliminar + @@ -4237,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4252,590 +4252,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 - + Select Directory - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. - + Unable to open File - + Could not open %1 - + Installation aborted - + The installation of %1 was aborted. Please see the log for more details - + Invalid File - + %1 is not a valid CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found - + File "%1" not found - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie - + Movie recording cancelled. - - + + Movie Saved - - + + The movie is successfully saved. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4844,264 +4844,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% - + Speed: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found - + System Archive Missing - + Save/load Error - + Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue - + Quit Application - + OK OK - + Would you like to exit now? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5573,7 +5573,7 @@ Screen. Japan - + Japón @@ -5588,12 +5588,12 @@ Screen. Australia - + Australia China - + China @@ -5603,7 +5603,7 @@ Screen. Taiwan - + Taiwán @@ -5720,12 +5720,12 @@ Screen. X: - + X: Y: - + Y: diff --git a/dist/languages/es_ES.ts b/dist/languages/es_ES.ts index f9dddfb3b..8e0bc876c 100644 --- a/dist/languages/es_ES.ts +++ b/dist/languages/es_ES.ts @@ -4241,12 +4241,12 @@ Por favor, compruebe la instalación de FFmpeg usada para la compilación. GMainWindow - + Warning Advertencia - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4260,506 +4260,506 @@ Al ejecutarse de esta forma, es posible que la aplicación carezca de ciertas fu Se recomienda ejecutar Azahar con el comando `open`, por ejemplo: `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. La velocidad de tráfico actual de Artic. Los valores altos indican una carga mayor de transferencia. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. La velocidad de emulación actual. Valores mayores o menores de 100% indican que la velocidad de emulación funciona más rápida o lentamente que en una 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Los fotogramas por segundo que está mostrando el juego. Variarán de aplicación en aplicación y de escena a escena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. El tiempo que lleva emular un fotograma de 3DS, sin tener en cuenta el limitador de fotogramas, ni la sincronización vertical. Para una emulación óptima, este valor no debe superar los 16.67 ms. - + Emulated notification LED LED de notificación emulada - + MicroProfile (unavailable) MicroProfile (no disponible) - + Clear Recent Files Limpiar Archivos Recientes - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar está ejecutando una aplicación - - + + Invalid App Format Formato de aplicación inválido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Tu formato de aplicación no es válido.<br/>Por favor, sigue las instrucciones para volver a volcar tus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartucho de juego</a> y/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Corrupted Aplicación corrupta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Tu aplicación está corrupta. <br/>Por favor, sigue las instrucciones para volver a volcar tus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de juego</a> y/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Encrypted Aplicación encriptada - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Tu aplicación está encriptada. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Por favor visita nuestro blog para más información.</a> - + Unsupported App Aplicación no soportada - + GBA Virtual Console is not supported by Azahar. Consola Virtual de GBA no está soportada por Azahar. - - + + Artic Server Servidor Artic - + Invalid system mode Modo de sistema no válido - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Las aplicaciones exclusivas de New 3DS no se pueden cargar sin activar el modo New 3DS. - + Error while loading App! ¡Error al cargar la aplicación! - + An unknown error occurred. Please see the log for more details. Un error desconocido ha ocurrido. Por favor, mira el log para más detalles. - + CIA must be installed before usage El CIA debe estar instalado antes de usarse - + Before using this CIA, you must install it. Do you want to install it now? Antes de usar este CIA, debes instalarlo. ¿Quieres instalarlo ahora? - + Quick Load Carga Rápida - + Quick Save Guardado Rápido - - + + Slot %1 Ranura %1 - + %2 %3 %2 %3 - + Quick Save - %1 Guardado Rápido - %1 - + Quick Load - %1 Carga Rápida - %1 - + Slot %1 - %2 %3 Ranura %1 - %2 %3 - + Error Opening %1 Folder Error al abrir la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Play Time Data Quitar Datos de Tiempo de Juego - + Reset play time? ¿Reiniciar tiempo de juego? - - - - + + + + Create Shortcut Crear atajo - + Do you want to launch the application in fullscreen? ¿Desea lanzar esta aplicación en pantalla completa? - + Successfully created a shortcut to %1 Atajo a %1 creado con éxito - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Ésto creará un atajo a la AppImage actual. Puede no funcionar bien si actualizas. ¿Continuar? - + Failed to create a shortcut to %1 Fallo al crear un atajo a %1 - + Create Icon Crear icono - + Cannot create icon file. Path "%1" does not exist and cannot be created. No se pudo crear un archivo de icono. La ruta "%1" no existe y no puede ser creada. - + Dumping... Volcando... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. No se pudo volcar el RomFS base. Compruebe el registro para más detalles. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The application properties could not be loaded. No se pudieron cargar las propiedades de la aplicación. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Ejecutable 3DS(%1);;Todos los archivos(*.*) - + Load File Cargar Archivo - - + + Set Up System Files Configurar Archivos de Sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necesita archivos de una consola real para poder utilizar algunas de sus funciones.<br>Puedes obtener los archivos con la <a href=https://github.com/azahar-emu/ArticSetupTool>herramienta de configuración Artic</a><br>Notas:<ul><li><b>Esta operación instalará archivos únicos de la consola en Azahar, ¡no compartas las carpetas de usuario ni nand<br>después de realizar el proceso de configuración!</b></li><li>Tras la configuración, Azahar se enlazará a la consola que ha ejecutado la herramienta de configuración. Puedes desvincular la<br>consola más tarde desde la pestaña "Archivos de sistema" del menú de opciones del emulador.</li><li>No te conectes en línea con Azahar y la consola 3DS al mismo tiempo después de configurar los archivos del sistema,<br>ya que esto podría causar problemas.</li><li>Se necesita la configuración de Old 3DS para que funcione la configuración de New 3DS (configurar ambos modos es recomendado).</li><li>Ambos modos de configuración funcionarán independientemente del modelo de la consola que ejecute la herramienta de configuración.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Introduce la dirección de la herramienta de configuración Artic - + <br>Choose setup mode: <br>Elige el modo de configuración: - + (ℹ️) Old 3DS setup (ℹ️) Configuración Old 3DS - - + + Setup is possible. La configuración es posible. - + (⚠) New 3DS setup (⚠) Configuración New 3DS - + Old 3DS setup is required first. La configuración Old 3DS es necesaria primero. - + (✅) Old 3DS setup (✅) Configuración Old 3DS - - + + Setup completed. Configuración completa. - + (ℹ️) New 3DS setup (ℹ️) Configuración New 3DS - + (✅) New 3DS setup (✅) Configuración New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Los archivos de sistema para el modo seleccionado ya están configurados. ¿Desea reinstalar los archivos de todas formas? - + Load Files Cargar archivos - + 3DS Installation File (*.cia *.zcia) Archivo de Instalación de 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Todos los archivos (*.*) - + Connect to Artic Base Conectar a Artic Base - + Enter Artic Base server address: Introduce la dirección del servidor Artic Base - + %1 has been installed successfully. %1 ha sido instalado con éxito. - + Unable to open File No se pudo abrir el Archivo - + Could not open %1 No se pudo abrir %1 - + Installation aborted Instalación interrumpida - + The installation of %1 was aborted. Please see the log for more details La instalación de %1 ha sido cancelada. Por favor, consulte los registros para más información. - + Invalid File Archivo no válido - + %1 is not a valid CIA %1 no es un archivo CIA válido - + CIA Encrypted CIA encriptado - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Tu archivo CIA está encriptado. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Por favor visita nuestro blog para más información.</a> - + Unable to find File No puede encontrar el archivo - + Could not find %1 No se pudo encontrar %1 - - - - + + + + Z3DS Compression Compresión Z3DS - + Failed to compress some files, check log for details. No se pudieron comprimir algunos archivos, mira el registro para más detalles. - + Failed to decompress some files, check log for details. No se pudieron descomprimir algunos archivos, mira el registro para más detalles. - + All files have been compressed successfully. Todos los archivos se han comprimido con éxito. - + All files have been decompressed successfully. Todos los archivos se han descomprimido con éxito. - + Uninstalling '%1'... Desinstalando '%1'... - + Failed to uninstall '%1'. Falló la desinstalación de '%1'. - + Successfully uninstalled '%1'. '%1' desinstalado con éxito. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + Savestates Estados - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4768,86 +4768,86 @@ Use at your own risk! ¡Úsalos bajo tu propio riesgo! - - - + + + Error opening amiibo data file Error al abrir los archivos de datos del Amiibo - + A tag is already in use. Ya está en uso una etiqueta. - + Application is not looking for amiibos. La aplicación no está buscando amiibos. - + Amiibo File (%1);; All Files (*.*) Archivo de Amiibo(%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Unable to open amiibo file "%1" for reading. No se pudo abrir el archivo del amiibo "%1" para su lectura. - + Record Movie Grabar Película - + Movie recording cancelled. Grabación de película cancelada. - - + + Movie Saved Película Guardada - - + + The movie is successfully saved. Película guardada con éxito. - + Application will unpause La aplicación se despausará - + The application will be unpaused, and the next frame will be captured. Is this okay? La aplicación se despausará, y el siguiente fotograma será capturado. ¿Estás de acuerdo? - + Invalid Screenshot Directory Directorio de capturas de pantalla no válido - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. No se puede crear el directorio de capturas de pantalla. La ruta de capturas de pantalla vuelve a su valor por defecto. - + Could not load video dumper No se pudo cargar el volcador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4860,265 +4860,265 @@ Para instalar FFmpeg en Azahar, pulsa Abrir y elige el directorio de FFmpeg. Para ver una guía sobre cómo instalar FFmpeg, pulsa Ayuda. - + Load 3DS ROM Files Cargar ROM de 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Archivos ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Archivo ROM 3DS comprimido (*.%1) - + Save 3DS Compressed ROM File Guardar archivo 3DS comprimido - + Select Output 3DS Compressed ROM Folder Seleccione la carpeta de salida comprimida del ROM 3DS - + Load 3DS Compressed ROM Files Cargar archivo 3DS comprimido - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Archivo ROM 3DS comprimido (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Archivo ROM 3DS (*.%1) - + Save 3DS ROM File Guardar archivo ROM 3DS - + Select Output 3DS ROM Folder Seleccione la carpeta de salida del ROM 3DS - + Select FFmpeg Directory Seleccionar Directorio FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Al directorio de FFmpeg indicado le falta %1. Por favor, asegúrese de haber seleccionado el directorio correcto. - + FFmpeg has been sucessfully installed. FFmpeg ha sido instalado con éxito. - + Installation of FFmpeg failed. Check the log file for details. La instalación de FFmpeg ha fallado. Compruebe el archivo del registro para más detalles. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. No se pudo empezar a grabar vídeo.<br>Asegúrese de que el encodeador de vídeo está configurado correctamente.<br>Para más detalles, observe el registro. - + Recording %1 Grabando %1 - + Playing %1 / %2 Reproduciendo %1 / %2 - + Movie Finished Película terminada - + (Accessing SharedExtData) (Accediendo al SharedExtData) - + (Accessing SystemSaveData) (Accediendo al SystemSaveData) - + (Accessing BossExtData) (Accediendo al BossExtData) - + (Accessing ExtData) (Accediendo al ExtData) - + (Accessing SaveData) (Accediendo al SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tráfico Artic: %1 %2%3 - + Speed: %1% Velocidad: %1% - + Speed: %1% / %2% Velocidad: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUMEN: SILENCIO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Falta %1. Por favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>vuelca tus archivos de sistema</a>.<br/>Continuar la emulación puede resultar en cuelgues y errores. - + A system archive Un archivo de sistema - + System Archive Not Found Archivo de Sistema no encontrado - + System Archive Missing Falta un Archivo de Sistema - + Save/load Error Error de guardado/carga - + Fatal Error Error Fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ha ocurrido un error fatal.<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Mira el log</a>para más detalles.<br/>Continuar la emulación puede resultar en cuelgues y errores. - + Fatal Error encountered Error Fatal encontrado - + Continue Continuar - + Quit Application Cerrar aplicación - + OK Aceptar - + Would you like to exit now? ¿Quiere salir ahora? - + The application is still running. Would you like to stop emulation? La aplicación sigue en ejecución. ¿Quiere parar la emulación? - + Playback Completed Reproducción Completada - + Movie playback completed. Reproducción de película completada. - + Update Available Actualización disponible - + Update %1 for Azahar is available. Would you like to download it? La actualización %1 de Azahar está disponible. ¿Quieres descargarla? - + Primary Window Ventana Primaria - + Secondary Window Ventana Secundaria diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index b9cdc140f..a2e26856e 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -4230,12 +4230,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Varoitus - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4245,590 +4245,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nykyinen emulaationopeus. Arvot yli tai ali 100% osoittavat, että emulaatio on nopeampi tai hitaampi kuin 3DS:än nopeus. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA pitää asenaa ennen käyttöä - + Before using this CIA, you must install it. Do you want to install it now? Ennen, kun voit käyttää tätä CIA:aa, sinun täytyy asentaa se. Haluatko asentaa sen nyt? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Virhe Avatessa %1 Kansio - - + + Folder does not exist! Kansio ei ole olemassa! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Peruuta - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Virhe avatessa %1 - + Select Directory Valitse hakemisto - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Lataa tiedosto - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Lataa tiedostoja - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Kaikki tiedostot (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 asennettiin onnistuneesti. - + Unable to open File Tiedostoa ei voitu avata - + Could not open %1 Ei voitu avata %1 - + Installation aborted Asennus keskeytetty - + The installation of %1 was aborted. Please see the log for more details - + Invalid File Sopimaton Tiedosto - + %1 is not a valid CIA %1 ei ole sopiva CIA-tiedosto - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Tiedostoa ei löytynyt - + File "%1" not found Tiedosto "%1" ei löytynyt. - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo tiedosto (%1);; Kaikki tiedostot (*.*) - + Load Amiibo Lataa Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Tallenna Video - + Movie recording cancelled. - - + + Movie Saved - - + + The movie is successfully saved. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4837,264 +4837,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Nopeus: %1% - + Speed: %1% / %2% Nopeus %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kuvaruutu: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found - + System Archive Missing - + Save/load Error - + Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Jatka - + Quit Application - + OK OK - + Would you like to exit now? Haluatko poistua nyt? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index df0a1e5d6..e7230a821 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -4241,12 +4241,12 @@ Veuillez vérifier votre installation FFmpeg utilisée pour la compilation. GMainWindow - + Warning Attention ! - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4261,506 +4261,506 @@ Il est recommandé de démarrer Azahar en utilisant la commande `open`, par exem `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Vitesse actuelle du trafic Artic. Des valeurs plus élevées indiquent des charges de transfert plus importantes. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Vitesse actuelle d'émulation. Les valeurs supérieures ou inférieures à 100% indiquent que l'émulation est plus rapide ou plus lente qu'une 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Nombre d'images par seconde affichées par l'application. Cela varie d'une application à l'autre et d'une scène à l'autre. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Temps nécessaire pour émuler une trame 3DS, sans compter la limitation de trame ou la synchronisation verticale V-Sync. Pour une émulation à pleine vitesse, cela ne devrait pas dépasser 16,67 ms. - + Emulated notification LED LED de notification émulée - + MicroProfile (unavailable) MicroProfile (indisponible) - + Clear Recent Files Effacer les fichiers récents - + &Continue &Continuer - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar exécute une application - - + + Invalid App Format Format d'application invalide - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Le format de votre application n'est pas pris en charge.<br/> Veuillez suivre les guides pour extraire à nouveau vos <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartouches de jeu</a> ou les <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titres installés</a>. - + App Corrupted Application corrompue - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Votre application est corrompue. <br/>Veuillez suivre les guides pour récupérer vos <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartouches de jeux</a> ou les <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titres installés</a>. - + App Encrypted Application encryptée - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Votre application est encryptée. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consultez notre blog pour plus d'informations.</a> - + Unsupported App Application non supportée - + GBA Virtual Console is not supported by Azahar. La console virtuelle de la GBA n'est pas prise en charge par Azahar. - - + + Artic Server Serveur Artic - + Invalid system mode Mode système invalide. - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Les applications exclusives New 3DS ne peuvent pas être chargées sans activer le mode New 3DS. - + Error while loading App! Erreur lors du chargement de l'application ! - + An unknown error occurred. Please see the log for more details. Une erreur inconnue s'est produite. Veuillez consulter le journal pour plus de détails. - + CIA must be installed before usage CIA doit être installé avant utilisation - + Before using this CIA, you must install it. Do you want to install it now? Avant d'utiliser ce CIA, vous devez l'installer. Voulez-vous l'installer maintenant ? - + Quick Load Chargement rapide - + Quick Save Sauvegarde rapide - - + + Slot %1 Emplacement %1 - + %2 %3 %2 %3 - + Quick Save - %1 Sauvegarde rapide - %1 - + Quick Load - %1 Chargement rapide - %1 - + Slot %1 - %2 %3 Emplacement %1 - %2 %3 - + Error Opening %1 Folder Erreur lors de l'ouverture du dossier %1 - - + + Folder does not exist! Le répertoire n'existe pas ! - + Remove Play Time Data Retirer les données de temps de jeu ? - + Reset play time? Réinitialiser le temps de jeu ? - - - - + + + + Create Shortcut Créer un raccourci - + Do you want to launch the application in fullscreen? Voulez-vous lancer l'application en plein écran ? - + Successfully created a shortcut to %1 Création réussie d'un raccourci vers %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Cela créera un raccourci vers l'AppImage actuelle. Il se peut que cela ne fonctionne pas bien si vous effectuez une mise à jour. Poursuivre ? - + Failed to create a shortcut to %1 Échec de la création d'un raccourci vers %1 - + Create Icon Créer icône - + Cannot create icon file. Path "%1" does not exist and cannot be created. Impossible de créer le fichier icône. Le chemin "%1" n'existe pas et ne peut pas être créé. - + Dumping... Extraction... - - + + Cancel Annuler - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Impossible d'extraire les RomFS de base. Référez-vous aux logs pour plus de détails. - + Error Opening %1 Erreur lors de l'ouverture de %1 - + Select Directory Sélectionner un répertoire - + Properties Propriétés - + The application properties could not be loaded. Les propriétés de l'application n'ont pas pu être chargées. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Exécutable 3DS (%1);;Tous les fichiers (*.*) - + Load File Charger un fichier - - + + Set Up System Files Configurer les fichiers système - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar a besoin des données et des fichiers de firmware propres à une console réelle pour pouvoir utiliser certaines de ses fonctionnalités.<br>Ces fichiers et données peuvent être configurés à l'aide de l'outil <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool.</a><br>Notes :<ul><li><b>Cette opération installera des données uniques à la console Azahar. Ne partagez pas vos dossiers utilisateur ou nand <br>après avoir effectué le processus d'installation !</b></li><li>Pendant le processus d'installation, Azahar se connectera à la console exécutant l'outil d'installation. Vous pourrez ensuite déconnecter la <br>console à partir de l'onglet Système dans le menu de configuration de l'émulateur.</li><li>Ne vous connectez pas à Internet avec Azahar et votre console 3DS en même temps après avoir configuré les fichiers système,<br> car cela pourrait causer des problèmes.</li><li>La configuration de l'ancienne 3DS est nécessaire pour que la configuration de la nouvelle 3DS fonctionne (il est recommandé d'effectuer les deux modes de configuration).</li><li>Les deux modes de configuration fonctionnent quel que soit le modèle de console sur lequel l'outil de configuration est exécuté.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Entrer l'adresse de l'outil de configuration Artic d'Azahar : - + <br>Choose setup mode: <br>Choisissez le mode de configuration : - + (ℹ️) Old 3DS setup (ℹ️) Configuration Old 3DS - - + + Setup is possible. La configuration est possible. - + (⚠) New 3DS setup (⚠) Configuration New 3DS - + Old 3DS setup is required first. La configuration Old 3DS est requise d'abord. - + (✅) Old 3DS setup (✅) Configuration Old 3DS - - + + Setup completed. Configuration terminée. - + (ℹ️) New 3DS setup (ℹ️) Configuration New 3DS - + (✅) New 3DS setup (✅) Configuration New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Les fichiers système pour le mode sélectionné sont déjà configurés. Voulez-vous les réinstaller quand même ? - + Load Files Charger des fichiers - + 3DS Installation File (*.cia *.zcia) Fichier d'installation 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tous les fichiers (*.*) - + Connect to Artic Base Se connecter à Artic Base - + Enter Artic Base server address: Entrez l'adresse du serveur Artic Base : - + %1 has been installed successfully. %1 a été installé avec succès. - + Unable to open File Impossible d'ouvrir le fichier - + Could not open %1 Impossible d'ouvrir %1 - + Installation aborted Installation annulée - + The installation of %1 was aborted. Please see the log for more details L'installation de %1 a été interrompue. Veuillez consulter les logs pour plus de détails. - + Invalid File Fichier invalide - + %1 is not a valid CIA %1 n'est pas un CIA valide - + CIA Encrypted CIA chiffré - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Votre fichier CIA est chiffré.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consultez notre blog pour plus d'informations.</a> - + Unable to find File Impossible de trouver le fichier - + Could not find %1 Impossible de trouver %1 - - - - + + + + Z3DS Compression Compression Z3DS - + Failed to compress some files, check log for details. Échec de la compression de certains fichiers, vérifiez le log pour plus de détails. - + Failed to decompress some files, check log for details. Échec de la décompression de certains fichiers, vérifiez le log pour plus de détails. - + All files have been compressed successfully. Tous les fichiers ont été compréssé avec succès. - + All files have been decompressed successfully. Tous les fichiers ont été décompréssé avec succès. - + Uninstalling '%1'... Désinstallation de '%1'... - + Failed to uninstall '%1'. Échec de la désinstallation de '%1'. - + Successfully uninstalled '%1'. Désinstallation de '%1' réussie. - + File not found Fichier non trouvé - + File "%1" not found Le fichier "%1" n'a pas été trouvé - + Savestates Points de récupération - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4769,86 +4769,86 @@ Use at your own risk! À utiliser à vos risques et périls ! - - - + + + Error opening amiibo data file Erreur d'ouverture du fichier de données amiibo - + A tag is already in use. Un tag est déjà en cours d'utilisation. - + Application is not looking for amiibos. L'application ne recherche pas d'amiibos. - + Amiibo File (%1);; All Files (*.*) Fichier Amiibo (%1);; Tous les fichiers (*.*) - + Load Amiibo Charger un Amiibo - + Unable to open amiibo file "%1" for reading. Impossible d'ouvrir le fichier amiibo "%1" pour le lire. - + Record Movie Enregistrer une vidéo - + Movie recording cancelled. Enregistrement de la vidéo annulé. - - + + Movie Saved Vidéo enregistrée - - + + The movie is successfully saved. La vidéo a été enregistrée avec succès. - + Application will unpause L'application sera rétablie. - + The application will be unpaused, and the next frame will be captured. Is this okay? L'application sera rétablie et l'image suivante sera capturée. Cela vous convient-il ? - + Invalid Screenshot Directory Répertoire des captures d'écran invalide - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Création du répertoire des captures d'écran spécifié impossible. Le chemin d'accès vers les captures d'écran est réinitialisé à sa valeur par défaut. - + Could not load video dumper Impossible de charger le module de capture vidéo. - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4861,265 +4861,265 @@ Pour installer FFmpeg sur Azahar, appuyez sur Ouvrir et sélectionnez votre rép Pour afficher un guide sur l'installation de FFmpeg, appuyez sur Aide. - + Load 3DS ROM Files Charger les fichiers ROM 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Fichiers ROM 3DS (*.cia *.cci *.3dsx *.cci *.3ds) - + 3DS Compressed ROM File (*.%1) Fichier ROM compressé 3DS (*.%1) - + Save 3DS Compressed ROM File Enregistrer le fichier ROM compressé 3DS - + Select Output 3DS Compressed ROM Folder Sélectionner le dossier de sortie des fichiers ROM 3DS compressés - + Load 3DS Compressed ROM Files Charger des fichiers ROM 3DS compréssés - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Fichiers ROM compressés 3DS (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Fichier ROM 3DS (*.%1) - + Save 3DS ROM File Enregistrer le fichier ROM 3DS - + Select Output 3DS ROM Folder Sélectionner le dossier de sortie des fichiers ROM 3DS - + Select FFmpeg Directory Sélectionnez le répertoire FFmpeg. - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Le répertoire FFmpeg fourni manque %1. Assurez-vous d'avoir sélectionné le répertoire correct. - + FFmpeg has been sucessfully installed. FFmpeg a été installé avec succès. - + Installation of FFmpeg failed. Check the log file for details. L'installation de FFmpeg a échoué. Consultez le fichier journal pour plus de détails. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Impossible de lancer le dump vidéo.<br>Veuillez vous assurer que l'encodeur vidéo est configuré correctement.<br>Reportez-vous au logs pour plus de détails. - + Recording %1 Enregistrement %1 - + Playing %1 / %2 Lecture de %1 / %2 - + Movie Finished Vidéo terminée - + (Accessing SharedExtData) (Accès à SharedExtData) - + (Accessing SystemSaveData) (Accès à SystemSaveData) - + (Accessing BossExtData) (Accès à BossExtData) - + (Accessing ExtData) (Accès à ExtData) - + (Accessing SaveData) (Accès à SaveData) - + MB/s Mo/s - + KB/s Ko/s - + Artic Traffic: %1 %2%3 Trafic Artic : %1 %2%3 - + Speed: %1% Vitesse : %1% - + Speed: %1% / %2% Vitesse : %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (CPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Trame : %1 ms - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME : %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 est manquant. Veuillez <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>vider les archives de votre système</a>. <br/>La poursuite de l'émulation peut entraîner des plantages et des bogues. - + A system archive Une archive système - + System Archive Not Found Archive système non trouvée - + System Archive Missing Archive système absente - + Save/load Error Erreur de sauvegarde/chargement - + Fatal Error Erreur fatale - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Une erreur fatale s'est produite. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Consultez le journal</a> pour plus de détails.<br/> La poursuite de l'émulation peut entraîner des plantages et des bogues. - + Fatal Error encountered Une erreur fatale s'est produite - + Continue Continuer - + Quit Application Quitter l'application - + OK OK - + Would you like to exit now? Voulez-vous quitter maintenant ? - + The application is still running. Would you like to stop emulation? L'application est toujours en cours d'exécution. Voulez-vous arrêter l'émulation ? - + Playback Completed Lecture terminée - + Movie playback completed. Lecture de la vidéo terminée. - + Update Available Mise à jour disponible - + Update %1 for Azahar is available. Would you like to download it? La mise à jour %1 pour Azahar est disponible. Souhaitez-vous la télécharger ? - + Primary Window Fenêtre principale - + Secondary Window Fenêtre secondaire diff --git a/dist/languages/hu_HU.ts b/dist/languages/hu_HU.ts index 40b6b90e3..fcfed2dfb 100644 --- a/dist/languages/hu_HU.ts +++ b/dist/languages/hu_HU.ts @@ -4229,12 +4229,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4244,590 +4244,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Jelenlegi emulációs sebesség. A 100%-nál nagyobb vagy kisebb értékek azt mutatják, hogy az emuláció egy 3DS-nél gyorsabban vagy lassabban fut. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Mennyi idő szükséges egy 3DS képkocka emulálásához, képkocka-limit vagy V-Syncet leszámítva. Teljes sebességű emulációnál ez maximum 16.67 ms-nek kéne lennie. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Legutóbbi fájlok törlése - + &Continue &Folytatás - + &Pause &Szünet - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 Foglalat %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Foglalat %1 - %2 %3 - + Error Opening %1 Folder Hiba %1 Mappa Megnyitásában - - + + Folder does not exist! A mappa nem létezik! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Kimentés... - - + + Cancel Mégse - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Hiba Indulás %1 - + Select Directory Könyvtár Kiválasztása - + Properties Tulajdonságok - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS állományok (%1);;Minden fájl (*.*) - + Load File Fájl Betöltése - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Fájlok Betöltése - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Minden fájl (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 sikeresen fel lett telepítve. - + Unable to open File A fájl megnyitása sikertelen - + Could not open %1 Nem lehet megnyitni: %1 - + Installation aborted Telepítés megszakítva - + The installation of %1 was aborted. Please see the log for more details %1 telepítése meg lett szakítva. Kérjük olvasd el a naplót több részletért. - + Invalid File Ismeretlen Fájl - + %1 is not a valid CIA %1 nem érvényes CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File A fájl nem található - + Could not find %1 %1 nem található - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1' eltávolítása... - + Failed to uninstall '%1'. '%1' eltávolítása sikertelen. - + Successfully uninstalled '%1'. '%1' sikeresen eltávolítva. - + File not found A fájl nem található - + File "%1" not found Fájl "%1" nem található - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo fájl (%1);; Minden fájl (*.*) - + Load Amiibo Amiibo betöltése - + Unable to open amiibo file "%1" for reading. - + Record Movie Film felvétele - + Movie recording cancelled. Filmfelvétel megszakítva. - - + + Movie Saved Film mentve - - + + The movie is successfully saved. A film sikeresen mentve. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4836,264 +4836,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory FFmpeg könyvtár kiválasztása - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. FFmpeg sikeresen telepítve. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Felvétel %1 - + Playing %1 / %2 Lejátszás %1 / %2 - + Movie Finished Film befejezve - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Sebesség: %1% - + Speed: %1% / %2% Sebesség: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Képkocka: %1 ms - + VOLUME: MUTE HANGERŐ: NÉMÍTVA - + VOLUME: %1% Volume percentage (e.g. 50%) HANGERŐ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Egy rendszerarchívum - + System Archive Not Found Rendszerarchívum Nem Található - + System Archive Missing - + Save/load Error Mentési/betöltési hiba - + Fatal Error Kritikus Hiba - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Végzetes hiba lépett fel - + Continue Folytatás - + Quit Application - + OK OK - + Would you like to exit now? Szeretnél most kilépni? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Elsődleges ablak - + Secondary Window Másodlagos ablak diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 069d14708..803f71028 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -4231,12 +4231,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Peringatan - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4246,590 +4246,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Kecepatan emulasi saat ini. Nilai yang lebih tinggi atau lebih rendah dari 100% menunjukan emulasi berjalan lebih cepat atau lebih lambat dari 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Waktu yang dibutuhkan untuk mengemulasi frame 3DS, tidak menghitung pembatasan frame atau v-sync. setidaknya emulasi yang tergolong kecepatan penuh harus berada setidaknya pada 16.67 ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Bersihkan Berkas File Terbaru - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA harus di install terlebih dahulu sebelum bisa di gunakan - + Before using this CIA, you must install it. Do you want to install it now? Sebelum memakai CIA ini kau harus memasangnya terlebih dahulu. Apa anda ingin menginstallnya sekarang? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Kesalahan Dalam Membuka Folder %1 - - + + Folder does not exist! Folder tidak ada! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Batal - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Kesalahan Dalam Membuka %1 - + Select Directory Pilih Direktori - + Properties Properti - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Muat File - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Muat berkas - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Semua File (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 telah terinstall. - + Unable to open File Tidak dapat membuka File - + Could not open %1 Tidak dapat membuka %1 - + Installation aborted Instalasi dibatalkan - + The installation of %1 was aborted. Please see the log for more details Instalasi %1 dibatalkan. Silahkan lihat file log untuk info lebih lanjut. - + Invalid File File yang tidak valid - + %1 is not a valid CIA %1 bukan CIA yang valid - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... Mencopot Pemasangan '%1'... - + Failed to uninstall '%1'. Gagal untuk mencopot pemasangan '%1%. - + Successfully uninstalled '%1'. - + File not found File tidak ditemukan - + File "%1" not found File "%1" tidak ditemukan - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Muat Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Rekam Video - + Movie recording cancelled. Perekaman Video Di Batalkan. - - + + Movie Saved Video Di Simpan - - + + The movie is successfully saved. Video telah berhasil di simpan. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4838,264 +4838,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Kecepatan: %1% - + Speed: %1% / %2% Kelajuan: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Sebuah arsip sistem - + System Archive Not Found Arsip Sistem Tidak Ditemukan - + System Archive Missing Arsip sistem tidak ada - + Save/load Error - + Fatal Error Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Galat fatal terjadi - + Continue Lanjut - + Quit Application - + OK OK - + Would you like to exit now? Apakah anda ingin keluar sekarang? - + The application is still running. Would you like to stop emulation? - + Playback Completed Pemutaran Kembali Telah Selesai - + Movie playback completed. Pemutaran kembali video telah selesai. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 29e7f3653..f1cd38ace 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -4239,12 +4239,12 @@ Verifica l'installazione di FFmpeg usata per la compilazione. GMainWindow - + Warning Attenzione - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4259,506 +4259,506 @@ Si consiglia invece di avviare Azahar utilizzando il comando `open`, ad esempio: `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Attuale velocità del traffico di Artic. Valori alti indicano carichi di trasferimento più grandi. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Velocità di emulazione corrente. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente di un 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Quanti frame al secondo l'app sta attualmente mostrando. Varierà da app ad app e da scena a scena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma del 3DS, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + Emulated notification LED LED notifche emulato - + MicroProfile (unavailable) MicroProfile (Non disponibile) - + Clear Recent Files Elimina file recenti - + &Continue &Continua - + &Pause &Pausa - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar sta eseguendo un'applicazione - - + + Invalid App Format Formato App non valido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Il formato dell'applicazione non è supportato.<br/>Segui la guida per effettuare il dump delle tue <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>schedine di gioco</a> o dei <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titoli installati</a>. - + App Corrupted App corrotta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. L'applicazione è corrotta. <br/>Segui la guida per effettuare il dump delle tue <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>schedine di gioco</a> o dei <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titoli installati</a>. - + App Encrypted App criptata - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> L'applicazione è criptata. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consulta il nostro blog per maggiori informazioni.</a> - + Unsupported App App non supportata - + GBA Virtual Console is not supported by Azahar. La Virtual Console GBA non è supportata da Azahar. - - + + Artic Server Artic Server - + Invalid system mode Modalità di sistema non valida - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Le applicazioni esclusive per New 3DS non possono essere avviate senza prima abilitare la modalità New 3DS. - + Error while loading App! Errore nel caricamento dell'app! - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - + CIA must be installed before usage Il CIA deve essere installato prima dell'uso - + Before using this CIA, you must install it. Do you want to install it now? Devi installare questo CIA prima di poterlo usare. Desideri farlo ora? - + Quick Load Carica salvataggio rapido - + Quick Save Salvataggio rapido - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Salvataggio rapido - %1 - + Quick Load - %1 Carica salvataggio rapido - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Errore nell'apertura della cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Play Time Data Rimuovi dati sul tempo di gioco - + Reset play time? Reimpostare il tempo di gioco? - - - - + + + + Create Shortcut Crea scorciatoia - + Do you want to launch the application in fullscreen? Vuoi avviare l'applicazione a schermo intero? - + Successfully created a shortcut to %1 Scorciatoia creata con successo in %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Verrà creata una scorciatoia all'attuale AppImage, che potrebbe non funzionare correttamente in caso di aggiornamento. Vuoi continuare? - + Failed to create a shortcut to %1 Impossibile creare scorciatoia in %1 - + Create Icon Crea icona - + Cannot create icon file. Path "%1" does not exist and cannot be created. Impossibile creare file icona. La cartella "%1" non esiste e non può essere creato. - + Dumping... Estrazione in corso... - - + + Cancel Annulla - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Impossibile estrarre la RomFS base. Consulta il log per i dettagli. - + Error Opening %1 Errore nell'apertura di %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The application properties could not be loaded. Impossibile caricare le proprietà dell'applicazione. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Eseguibile 3DS (%1);;Tutti i file (*.*) - + Load File Carica file - - + + Set Up System Files Configura i file di sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necessita di dati univoci della console e di file firmware da una console reale per poter utilizzare alcune delle sue funzionalità.<br>Tali file e dati possono essere configurati con <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Note:<ul><li><b>questa operazione installerà dati univoci della console su Azahar, non condividere le cartelle utente o nand<br>dopo aver eseguito il processo di configurazione!</b></li><li>Durante il processo di configurazione, Azahar si collegherà alla console che esegue lo strumento di configurazione. È possibile scollegare la console in un secondo momento dalla scheda Sistema nel menu di configurazione dell'emulatore.</li><li>Non andare online con Azahar e con la console 3DS contemporaneamente dopo aver configurato i file di sistema,<br>poiché potrebbe causare problemi.</li><li>La vecchia configurazione 3DS è necessaria affinché la nuova configurazione 3DS funzioni (si consiglia di eseguire entrambe le modalità di configurazione).</li><li>Entrambe le modalità di configurazione funzioneranno indipendentemente dal modello della console che esegue lo strumento di configurazione.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Inserisci l'indirizzo di Artic Setup Tool: - + <br>Choose setup mode: <br>Scegli la modalità di configurazione: - + (ℹ️) Old 3DS setup (ℹ️) Configurazione Old 3DS - - + + Setup is possible. La configurazione è possibile. - + (⚠) New 3DS setup (⚠) Configurazione New 3DS - + Old 3DS setup is required first. È necessario eseguire prima la configurazione Old 3DS. - + (✅) Old 3DS setup (✅) Configurazione Old 3DS - - + + Setup completed. Configurazione completata. - + (ℹ️) New 3DS setup (ℹ️) Configurazione New 3DS - + (✅) New 3DS setup (✅) Configurazione New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? I file di sistema per la modalità selezionata sono già stati configurati. Vuoi comunque reinstallarli? - + Load Files Carica file - + 3DS Installation File (*.cia *.zcia) File di installazione 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tutti i file (*.*) - + Connect to Artic Base Connettiti ad Artic Base - + Enter Artic Base server address: Inserisci l'indirizzo del server Artic Base: - + %1 has been installed successfully. %1 è stato installato con successo. - + Unable to open File Impossibile aprire il file - + Could not open %1 Impossibile aprire %1 - + Installation aborted Installazione annullata - + The installation of %1 was aborted. Please see the log for more details L'installazione di %1 è stata annullata. Visualizza il log per maggiori dettagli. - + Invalid File File non valido - + %1 is not a valid CIA %1 non è un CIA valido - + CIA Encrypted File CIA criptato - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Il file CIA è criptato. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consulta il nostro blog per maggiori informazioni.</a> - + Unable to find File Impossibile trovare il file - + Could not find %1 Impossibile trovare %1 - - - - + + + + Z3DS Compression Compressione Z3DS - + Failed to compress some files, check log for details. Impossibile comprimere alcuni file, controllare il log per i dettagli. - + Failed to decompress some files, check log for details. Impossibile decomprimere alcuni file, controllare il log per i dettagli. - + All files have been compressed successfully. Tutti i file sono stati compressi con successo. - + All files have been decompressed successfully. Tutti i file sono stati decompressi con successo. - + Uninstalling '%1'... Disinstallazione di "%1" in corso... - + Failed to uninstall '%1'. Errore nella disinstallazione di "%1". - + Successfully uninstalled '%1'. "%1" è stato disinstallato con successo. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + Savestates Stati salvati - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4767,86 +4767,86 @@ Use at your own risk! Usali a tuo rischio e pericolo. - - - + + + Error opening amiibo data file Errore durante l'apertura dell'amiibo. - + A tag is already in use. Un tag è già in uso. - + Application is not looking for amiibos. L'applicazione non sta cercando alcun amiibo. - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Unable to open amiibo file "%1" for reading. Impossibile leggere il file amiibo "%1". - + Record Movie Registra filmato - + Movie recording cancelled. Registrazione del filmato annullata. - - + + Movie Saved Filmato salvato - - + + The movie is successfully saved. Filmato salvato correttamente. - + Application will unpause L'applicazione riprenderà - + The application will be unpaused, and the next frame will be captured. Is this okay? L'applicazione riprenderà, e il prossimo frame verrà catturato. Va bene? - + Invalid Screenshot Directory Cartella degli screenshot non valida - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Impossibile creare la cartella degli screenshot specificata. Il percorso è stato ripristinato a quello predefinito. - + Could not load video dumper Impossibile caricare l'estrattore del video - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4859,265 +4859,265 @@ Per installare FFmpeg su Azahar, clicca su Apri e seleziona la cartella di FFmpe Per istruzioni su come installare FFmpeg, clicca su Aiuto. - + Load 3DS ROM Files Carica file ROM 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) File ROM 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) File ROM 3DS compresso (*.%1) - + Save 3DS Compressed ROM File Salva file ROM 3DS compresso - + Select Output 3DS Compressed ROM Folder Seleziona la cartella di destinazione delle ROM 3DS compresse - + Load 3DS Compressed ROM Files Carica file ROM 3DS compressi - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) File ROM 3DS compresso (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) File ROM 3DS (*.%1) - + Save 3DS ROM File Salva file ROM 3DS - + Select Output 3DS ROM Folder Seleziona la cartella di destinazione delle ROM 3DS - + Select FFmpeg Directory Seleziona la cartella di installazione di FFmpeg. - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. La cartella di FFmpeg selezionata non contiene %1. Assicurati di aver selezionato la cartella corretta. - + FFmpeg has been sucessfully installed. FFmpeg è stato installato con successo. - + Installation of FFmpeg failed. Check the log file for details. Installazione di FFmpeg fallita. Consulta i file di log per maggiori dettagli. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Impossibile iniziare il dumping video.<br> Assicurati che l'encoder video sia configurato correttamente. <br>Controlla il log per ulteriori dettagli. - + Recording %1 Registrazione in corso (%1) - + Playing %1 / %2 Riproduzione in corso (%1 / %2) - + Movie Finished Filmato terminato - + (Accessing SharedExtData) (Accessing SharedExtData) - + (Accessing SystemSaveData) (Accessing SystemSaveData) - + (Accessing BossExtData) (Accessing BossExtData) - + (Accessing ExtData) (Accessing ExtData) - + (Accessing SaveData) (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Traffico Artic: %1 %2%3 - + Speed: %1% Velocità: %1% - + Speed: %1% / %2% Velocità: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 non trovato. <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>Estrai i tuoi archivi di sistema</a>.<br/>Proseguendo l'emulazione si potrebbero verificare arresti anomali e bug. - + A system archive Un archivio di sistema - + System Archive Not Found Archivio di sistema non trovato - + System Archive Missing Archivio di sistema mancante - + Save/load Error Errore di salvataggio/caricamento - + Fatal Error Errore irreversibile - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Si è verificato un errore fatale. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Controlla il log</a> per i dettagli.<br/>Continuare l'emulazione potrebbe causare arresti anomali e bug. - + Fatal Error encountered Errore irreversibile riscontrato - + Continue Continua - + Quit Application Chiudi applicazione - + OK OK - + Would you like to exit now? Desideri uscire ora? - + The application is still running. Would you like to stop emulation? L'applicazione è ancora in esecuzione. Vuoi arrestare l'emulazione? - + Playback Completed Riproduzione completata - + Movie playback completed. Riproduzione del filmato completata. - + Update Available Aggiornamento disponibile - + Update %1 for Azahar is available. Would you like to download it? L'aggiornamento %1 di Azahar è disponibile. Vuoi installarlo? - + Primary Window Finestra principale - + Secondary Window Finestra secondaria diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 03c4417e6..7d636cac6 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -4237,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 警告 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4252,591 +4252,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 現在のエミュレーション速度です。100%以外の値は、エミュレーションが3DS実機より高速または低速で行われていることを表します。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 3DSフレームをエミュレートするのにかかった時間です。フレームリミットや垂直同期の有効時にはカウントしません。フルスピードで動作させるには16.67ms以下に保つ必要があります。 - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files 最近のファイルを消去 - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> このアプリは暗号化されています。<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>ブログで詳細な情報を確認してください。</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. GBAバーチャルコンソールはAzaharではサポートされていません。 - - + + Artic Server Artic Base - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. 不明なエラーが発生しました. 詳細はログを参照してください. - + CIA must be installed before usage CIAを使用前にインストールする必要有 - + Before using this CIA, you must install it. Do you want to install it now? CIAを使用するには先にインストールを行う必要があります。今すぐインストールしますか? - + Quick Load - + Quick Save - - + + Slot %1 スロット %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder フォルダ %1 を開く際のエラー - - + + Folder does not exist! フォルダが見つかりません! - + Remove Play Time Data プレイ時間のデータを削除 - + Reset play time? プレイ時間をリセットしますか? - - - - + + + + Create Shortcut ショートカットを作成する - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 %1にショートカットを作成しました。 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... ダンプ中... - - + + Cancel キャンセル - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. ベースRomFSをダンプできませんでした。 詳細はログを参照してください。 - + Error Opening %1 %1 を開く際のエラー - + Select Directory 3DSのROMがあるフォルダを選択 - + Properties プロパティ - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS実行ファイル (%1);;すべてのファイル (*.*) - + Load File ゲームファイルの読み込み - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files ファイルの読み込み - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) すべてのファイル (*.*) - + Connect to Artic Base Arctic Baseに接続 - + Enter Artic Base server address: - + %1 has been installed successfully. %1が正常にインストールされました - + Unable to open File ファイルを開けません - + Could not open %1 %1を開くことができませんでした - + Installation aborted インストール中止 - + The installation of %1 was aborted. Please see the log for more details %1のインストールは中断されました。詳細はログを参照してください - + Invalid File 無効なファイル - + %1 is not a valid CIA %1は有効なCIAではありません - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File ファイルが見つかりません - + Could not find %1 %1を見つけられませんでした - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1'をアンインストールしています - + Failed to uninstall '%1'. '%1' をアンインストールできませんでした - + Successfully uninstalled '%1'. - + File not found ファイルなし - + File "%1" not found ファイル%1が見つかりませんでした - + Savestates ステートセーブ - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiiboファイル (%1);; すべてのファイル (*.*) - + Load Amiibo Amiiboを読込 - + Unable to open amiibo file "%1" for reading. - + Record Movie 操作を記録 - + Movie recording cancelled. 操作の記録がキャンセルされました - - + + Movie Saved 保存成功 - - + + The movie is successfully saved. 操作記録を保存しました - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4845,264 +4845,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% スピード:%1% - + Speed: %1% / %2% スピード:%1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms フレーム:%1 ms - + VOLUME: MUTE 音量: ミュート - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive システムアーカイブ - + System Archive Not Found システムアーカイブなし - + System Archive Missing システムアーカイブが見つかりません - + Save/load Error セーブ/ロード エラー - + Fatal Error 致命的なエラー - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered 致命的なエラーが発生しました - + Continue 続行 - + Quit Application - + OK OK - + Would you like to exit now? 今すぐ終了しますか? - + The application is still running. Would you like to stop emulation? - + Playback Completed 再生完了 - + Movie playback completed. 操作記録の再生が完了しました - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 130faa83d..8348c52fc 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -4233,12 +4233,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 경고 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4248,591 +4248,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 현재 에뮬레이션 속도. 100%보다 높거나 낮은 값은 에뮬레이션이 3DS보다 빠르거나 느린 것을 나타냅니다. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 3DS 프레임을 에뮬레이션 하는 데 걸린 시간, 프레임제한 또는 v-동기화를 카운트하지 않음. 최대 속도 에뮬레이션의 경우, 이는 최대 16.67 ms여야 합니다. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files 최근 파일 삭제 - + &Continue 계속(&C) - + &Pause 일시중지(&P) - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조하십시오. - + CIA must be installed before usage CIA를 사용하기 전에 설치되어야 합니다 - + Before using this CIA, you must install it. Do you want to install it now? 이 CIA를 사용하기 전에 설치해야합니다. 지금 설치 하시겠습니까? - + Quick Load - + Quick Save - - + + Slot %1 슬롯 %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 슬롯 %1 - %2 %3 - + Error Opening %1 Folder %1 폴더 열기 오류 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... 덤프중... - - + + Cancel 취소 - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. 베이스 RomFS를 덤프 할 수 없습니다. 자세한 내용은 로그를 참조하십시오. - + Error Opening %1 %1 열기 오류 - + Select Directory 디렉터리 선택하기 - + Properties 속성 - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 실행파일 (%1);;모든파일 (*.*) - + Load File 파일 불러오기 - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files 파일 불러오기 - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) 모든파일 (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1가 성공적으로 설치되었습니다. - + Unable to open File 파일을 열 수 없음 - + Could not open %1 %1을(를) 열 수 없음 - + Installation aborted 설치 중단됨 - + The installation of %1 was aborted. Please see the log for more details %1의 설치가 중단되었습니다. 자세한 내용은 로그를 참조하십시오. - + Invalid File 올바르지 않은 파일 - + %1 is not a valid CIA %1은 올바른 CIA가 아닙니다 - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File 파일을 찾을 수 없음 - + Could not find %1 1을(를) 찾을 수 없습니다 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + Savestates 상태저장(Savestates) - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Amiibo 데이터 파일 열기 오류 - + A tag is already in use. 태그가 이미 사용중입니다. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo 파일 (%1);; 모든파일 (*.*) - + Load Amiibo Amiibo 불러오기 - + Unable to open amiibo file "%1" for reading. Amiibo 파일 "%1"을 읽을 수 없습니다. - + Record Movie 무비 녹화 - + Movie recording cancelled. 무비 레코딩이 취소되었습니다. - - + + Movie Saved 무비 저장됨 - - + + The movie is successfully saved. 무비가 성공적으로 저장되었습니다 - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory 올바르지 않은 스크린숏 디렉터리 - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. 지정된 스크린숏 디렉터리를 생성할 수 없습니다. 스크린숏 경로가 기본값으로 다시 설정됩니다. - + Could not load video dumper 비디오 덤퍼를 불러올 수 없습니다 - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4841,264 +4841,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory FFmpeg 디렉토리 선택 - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. 제공된 FFmpeg 디렉토리에 %1이 없습니다. 올바른 디렉토리가 선택되었는지 확인하십시오. - + FFmpeg has been sucessfully installed. FFmpeg가 성공적으로 설치되었습니다. - + Installation of FFmpeg failed. Check the log file for details. FFmpeg 설치에 실패했습니다. 자세한 내용은 로그 파일을 확인하십시오. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 %1 녹화 중 - + Playing %1 / %2 %1 / %2 재생 중 - + Movie Finished 무비 완료됨 - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% 속도: %1% - + Speed: %1% / %2% 속도: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms 프레임: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive 시스템 아카이브 - + System Archive Not Found 시스템 아카이브를 찾을수 없습니다 - + System Archive Missing 시스템 아카이브가 없습니다 - + Save/load Error 저장하기/불러오기 오류 - + Fatal Error 치명적인 오류 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered 치명적인 오류가 발생했습니다 - + Continue 계속 - + Quit Application - + OK 확인 - + Would you like to exit now? 지금 종료하시겠습니까? - + The application is still running. Would you like to stop emulation? - + Playback Completed 재생 완료 - + Movie playback completed. 무비 재생 완료 - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window 첫번째 윈도우 - + Secondary Window 두번째 윈도우 diff --git a/dist/languages/lt_LT.ts b/dist/languages/lt_LT.ts index 642822281..226016cd8 100644 --- a/dist/languages/lt_LT.ts +++ b/dist/languages/lt_LT.ts @@ -4228,12 +4228,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Įspėjimas - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4243,590 +4243,590 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Dabartinės emuliacijos greitis. Reikšmės žemiau ar aukščiau 100% parodo, kad emuliacija veikia greičiau ar lėčiau negu 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Laikas, kuris buvo sunaudotas atvaizduoti 1 3DS kadrą, neskaičiuojant FPS ribojimo ar V-Sync. Pilno greičio emuliacijai reikalinga daugiausia 16.67 ms reikšmė. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Pravalyti neseniai įkrautus failus - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Klaida atidarant %1 aplanką - - + + Folder does not exist! Aplankas neegzistuoja! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Atšaukti - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Klaida atidarant %1 - + Select Directory Pasirinkti katalogą - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS programa (%1);;Visi failai (*.*) - + Load File Įkrauti failą - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Įkrauti failus - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Visi failai (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 buvo įdiegtas sėkmingai. - + Unable to open File Negalima atverti failo - + Could not open %1 Nepavyko atverti %1 - + Installation aborted Instaliacija nutraukta - + The installation of %1 was aborted. Please see the log for more details Failo %1 instaliacija buvo nutraukta. Pasižiūrėkite į žurnalą dėl daugiau informacijos - + Invalid File Klaidingas failas - + %1 is not a valid CIA %1 nėra tinkamas CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Failas nerastas - + File "%1" not found Failas "%1" nerastas - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) „Amiibo“ failas (%1);; Visi failai (*.*) - + Load Amiibo Įkrauti „Amiibo“ - + Unable to open amiibo file "%1" for reading. - + Record Movie Įrašyti įvesčių vaizdo įrašą - + Movie recording cancelled. Įrašo įrašymas nutrauktas. - - + + Movie Saved Įrašas išsaugotas - - + + The movie is successfully saved. Filmas sėkmingai išsaugotas. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4835,264 +4835,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Greitis: %1% - + Speed: %1% / %2% Greitis: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kadras: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found Sisteminis archyvas nerastas - + System Archive Missing - + Save/load Error - + Fatal Error Nepataisoma klaida - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Tęsti - + Quit Application - + OK Gerai - + Would you like to exit now? Ar norite išeiti? - + The application is still running. Would you like to stop emulation? - + Playback Completed Atkūrimas užbaigtas - + Movie playback completed. Įrašo atkūrimas užbaigtas. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 0201038ca..ba44001e0 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -4231,12 +4231,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Varsel - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4246,591 +4246,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nåværende emuleringhastighet. Verdier høyere eller lavere enn 100% indikerer at emuleringen kjører raskere eller langsommere enn en 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid tatt for å emulere et 3DS bilde, gjelder ikke bildebegrensning eller V-Sync. For raskest emulering bør dette være høyst 16,67 ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Tøm nylige filer - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted App Korrupt - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted App Kryptert - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App Ustøttet App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA må installeres før bruk - + Before using this CIA, you must install it. Do you want to install it now? Før du bruker denne CIA, må du installere den. Vil du installere det nå? - + Quick Load - + Quick Save - - + + Slot %1 Spor %1 - + %2 %3 %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Feil ved Åpning av %1 Mappe - - + + Folder does not exist! Mappen eksistere ikke! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Lag Ikon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dumper... - - + + Cancel Kanseller - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Kunne ikke dumpe basen RomFS. Se loggen for detaljer. - + Error Opening %1 Feil ved åpning av %1 - + Select Directory Velg Mappe - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Executable (%1);;All Files (*.*) - + Load File Last Fil - - + + Set Up System Files Set Opp Systemfiler - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Last Filer - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle Filer (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 Ble installert vellykket. - + Unable to open File Kan ikke åpne Fil - + Could not open %1 Kunne ikke åpne %1 - + Installation aborted Installasjon avbrutt - + The installation of %1 was aborted. Please see the log for more details Installeringen av %1 ble avbrutt. Vennligst se logg for detaljer - + Invalid File Ugyldig Fil - + %1 is not a valid CIA %1 er ikke en gyldig CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Fil ikke funnet - + File "%1" not found Fil "%1" ble ikke funnet - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo File (%1);; All Files (*.*) - + Load Amiibo Last inn Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Ta Opp Video - + Movie recording cancelled. Filmopptak avbrutt. - - + + Movie Saved Film Lagret - - + + The movie is successfully saved. Filmen ble lagret vellykket. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4839,264 +4839,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files Last 3DS ROM Filer - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Fart: %1% - + Speed: %1% / %2% Fart: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Bilde: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Et System Arkiv - + System Archive Not Found System Arkiv ikke funnet - + System Archive Missing System Arkiv Mangler - + Save/load Error Lagre/laste inn Feil - + Fatal Error Fatal Feil - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Fatal Feil Oppstått - + Continue Fortsett - + Quit Application - + OK OK - + Would you like to exit now? Vil du avslutte nå? - + The application is still running. Would you like to stop emulation? - + Playback Completed Avspilling Fullført - + Movie playback completed. Filmavspilling fullført. - + Update Available Oppdatering Tilgjengelig - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index d94d925f0..ffee36444 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -4233,12 +4233,12 @@ Controleer de FFmpeg-installatie die wordt gebruikt voor de compilatie. GMainWindow - + Warning Waarschuwing - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4248,591 +4248,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Huidige emulatiesnelheid. Waardes hoger of lager dan 100% geven aan dat de emulatie sneller of langzamer gaat dan een 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tijd verstrekt om één 3DS frame te emuleren, zonder framelimitatie of V-Sync te tellen. Voor volledige snelheid emulatie zal dit maximaal 16.67 ms moeten zijn. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Wis recente bestanden - + &Continue &Continue - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. Er heeft zich een onbekende fout voorgedaan. Raadpleeg het log voor meer informatie. - + CIA must be installed before usage CIA moet worden geïnstalleerd voor gebruik - + Before using this CIA, you must install it. Do you want to install it now? Voordat u deze CIA kunt gebruiken, moet u hem installeren. Wilt u het nu installeren? - + Quick Load - + Quick Save - - + + Slot %1 Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Fout bij het openen van de map %1 - - + + Folder does not exist! Map bestaat niet! - + Remove Play Time Data Verwijder speeltijd gegevens - + Reset play time? Stel speeltijd opnieuw in? - - - - + + + + Create Shortcut Snelkoppeling maken - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 Het maken van een snelkoppeling naar %1 was succesvol - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Dit zal een snelkoppeling naar het huidige AppImage aanmaken. Dit zal mogelijk niet meer werken als u deze software bijwerkt. Wilt u doorgaan? - + Failed to create a shortcut to %1 Kon geen snelkoppeling naar %1 aanmaken - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dumping... - - + + Cancel Annuleren - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Kon basis RomFS niet dumpen. Raadpleeg het log voor meer informatie. - + Error Opening %1 Fout bij het openen van %1 - + Select Directory Selecteer Folder - + Properties Eigenschappen - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Executable (%1);;Alle bestanden (*.*) - + Load File Laad bestand - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Laad Bestanden - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle bestanden (*.*) - + Connect to Artic Base Verbind met Artic Base - + Enter Artic Base server address: Voer Artic Base server adres in: - + %1 has been installed successfully. %1 is succesvol geïnstalleerd. - + Unable to open File Kan bestand niet openen - + Could not open %1 Kan %1 niet openen - + Installation aborted Installatie onderbroken - + The installation of %1 was aborted. Please see the log for more details De installatie van %1 is afgebroken. Zie het logboek voor meer details - + Invalid File Ongeldig bestand - + %1 is not a valid CIA %1 is geen geldige CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Bestand niet gevonden - + Could not find %1 Kon %1 niet vinden - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1' aan het verwijderen... - + Failed to uninstall '%1'. Kon niet '%1' verwijderen. - + Successfully uninstalled '%1'. '%1' succesvol verwijderd. - + File not found Bestand niet gevonden - + File "%1" not found Bestand "%1" niet gevonden - + Savestates Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Fout bij het openen van het amiibo databestand - + A tag is already in use. Er is al een tag in gebruik. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo Bestand (%1);; Alle Bestanden (*.*) - + Load Amiibo Laad Amiibo - + Unable to open amiibo file "%1" for reading. Kan amiibo-bestand "%1" niet openen om te worden gelezen. - + Record Movie Film opnemen - + Movie recording cancelled. Filmopname geannuleerd. - - + + Movie Saved Film Opgeslagen - - + + The movie is successfully saved. De film is met succes opgeslagen. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Ongeldige schermafbeeldmap - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Kan de opgegeven map voor schermafbeeldingen niet maken. Het pad voor schermafbeeldingen wordt teruggezet naar de standaardwaarde. - + Could not load video dumper Kan videodumper niet laden - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4841,264 +4841,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory Selecteer FFmpeg map - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. De opgegeven FFmpeg directory ontbreekt %1. Controleer of de juiste map is geselecteerd. - + FFmpeg has been sucessfully installed. FFmpeg is met succes geïnstalleerd. - + Installation of FFmpeg failed. Check the log file for details. Installatie van FFmpeg is mislukt. Controleer het logbestand voor meer informatie. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Opname %1 - + Playing %1 / %2 Afspelen %1 / %2 - + Movie Finished Film Voltooid - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Snelheid: %1% - + Speed: %1% / %2% Snelheid: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUME: STIL - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Een systeemarchief - + System Archive Not Found Systeem archief niet gevonden - + System Archive Missing Systeemarchief ontbreekt - + Save/load Error Opslaan/Laad fout - + Fatal Error Fatale Fout - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Fatale fout opgetreden - + Continue Doorgaan - + Quit Application - + OK OK - + Would you like to exit now? Wilt u nu afsluiten? - + The application is still running. Would you like to stop emulation? - + Playback Completed Afspelen voltooid - + Movie playback completed. Film afspelen voltooid. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Primaire venster - + Secondary Window Secundair venster diff --git a/dist/languages/pl_PL.ts b/dist/languages/pl_PL.ts index 11c0f31ec..c926c4b45 100644 --- a/dist/languages/pl_PL.ts +++ b/dist/languages/pl_PL.ts @@ -4241,12 +4241,12 @@ Sprawdź instalację FFmpeg używaną do kompilacji. GMainWindow - + Warning Ostrzeżenie - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4261,506 +4261,506 @@ Zaleca się uruchamianie Azahar za pomocą polecenia "open”, np.: "open ./Azahar.app” - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Bieżąca prędkość ruchu Artic Base. Wyższe wartości oznaczają większe obciążenia transferowe. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Obecna szybkość emulacji. Wartości większe lub mniejsze niż 100 % oznaczają, że emulacja jest szybsza lub wolniejsza niż 3DS - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Jak wiele klatek na sekundę aplikacja wyświetla w tej chwili. Ta wartość będzie się różniła między aplikacji, jak również między scenami w aplikacji. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny do emulacji klatki 3DS, nie zawiera limitowania klatek oraz v-sync. Dla pełnej prędkości emulacji, wartość nie powinna przekraczać 16.67 ms. - + Emulated notification LED - + MicroProfile (unavailable) MicroProfile (niedostępne) - + Clear Recent Files Wyczyść Ostatnio Używane - + &Continue &Kontynuuj - + &Pause &Wstrzymaj - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar jest w trakcie uruchamiania aplikację - - + + Invalid App Format Nieprawidłowy format aplikacji - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Twój format aplikacji nie jest obsługiwany.<br/>Postępuj zgodnie z instrukcjami, aby ponownie zrzucić <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>kartridże z grami</a> lub <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>zainstalowane tytuły</a>. - + App Corrupted Aplikacja jest uszkodzona - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Twoja aplikacja jest uszkodzona. <br/>Postępuj zgodnie z instrukcjami, aby ponownie zrzucić <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>kartridże z grami</a> lub <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>zainstalowane tytuły</a>. - + App Encrypted Aplikacja jest zaszyfrowana - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Twoja aplikacja jest zaszyfrowana. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji można znaleźć na naszym blogu.</a> - + Unsupported App Nieobsługiwana aplikacja - + GBA Virtual Console is not supported by Azahar. Wirtualnej konsola GBA nie są obsługiwana przez Azahar. - - + + Artic Server Serwer Artic - + Invalid system mode Nieprawidłowy moduł systemu - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Aplikacje dostępne wyłącznie na konsoli New 3DS nie mogą być uruchamiane bez włączenia trybu New 3DS. - + Error while loading App! Błąd podczas ładowania aplikacji! - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w logu. - + CIA must be installed before usage CIA musi być zainstalowana przed użyciem - + Before using this CIA, you must install it. Do you want to install it now? Przed użyciem CIA należy ją zainstalować. Czy chcesz zainstalować ją teraz? - + Quick Load Szybkie wczytywanie - + Quick Save Szybkie zapisywanie - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Szybkie zapisywanie - %1 - + Quick Load - %1 Szybkie wczytywanie - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Play Time Data Usuń dane czasu odtwarzania - + Reset play time? Zresetować czas gry? - - - - + + + + Create Shortcut Utwórz skrót - + Do you want to launch the application in fullscreen? Czy chcesz uruchomić aplikacje na pełnym ekranie? - + Successfully created a shortcut to %1 Pomyślnie utworzono skrót do %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Spowoduje to utworzenie skrótu do bieżącego obrazu aplikacji. Może to nie działać dobrze po aktualizacji. Kontynuować? - + Failed to create a shortcut to %1 Nie udało się utworzyć skrótu do %1 - + Create Icon Stwórz ikonę - + Cannot create icon file. Path "%1" does not exist and cannot be created. Nie można utworzyć pliku ikony. Ścieżka "%1" nie istnieje i nie można jej utworzyć. - + Dumping... Zrzucanie... - - + + Cancel Anuluj - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Nie można zrzucić podstawowego RomFS. Szczegółowe informacje można znaleźć w logu. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz Folder - + Properties Właściwości - + The application properties could not be loaded. Nie można wczytać właściwości aplikacji. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Pliki wykonywalne 3DS (%1);;Wszystkie pliki (*.*) - + Load File Załaduj Plik - - + + Set Up System Files Konfiguracja plików systemowych - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar potrzebuje plików z rzeczywistej konsoli, aby móc korzystać z niektórych jej funkcji.<br>Możesz uzyskać te pliki za pomocą <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Uwagi:<ul><li><b>Ta operacja zainstaluje unikalne pliki konsoli do Azahar, nie udostępniaj swoich folderów użytkownika lub nand<br>po wykonaniu procesu konfiguracji!</b></li><li>Podczas procesu konfiguracji Azahar połączy się z konsolą, na której uruchomione jest narzędzie instalacyjne.<br>Konsolę można później odłączyć w zakładce System w menu konfiguracji emulatora.</li><li>Nie korzystaj jednocześnie z Azahar i konsoli 3DS po skonfigurowaniu plików systemowych,<br>bo może to spowodować błędy. </li><li>Old 3DS jest wymagany do działania konfiguracji New 3DS (zalecane jest wykonanie obu tych konfiguracji).</li><li>Oba tryby konfiguracji będą działać niezależnie od modelu konsoli, na której uruchomiono narzędzie konfiguracyjne.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Wprowadź adres narzędzia konfiguracyjnego Azahar Artic: - + <br>Choose setup mode: <br>Wybierz tryb konfiguracji: - + (ℹ️) Old 3DS setup (ℹ️) Konfiguracja Old 3DS - - + + Setup is possible. Konfiguracja jest możliwa. - + (⚠) New 3DS setup (⚠) Konfiguracja New 3DS - + Old 3DS setup is required first. Najpierw wymagana jest konfiguracja Old 3DS. - + (✅) Old 3DS setup (✅) Konfiguracja Old 3DS - - + + Setup completed. Konfiguracja została zakończona. - + (ℹ️) New 3DS setup (ℹ️) Konfiguracja New 3DS - + (✅) New 3DS setup (✅) Konfiguracja New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Pliki systemowe dla wybranego trybu są już skonfigurowane. Czy mimo to chcesz ponownie zainstalować pliki? - + Load Files Załaduj Pliki - + 3DS Installation File (*.cia *.zcia) Plik Instalacyjny 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Wszystkie Pliki (*.*) - + Connect to Artic Base Połącz z Artic Base - + Enter Artic Base server address: Wprowadź adres serwera Artic Base: - + %1 has been installed successfully. %1 został poprawnie zainstalowany. - + Unable to open File Nie można otworzyć Pliku - + Could not open %1 Nie można otworzyć %1 - + Installation aborted Instalacja przerwana - + The installation of %1 was aborted. Please see the log for more details Instalacja %1 została przerwana. Sprawdź logi, aby uzyskać więcej informacji. - + Invalid File Niepoprawny Plik - + %1 is not a valid CIA %1 nie jest prawidłowym plikiem CIA - + CIA Encrypted Plik CIA jest zaszyfrowany - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Twój plik CIA jest zaszyfrowany.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji można znaleźć na naszym blogu.</a> - + Unable to find File Nie można odnaleźć pliku - + Could not find %1 Nie można odnaleźć %1 - - - - + + + + Z3DS Compression Kompresuj pliki Z3DS - + Failed to compress some files, check log for details. Nie udało się skompresować niektórych plików, sprawdź log, aby uzyskać szczegółowe informacje. - + Failed to decompress some files, check log for details. Nie udało się rozpakować niektórych plików. Szczegółowe informacje można znaleźć w logu. - + All files have been compressed successfully. Wszystkie pliki zostały pomyślnie skompresowane. - + All files have been decompressed successfully. Wszystkie pliki zostały pomyślnie zdekompresowane. - + Uninstalling '%1'... Odinstalowywanie '%1'... - + Failed to uninstall '%1'. Nie udało się odinstalować '%1'. - + Successfully uninstalled '%1'. Pomyślnie odinstalowano '%1'. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + Savestates Savestate.y - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4769,86 +4769,86 @@ Use at your own risk! Używaj na własne ryzyko! - - - + + + Error opening amiibo data file Błąd podczas otwierania pliku danych amiibo - + A tag is already in use. Tag jest już używany. - + Application is not looking for amiibos. Aplikacja nie szuka amiibo. - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);; Wszystkie pliki (*.*) - + Load Amiibo Załaduj Amiibo - + Unable to open amiibo file "%1" for reading. Nie można otworzyć pliku amiibo "%1" do odczytu. - + Record Movie Nagraj Film - + Movie recording cancelled. Nagrywanie zostało przerwane. - - + + Movie Saved Zapisano Film - - + + The movie is successfully saved. Film został poprawnie zapisany. - + Application will unpause Aplikacja zostanie wstrzymana - + The application will be unpaused, and the next frame will be captured. Is this okay? Aplikacja zostanie zatrzymana, a następna klatka zostanie przechwycona. Czy jest to w porządku? - + Invalid Screenshot Directory Nieprawidłowy katalog zrzutów ekranu - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Nie można utworzyć określonego katalogu zrzutów ekranu. Ścieżka zrzutu ekranu zostanie przywrócona do wartości domyślnej. - + Could not load video dumper Nie można załadować zrzutu filmu - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4861,265 +4861,265 @@ Aby zainstalować FFmpeg do Azahar, naciśnij Otwórz i wybierz katalog FFmpeg. Aby wyświetlić poradnik dotyczący instalacji FFmpeg, naciśnij Pomoc. - + Load 3DS ROM Files Załaduj pliki ROMów 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) Pliki ROMów 3DS (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Skompresowany plik ROMu 3DS (*.%1) - + Save 3DS Compressed ROM File Zapisz skompresowany plik ROMu 3DS - + Select Output 3DS Compressed ROM Folder Wybierz folder wyjściowy skompresowanych plików ROMów 3DS - + Load 3DS Compressed ROM Files Wczytaj skompresowane pliki ROMów 3DS - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Skompresowane pliki ROMów 3DS (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) Plik ROMu 3DS (*.%1) - + Save 3DS ROM File Zapisz plik ROMu 3DS - + Select Output 3DS ROM Folder Wybierz folder wyjściowy ROMów 3DS - + Select FFmpeg Directory Wybierz katalog FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. W podanym katalogu FFmpeg brakuje %1. Upewnij się, że wybrany został poprawny katalog. - + FFmpeg has been sucessfully installed. FFmpeg został pomyślnie zainstalowany. - + Installation of FFmpeg failed. Check the log file for details. Instalacja FFmpeg nie powiodła się. Sprawdź plik dziennika, aby uzyskać szczegółowe informacje. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Nie można uruchomić zrzutu filmu.<br>Upewnij się, że koder filmu jest poprawnie skonfigurowany.<br>Szczegółowe informacje można znaleźć w logu. - + Recording %1 Nagrywanie %1 - + Playing %1 / %2 Odtwarzanie %1 / %2 - + Movie Finished Film ukończony - + (Accessing SharedExtData) (Uzyskiwanie dostępu do SharedExtData) - + (Accessing SystemSaveData) (Uzyskiwanie dostępu do SystemSaveData) - + (Accessing BossExtData) (Uzyskiwanie dostępu do BossExtData) - + (Accessing ExtData) (Uzyskiwanie dostępu do ExtData) - + (Accessing SaveData) (Uzyskiwanie dostępu do SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Ruch Artic: %1 %2%3 - + Speed: %1% Prędkość: %1% - + Speed: %1% / %2% Prędkość: %1% / %2% - + App: %1 FPS Aplikacja: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Klatka: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Klatka: %1 ms - + VOLUME: MUTE GŁOŚNOŚĆ: WYCISZONA - + VOLUME: %1% Volume percentage (e.g. 50%) GŁOŚNOŚĆ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Brakuje %1. Prosimy o <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>zrzucenie archiwów systemowych</a>.<br/>Dalsze korzystanie z emulacji może spowodować awarie i błędy. - + A system archive Archiwum systemu - + System Archive Not Found Archiwum Systemowe nie zostało odnalezione - + System Archive Missing Brak archiwum systemu - + Save/load Error Błąd zapisywania/wczytywania - + Fatal Error Krytyczny Błąd - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Wystąpił krytyczny błąd. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Sprawdź szczegóły w logu</a>.<br/>Dalsze korzystanie z emulacji może spowodować awarie i błędy. - + Fatal Error encountered Wystąpił błąd krytyczny - + Continue Kontynuuj - + Quit Application Wyjdź z aplikacji - + OK OK - + Would you like to exit now? Czy chcesz teraz wyjść? - + The application is still running. Would you like to stop emulation? Aplikacja jest nadal uruchomiona. Czy chcesz przerwać emulację? - + Playback Completed Odtwarzanie Zakończone - + Movie playback completed. Odtwarzanie filmu zostało zakończone. - + Update Available Dostępna jest aktualizacja - + Update %1 for Azahar is available. Would you like to download it? Aktualizacja %1 dla Azahar jest dostępna. Czy chcesz ją pobrać? - + Primary Window Główne okno - + Secondary Window Dodatkowe okno diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index b634d9c60..bbae7d108 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -3807,7 +3807,7 @@ installed applications. Status: Loaded (Cannot Validate Signature) - + Status: Carregado (Assinatura não Validada) @@ -3827,7 +3827,7 @@ installed applications. Status: Missing Crypto Keys - + Status: Chaves de Criptografia Ausentes @@ -4240,12 +4240,12 @@ Por favor, verifique a instalação do FFmpeg usada para compilação. GMainWindow - + Warning Aviso - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4260,506 +4260,506 @@ Recomenda-se, em vez disso, iniciar o Azahar usando o comando open, por exemplo: `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Velocidade atual do tráfego do Artic. Valores mais altos indicam cargas de transferência maiores. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Velocidade atual de emulação. Valores maiores ou menores que 100% indicam que a emulação está funcionando mais rápida ou lentamente que num 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Quantos quadros por segundo que o app está mostrando atualmente. Pode variar de app para app e cena para cena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo levado para emular um quadro do 3DS, sem considerar o limitador de taxa de quadros ou a sincronização vertical. Valores menores ou iguais a 16,67 ms indicam que a emulação está em velocidade plena. - + Emulated notification LED LED de notificação emulado - + MicroProfile (unavailable) Micro-perfil (indisponível) - + Clear Recent Files Limpar Arquivos Recentes - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar está executando um aplicativo - - + + Invalid App Format Formato de App inválido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. O formato do seu app não é suportado.<br/>Siga os guias para reextrair seus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de jogos</a> ou <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Corrupted App corrompido - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Seu app está corrompido. <br/>Siga os guias para reextrair seus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de jogos</a> ou <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Encrypted App criptografado - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Seu app está criptografado. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Confira nosso blog para mais informações.</a> - + Unsupported App App não suportado - + GBA Virtual Console is not supported by Azahar. O Console Virtual de GBA não é suportado pelo Azahar. - - + + Artic Server Servidor Artic - + Invalid system mode Modo de sistema inválido - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Aplicativos exclusivos do New 3DS não podem ser carregados sem ativar o modo New 3DS. - + Error while loading App! Erro ao carregar o App! - + An unknown error occurred. Please see the log for more details. Ocorreu um erro desconhecido. Verifique o registro para mais detalhes. - + CIA must be installed before usage É necessário instalar o CIA antes de usar - + Before using this CIA, you must install it. Do you want to install it now? É necessário instalar este CIA antes de poder usá-lo. Deseja instalá-lo agora? - + Quick Load Carregamento rápido - + Quick Save Salvamento rápido - - + + Slot %1 Espaço %1 - + %2 %3 %2 %3 - + Quick Save - %1 Salvamento rápido - %1 - + Quick Load - %1 Carregamento rápido - %1 - + Slot %1 - %2 %3 Espaço %1 - %2 %3 - + Error Opening %1 Folder Erro ao abrir a pasta %1 - - + + Folder does not exist! A pasta não existe! - + Remove Play Time Data Remover Dados de Tempo de Jogo - + Reset play time? Redefinir tempo de jogo? - - - - + + + + Create Shortcut Criar Atalho - + Do you want to launch the application in fullscreen? Você gostaria de iniciar o aplicativo em tela cheia? - + Successfully created a shortcut to %1 Atalho para %1 criado com sucesso - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Isso criará um atalho para o AppImage atual. Isso pode não funcionar bem se você atualizar. Deseja continuar? - + Failed to create a shortcut to %1 Não foi possível criar um atalho para %1 - + Create Icon Criar Ícone - + Cannot create icon file. Path "%1" does not exist and cannot be created. Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. - + Dumping... Extraindo... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Não foi possível extrair o RomFS base. Consulte o registro para ver os detalhes. - + Error Opening %1 Erro ao abrir %1 - + Select Directory Selecionar pasta - + Properties Propriedades - + The application properties could not be loaded. Não foi possível carregar as propriedades do aplicativo. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executável do 3DS (%1);;Todos os arquivos (*.*) - + Load File Carregar arquivo - - + + Set Up System Files Configurar arquivos do sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>O Azahar precisa dos dados exclusivos do console e arquivos de firmware de um console real para que seja possível usar alguns de seus recursos.<br>Tais arquivos e dados podem ser configurados através da <a href=https://github.com/azahar-emu/ArticSetupTool>Ferramenta de Configuração Artic do Azahar</a><br>Notas:<ul><li><b>Esta operação instalará os dados exclusivos do console para o Azahar, não compartilhe sua pasta de usuário ou nand<br>depois de realizar este processo!</b></li><li>Enquanto estiver realizando o processo de configuração, o Azahar irá vincular-se ao console executando a ferramenta de configuração. Você poderá desvincular<br>o console mais tarde na aba Sistema no menu de configuração do emulador.</li><li>Não entre no online com ambos Azahar e seu console 3DS ao mesmo tempo depois de configurar os arquivos de sistema,<br>já que isso poderá causar problemas.</li><li>A configuração do Antigo 3DS é necessária para a configuração do Novo 3DS funcionar (realizar ambas as configurações é recomendado).</li><li>Ambos os modos de configuração irão funcionar independente do modelo do console executando a ferramenta de configuração.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Digite o endereço da Ferramenta de Configuração Artic do Azahar: - + <br>Choose setup mode: <br>Escolha o modo de configuração: - + (ℹ️) Old 3DS setup (ℹ️) Configuração do Antigo 3DS - - + + Setup is possible. É possível configurar. - + (⚠) New 3DS setup (⚠) Configuração do Novo 3DS - + Old 3DS setup is required first. A configuração do Antigo 3DS é requisitada primeiro. - + (✅) Old 3DS setup (✅) Configuração do Antigo 3DS - - + + Setup completed. Configuração concluída. - + (ℹ️) New 3DS setup (ℹ️) Configuração do Novo 3DS - + (✅) New 3DS setup (✅) Configuração do Novo 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Os arquivos do sistema para o modo selecionado já foram configurados. Reinstalar os arquivos mesmo assim? - + Load Files Carregar arquivos - + 3DS Installation File (*.cia *.zcia) Arquivo de Instalação 3DS (.cia .zcia) - - - + + + All Files (*.*) Todos os arquivos (*.*) - + Connect to Artic Base Conectar-se ao Artic Base - + Enter Artic Base server address: Digite o endereço do servidor Artic Base: - + %1 has been installed successfully. %1 foi instalado. - + Unable to open File Não foi possível abrir o arquivo - + Could not open %1 Não foi possível abrir %1 - + Installation aborted Instalação cancelada - + The installation of %1 was aborted. Please see the log for more details A instalação de %1 foi interrompida. Consulte o registro para mais detalhes - + Invalid File Arquivo inválido - + %1 is not a valid CIA %1 não é um CIA válido - + CIA Encrypted CIA criptografado - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Seu arquivo CIA está criptografado.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Confira nosso blog para mais informações.</a> - + Unable to find File Não foi possível localizar o arquivo - + Could not find %1 Não foi possível localizar %1 - - - - + + + + Z3DS Compression Compressão Z3DS - + Failed to compress some files, check log for details. Falha ao comprimir alguns arquivos. Verifique o log para mais detalhes. - + Failed to decompress some files, check log for details. Falha ao descomprimir alguns arquivos. Verifique o log para mais detalhes. - + All files have been compressed successfully. Todos os arquivos foram comprimidos com sucesso. - + All files have been decompressed successfully. Todos os arquivos foram descomprimidos com sucesso. - + Uninstalling '%1'... Desinstalando '%1'... - + Failed to uninstall '%1'. Erro ao desinstalar '%1'. - + Successfully uninstalled '%1'. '%1' desinstalado com sucesso. - + File not found Arquivo não encontrado - + File "%1" not found Arquivo "%1" não encontrado - + Savestates Estados salvos - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4768,86 +4768,86 @@ Use at your own risk! Use por sua conta e risco! - - - + + + Error opening amiibo data file Erro ao abrir arquivo de dados do amiibo - + A tag is already in use. Uma tag já está em uso. - + Application is not looking for amiibos. O aplicativo não está procurando por amiibos. - + Amiibo File (%1);; All Files (*.*) Arquivo do Amiibo (%1);; Todos os arquivos (*.*) - + Load Amiibo Carregar Amiibo - + Unable to open amiibo file "%1" for reading. Não foi possível abrir o arquivo amiibo "%1" para realizar a leitura. - + Record Movie Gravar passos - + Movie recording cancelled. Gravação cancelada. - - + + Movie Saved Gravação salva - - + + The movie is successfully saved. A gravação foi salva. - + Application will unpause O aplicativo será retomado - + The application will be unpaused, and the next frame will be captured. Is this okay? O aplicativo será retomado, e o próximo quadro será capturado. Tudo bem? - + Invalid Screenshot Directory Pasta inválida - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Não é possível criar a pasta especificada. O caminho original foi restabelecido. - + Could not load video dumper Não foi possível carregar o gravador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4860,265 +4860,265 @@ Para instalar o FFmpeg no Azahar, pressione Abrir e selecione seu diretório FFm Para ver um guia sobre como instalar o FFmpeg, pressione Ajuda. - + Load 3DS ROM Files Carregar arquivos de ROM do 3DS - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) **Arquivos de ROM do 3DS (.cia *.cci *.3dsx .cxi .3ds) - + 3DS Compressed ROM File (*.%1) Arquivo de ROM 3DS Comprimido (*.%1) - + Save 3DS Compressed ROM File Salvar Arquivo de ROM 3DS Comprimido - + Select Output 3DS Compressed ROM Folder Selecionar Pasta de Saída das ROMs 3DS Comprimidas - + Load 3DS Compressed ROM Files Carregar Arquivos de ROM 3DS Comprimidos - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Arquivos de ROM 3DS Comprimidos (*.zcia *.zcci .z3dsx .zcxi) - + 3DS ROM File (*.%1) Arquivo de ROM 3DS (*.%1) - + Save 3DS ROM File Salvar Arquivo de ROM 3DS - + Select Output 3DS ROM Folder Selecionar Pasta de Saída das ROMs 3DS - + Select FFmpeg Directory Selecione o Diretório FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. O diretório FFmpeg fornecido não foi encontrado %1. Por favor, certifique-se de que o diretório correto foi selecionado. - + FFmpeg has been sucessfully installed. O FFmpeg foi instalado com sucesso. - + Installation of FFmpeg failed. Check the log file for details. A instalação do FFmpeg falhou. Verifique o arquivo de log para obter detalhes. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Não foi possível começar a gravação do vídeo.<br>Assegure-se que o codificador de vídeo está configurado corretamente.<br>Refira-se ao log para mais detalhes. - + Recording %1 Gravando %1 - + Playing %1 / %2 Reproduzindo %1 / %2 - + Movie Finished Reprodução concluída - + (Accessing SharedExtData) (Acessando SharedExtData) - + (Accessing SystemSaveData) (Acessando SystemSaveData) - + (Accessing BossExtData) (Accessando BossExtData) - + (Accessing ExtData) (Acessando ExtData) - + (Accessing SaveData) (Acessando SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tráfego do Artic: %1 %2%3 - + Speed: %1% Velocidade: %1% - + Speed: %1% / %2% Velocidade: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Quadro: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rest: %6 ms) - + Frame: %1 ms Quadro: %1 ms - + VOLUME: MUTE VOLUME: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 está ausente. Por favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>faça a extração dos arquivos do sistema</a>. <br/>Continuar a emulação pode causar falhas e bugs. - + A system archive Um arquivo do sistema - + System Archive Not Found Arquivo de sistema não encontrado - + System Archive Missing Arquivo de sistema em falta - + Save/load Error Erro ao salvar/carregar - + Fatal Error Erro fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ocorreu um erro fatal. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Verifique o log</a> para mais detalhes.<br/>Continuar a emulação pode causar falhas e bugs. - + Fatal Error encountered Erro fatal encontrado - + Continue Continuar - + Quit Application Sair do Aplicativo - + OK OK - + Would you like to exit now? Deseja sair agora? - + The application is still running. Would you like to stop emulation? O aplicativo ainda está em execução. Deseja parar a emulação? - + Playback Completed Reprodução concluída - + Movie playback completed. Reprodução dos passos concluída. - + Update Available Atualização disponível - + Update %1 for Azahar is available. Would you like to download it? A atualização %1 para o Azahar está disponível. Você gostaria de baixá-la? - + Primary Window Janela Principal - + Secondary Window Janela Secundária diff --git a/dist/languages/ro_RO.ts b/dist/languages/ro_RO.ts index 6b6e2a84a..c35e3a883 100644 --- a/dist/languages/ro_RO.ts +++ b/dist/languages/ro_RO.ts @@ -4233,12 +4233,12 @@ Vă rugăm să verificați instalarea FFmpeg utilizată pentru compilare. GMainWindow - + Warning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4248,591 +4248,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Viteza actuală de emulare. Valori mai mari sau mai mici de 100% indică cum emularea rulează mai repede sau mai încet decât un 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Timp luat pentru a emula un cadru 3DS, fără a pune în calcul limitarea de cadre sau v-sync. Pentru emulare la viteza maximă, această valoare ar trebui să fie maxim 16.67 ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Curăță Fișiere Recente - + &Continue &Continue - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. A apărut o eroare necunoscută. Vă rugăm să consultați jurnalul pentru mai multe detalii. - + CIA must be installed before usage CIA-ul trebuie instalat înainte de uz - + Before using this CIA, you must install it. Do you want to install it now? Înainte de a folosi acest CIA, trebuie să-l instalati. Doriți s-o faceți acum? - + Quick Load - + Quick Save - - + + Slot %1 Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Eroare Deschizând Folderul %1 - - + + Folder does not exist! Folderul nu există! - + Remove Play Time Data Eliminați datele privind timpul petrecut - + Reset play time? Resetați play time? - - - - + + + + Create Shortcut Creează un Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 Shortcut-ul către %1 a fost creat cu succes - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Asta va crea un shortcut la AppImage-ul curent. Este posibilitate că nu va lucra normal dacă veți actualiza. Continuă? - + Failed to create a shortcut to %1 Nu s-a putut crea o comandă rapidă către %1 - + Create Icon Creează un Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. Nu se poate crea fișierul de icon. Calea "%1" nu există și nu poate fi creat. - + Dumping... Dumping... - - + + Cancel Anulare - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Nu s-a putut să facă dump-ul bazei RomFS. Consultați log-urile pentru detalii. - + Error Opening %1 Eroare Deschizând %1 - + Select Directory Selectează Directorul - + Properties Proprietăți - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executabilă 3DS (%1);;Toate Fișierele (*.*) - + Load File Încarcă Fișier - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Încarcă Fișiere - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Toate Fișierele (*.*) - + Connect to Artic Base Conectează Arctic Base - + Enter Artic Base server address: Introduceți adresa serverului Arctic Base: - + %1 has been installed successfully. %1 a fost instalat cu succes. - + Unable to open File Nu s-a putut deschide Fișierul - + Could not open %1 Nu s-a putut deschide %1 - + Installation aborted Instalare anulată - + The installation of %1 was aborted. Please see the log for more details Instalarea lui %1 a fost anulată. Vă rugăm să vedeți log-ul pentru mai multe detalii. - + Invalid File Fișier Invalid - + %1 is not a valid CIA %1 nu este un CIA valid - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Nu se poate găsi Fișierul - + Could not find %1 %1 n-a fost găsit - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... Dezinstalarea '%1'... - + Failed to uninstall '%1'. Dezinstalarea '%1' a eșuat. - + Successfully uninstalled '%1'. '%1' era dezinstalat cu succes. - + File not found Fișier negăsit - + File "%1" not found Fișierul "%1" nu a fost găsit - + Savestates Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Eroare la deschiderea fișierului de date amiibo - + A tag is already in use. Un tag deja este in folosire. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Fișier Amiibo (%1);; Toate Fișierele (*.*) - + Load Amiibo Încarcă Amiibo - + Unable to open amiibo file "%1" for reading. Nu se poate deschide fișierul amiibo "%1" pentru citire. - + Record Movie Înregistrează Film - + Movie recording cancelled. Înregistrarea filmului a fost anulată. - - + + Movie Saved Film Salvat - - + + The movie is successfully saved. Filmul a fost salvat cu succes. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Directoria Capturii de Ecran este Invalidă - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Nu se poate crea directoria specificată a capturii de ecran. Calea capturii de ecran a fost setat implicit - + Could not load video dumper Dumperul video nu a putut fi încărcat - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4841,264 +4841,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory Selectați Directoria FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Directoria FFmpeg furnizată nu este prezentă %1. Vă rugăm să vă asigurați că ați selectat directoria corectă. - + FFmpeg has been sucessfully installed. FFmpeg era instalat cu succes. - + Installation of FFmpeg failed. Check the log file for details. Instalația FFmpeg a eșuat. Verificați log-urile pentru detalii. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Înregistrarea %1 - + Playing %1 / %2 Playing %1 / %2 - + Movie Finished Filmul finisat - + (Accessing SharedExtData) (Se accesează SharedExtData) - + (Accessing SystemSaveData) (Se accesează SystemSaveData) - + (Accessing BossExtData) (Se accesează BossExtData) - + (Accessing ExtData) (Se accesează ExtData) - + (Accessing SaveData) (Se accesează SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Viteză: %1% - + Speed: %1% / %2% Viteză: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Cadru: %1 ms - + VOLUME: MUTE VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Arhivul sistemului - + System Archive Not Found Fișier de Sistem Negăsit - + System Archive Missing Arhivul Sistemului nu este Prezent - + Save/load Error Eroare la salvare/încărcare - + Fatal Error Eroare Fatală - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered S-a Produs o Eroare Fatală - + Continue Continuă - + Quit Application - + OK OK - + Would you like to exit now? Doriți să ieșiți acum? - + The application is still running. Would you like to stop emulation? - + Playback Completed Redare Finalizată - + Movie playback completed. Redarea filmului a fost finalizată. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Fereastră Primară - + Secondary Window Fereastră Secundară diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 9f1e97d37..036b93444 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -4240,12 +4240,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Предупреждение - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4255,591 +4255,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция работает быстрее или медленнее, чем в 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, затрачиваемое на эмуляцию кадра 3DS, без учёта ограничения кадров или вертикальной синхронизации. Для полноскоростной эмуляции это значение должно быть не более 16,67 мс. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Очистить последние файлы - + &Continue &Продолжить - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. Azahar не поддерживает GBA Virtual Console. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Подробную информацию см. в журнале. - + CIA must be installed before usage Перед использованием необходимо установить CIA-файл - + Before using this CIA, you must install it. Do you want to install it now? Перед использованием этого CIA-файла, необходимо его установить. Установить сейчас? - + Quick Load Быстрая загрузка - + Quick Save Быстрое сохранение - - + + Slot %1 Ячейка %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Ошибка открытия папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Play Time Data - + Reset play time? Сбросить игровое время? - - - - + + + + Create Shortcut Создать ярлык - + Do you want to launch the application in fullscreen? Запускать приложение в полном экране? - + Successfully created a shortcut to %1 Успешно создан ярлык для %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 Не удалось создать ярлык для %1 - + Create Icon Создать иконку - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Создание дампа... - - + + Cancel Отмена - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Не удалось создать дамп base RomFS. Подробную информацию см. в журнале. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать каталог - + Properties Свойства - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Исполняемый файл 3DS (%1);;Все файлы (*.*) - + Load File Загрузка файла - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: Выберите режим установки: - + (ℹ️) Old 3DS setup (ℹ️) Обычная 3DS - - + + Setup is possible. - + (⚠) New 3DS setup (⚠) New 3DS - + Old 3DS setup is required first. Сначала требуется установка обычной 3DS. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Загрузка файлов - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Все файлы (*.*) - + Connect to Artic Base Подключиться к Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 был успешно установлен. - + Unable to open File Не удалось открыть файл - + Could not open %1 Не удалось открыть %1 - + Installation aborted Установка прервана - + The installation of %1 was aborted. Please see the log for more details Установка %1 была прервана. Более подробную информацию см. в журнале. - + Invalid File Недопустимый файл - + %1 is not a valid CIA %1 — недопустимый CIA-файл - + CIA Encrypted CIA файл зашифрован - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Не удалось найти файл - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... Удаление '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. Успешно удалён '%1'. - + File not found Файл не найден - + File "%1" not found Файл «%1» не найден - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все файлы (*.*) - + Load Amiibo Загрузка Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Запись видеоролика - + Movie recording cancelled. Запись видеоролика отменена. - - + + Movie Saved Сохранение видеоролика - - + + The movie is successfully saved. Видеоролик сохранён успешно. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4848,264 +4848,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory Выберите каталог FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Скорость: %1% - + Speed: %1% / %2% Скорость: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Кадр: %1 мс - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Системный архив - + System Archive Not Found Системный архив не найден - + System Archive Missing Не удалось найти системный архив - + Save/load Error Ошибка сохранения/загрузки - + Fatal Error Неустранимая ошибка - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Произошла неустранимая ошибка - + Continue Продолжить - + Quit Application Закрыть Приложение - + OK OK - + Would you like to exit now? Выйти сейчас? - + The application is still running. Would you like to stop emulation? - + Playback Completed Воспроизведение завершено - + Movie playback completed. Воспроизведение видеоролика завершено. - + Update Available Доступно обновление - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Основной Экран - + Secondary Window Дополнительный Экран diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index f6f269eb9..57dace937 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -3808,7 +3808,7 @@ installerade applikationer. Status: Loaded (Cannot Validate Signature) - + Status: Inläst (kan inte validera signatur) @@ -3828,7 +3828,7 @@ installerade applikationer. Status: Missing Crypto Keys - + Status: Saknar krypteringsnycklar @@ -4241,12 +4241,12 @@ Kontrollera din FFmpeg-installation som användes för kompilering. GMainWindow - + Warning Varning - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4261,506 +4261,506 @@ Det rekommenderas istället att köra Azahar med kommandot `open`, t.ex.: `open ./Azahar.app` - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Aktuell hastighet för Artic-trafiken. Högre värden indikerar större överföringslaster. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Aktuell emuleringshastighet. Värden som är högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Hur många bilder per sekund som appen visar för närvarande. Detta varierar från app till app och från scen till scen. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tidsåtgång för att emulera en 3DS-bildruta, utan att räkna med framelimiting eller v-sync. För emulering med full hastighet bör detta vara högst 16,67 ms. - + Emulated notification LED - + MicroProfile (unavailable) MicroProfile (inte tillgänglig) - + Clear Recent Files Töm senaste filer - + &Continue &Fortsätt - + &Pause &Paus - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar kör en applikation - - + + Invalid App Format Ogiltigt appformat - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Ditt appformat stöds inte.<br/>Följ anvisningarna för att återdumpa dina <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>spelkassetter</a> eller <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installerade titlar</a>. - + App Corrupted Appen skadad - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Din app är skadad. <br/>Följ guiderna för att återdumpa dina <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>spelkassetter</a> eller <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installerade titlar</a>. - + App Encrypted App krypterad - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Din app är krypterad. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Mer information finns på vår blogg.</a> - + Unsupported App App som inte stöds - + GBA Virtual Console is not supported by Azahar. GBA Virtual Console stöds inte av Azahar. - - + + Artic Server Artic-server - + Invalid system mode Ogiltigt systemläge - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Nya 3DS-exklusiva applikationer kan inte läsas in utan att aktivera Ny 3DS-läget. - + Error while loading App! Fel vid inläsning av app! - + An unknown error occurred. Please see the log for more details. Ett okänt fel har inträffat. Se loggen för mer information. - + CIA must be installed before usage CIA måste installeras före användning - + Before using this CIA, you must install it. Do you want to install it now? Innan du använder denna CIA måste du installera den. Vill du installera den nu? - + Quick Load Snabbinläsning - + Quick Save Snabbsparning - - + + Slot %1 Plats %1 - + %2 %3 %2 %3 - + Quick Save - %1 Snabbsparning - %1 - + Quick Load - %1 Snabbinläsning - %1 - + Slot %1 - %2 %3 Plats %1 - %2 %3 - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Återställ speltid? - - - - + + + + Create Shortcut Skapa genväg - + Do you want to launch the application in fullscreen? Vill du starta applikationen i helskärm? - + Successfully created a shortcut to %1 Skapade framgångsrikt en genväg till %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Detta kommer att skapa en genväg till den aktuella AppImage. Detta kanske inte fungerar så bra om du uppdaterar. Fortsätta? - + Failed to create a shortcut to %1 Misslyckades med att skapa en genväg till %1 - + Create Icon Skapa ikon - + Cannot create icon file. Path "%1" does not exist and cannot be created. Det går inte att skapa en ikonfil. Sökvägen "%1" finns inte och kan inte skapas. - + Dumping... Dumpar... - - + + Cancel Avbryt - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Kunde inte dumpa RomFS-basen. Se loggen för mer information. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The application properties could not be loaded. Applikationsegenskaperna kunde inte läsas in. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Körbar 3DS-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - - + + Set Up System Files Konfigurera systemfiler - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar behöver konsolunika data och firmware-filer från en riktig konsol för att kunna använda vissa av dess funktioner. <br>Sådana filer och data kan konfigureras med <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool </a><br>Observera:<ul><li><b> Den här åtgärden installerar konsolunika data till Azahar, dela inte dina användar- eller nand-mappar<br> efter att du har utfört installationsprocessen!</b></li><li> Under installationsprocessen kommer Azahar att länkas till den konsol som kör installationsverktyget. Du kan koppla bort <br>konsolen senare från fliken System i emulatorns konfigurationsmeny. </li><li>Gå inte online med både Azahar och din 3DS-konsol samtidigt efter att du har konfigurerat systemfiler, <br>eftersom det kan orsaka problem.</li><li> En installation av den gamla 3DS:en behövs för att installationen av den nya 3DS:en ska fungera (vi rekommenderar att du gör båda installationslägena).</li><li> Båda installationslägena fungerar oavsett vilken konsolmodell som kör installationsverktyget.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Ange adressen till Azahar Artic Setup Tool: - + <br>Choose setup mode: <br>Välj konfigurationsläge: - + (ℹ️) Old 3DS setup (ℹ️) Gammal 3DS-konfiguration - - + + Setup is possible. Konfiguration är möjlig. - + (⚠) New 3DS setup (⚠) Ny 3DS-konfiguration - + Old 3DS setup is required first. Gammal 3DS-konfiguration krävs först. - + (✅) Old 3DS setup (✅) Gammal 3DS-konfiguration - - + + Setup completed. Konfigurationen är färdig. - + (ℹ️) New 3DS setup (ℹ️) Ny 3DS-konfiguration - + (✅) New 3DS setup (✅) Ny 3DS-konfiguration - + The system files for the selected mode are already set up. Reinstall the files anyway? Systemfilerna för det valda läget är redan konfigurerade. Installera om filerna i alla fall? - + Load Files Läs in filer - + 3DS Installation File (*.cia *.zcia) 3DS-installationsfil (*.cia *.zcia) - - - + + + All Files (*.*) Alla filer (*.*) - + Connect to Artic Base Anslut till Artic Base - + Enter Artic Base server address: Ange Artic Base-serveradress: - + %1 has been installed successfully. %1 har installerats. - + Unable to open File Kunde inte öppna filen - + Could not open %1 Kunde inte öppna %1 - + Installation aborted Installationen avbröts - + The installation of %1 was aborted. Please see the log for more details Installationen av %1 avbröts. Se loggen för mer information - + Invalid File Ogiltig fil - + %1 is not a valid CIA %1 är inte en giltig CIA - + CIA Encrypted CIA-krypterad - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Din CIA-fil är krypterad.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Kolla vår blogg för mer info</a> - + Unable to find File Det går inte att hitta filen - + Could not find %1 Kunde inte hitta %1 - - - - + + + + Z3DS Compression Z3DS-komprimering - + Failed to compress some files, check log for details. Misslyckades med att komprimera några filer. Kontrollera loggen. - + Failed to decompress some files, check log for details. Misslyckades med att packa upp några filer. Kontrollera loggen. - + All files have been compressed successfully. Alla filer har komprimerats utan problem. - + All files have been decompressed successfully. Alla filer har packats upp utan problem. - + Uninstalling '%1'... Avinstallation av "%1"... - + Failed to uninstall '%1'. Misslyckades med att avinstallera "%1". - + Successfully uninstalled '%1'. Avinstallationen av "%1" har lyckats. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + Savestates Sparade tillstånd - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4769,86 +4769,86 @@ Use at your own risk! Använd på egen risk! - - - + + + Error opening amiibo data file Fel vid öppning av amiibo datafil - + A tag is already in use. En tagg är redan i bruk. - + Application is not looking for amiibos. Applikationen letar inte efter amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Unable to open amiibo file "%1" for reading. Det gick inte att öppna amiibo-filen "%1" för läsning. - + Record Movie Spela in film - + Movie recording cancelled. Filminspelning avbruten. - - + + Movie Saved Filmen sparades - - + + The movie is successfully saved. Filmen sparades. - + Application will unpause Applikationen kommer att återupptas - + The application will be unpaused, and the next frame will be captured. Is this okay? Applikationen kommer att återupptas och nästa bildruta kommer att fångas. Är det här okej? - + Invalid Screenshot Directory Ogiltig katalog för skärmbilder - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Det går inte att skapa angiven skärmbildskatalog. Sökvägen för skärmbilder återställs till sitt standardvärde. - + Could not load video dumper Kunde inte läsa in videodumpern - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4861,265 +4861,265 @@ För att installera FFmpeg till Azahar, tryck på Öppna och välj din FFmpeg-ka Om du vill visa en guide om hur du installerar FFmpeg trycker du på Hjälp. - + Load 3DS ROM Files Läs in 3DS ROM-filer - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) 3DS ROM-filer (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) Komprimerad 3DS ROM-fil (*.%1) - + Save 3DS Compressed ROM File Spara komprimerad 3DS ROM-fil - + Select Output 3DS Compressed ROM Folder Välj utdatamapp för 3DS-komprimerad ROM - + Load 3DS Compressed ROM Files Läs in 3DS-komprimerade ROM-filer - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Komprimerade 3DS ROM-filer (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) 3DS ROM-fil (*.%1) - + Save 3DS ROM File Spara 3DS ROM-fil - + Select Output 3DS ROM Folder Välj utdatamapp för 3DS ROM - + Select FFmpeg Directory Välj FFmpeg-katalog - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Den angivna FFmpeg-katalogen saknar %1. Kontrollera att rätt katalog har valts. - + FFmpeg has been sucessfully installed. FFmpeg har installerats. - + Installation of FFmpeg failed. Check the log file for details. Installationen av FFmpeg misslyckades. Kontrollera loggfilen för mer information. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Det gick inte att starta videodumpningen.<br>Kontrollera att videokodaren är korrekt konfigurerad.<br>Se loggen för mer information. - + Recording %1 Spelar in %1 - + Playing %1 / %2 Spelar %1 / %2 - + Movie Finished Filmen är färdig - + (Accessing SharedExtData) (Åtkomst till SharedExtData) - + (Accessing SystemSaveData) (Åtkomst till SystemSaveData) - + (Accessing BossExtData) (Åtkomst till BossExtData) - + (Accessing ExtData) (Åtkomst till ExtData) - + (Accessing SaveData) (Åtkomst till SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic-trafik: %1 %2%3 - + Speed: %1% Hastighet: %1% - + Speed: %1% / %2% Hastighet: %1% / %2% - + App: %1 FPS App: %1 bilder/s - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Bildruta: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Bildruta: %1 ms - + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 saknas. <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>Dumpa dina systemarkiv</a>.<br/>Fortsatt emulering kan resultera i krascher och buggar. - + A system archive Ett systemarkiv - + System Archive Not Found Systemarkiv hittades inte - + System Archive Missing Systemarkiv saknas - + Save/load Error Fel vid spara/läs in - + Fatal Error Ödesdigert fel - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ett ödesdigert fel inträffade. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Kontrollera loggen</a> för detaljer.<br/>Fortsatt emulering kan resultera i krascher och buggar. - + Fatal Error encountered Allvarligt fel uppstod - + Continue Fortsätt - + Quit Application Avsluta applikation - + OK Ok - + Would you like to exit now? Vill du avsluta nu? - + The application is still running. Would you like to stop emulation? Applikationen körs fortfarande. Vill du stoppa emuleringen? - + Playback Completed Uppspelningen är färdig - + Movie playback completed. Uppspelning av film slutförd. - + Update Available Uppdatering tillgänglig - + Update %1 for Azahar is available. Would you like to download it? Uppdatering %1 för Azahar finns tillgänglig. Vill du hämta ner den? - + Primary Window Primärt fönster - + Secondary Window Sekundärt fönster diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 01c08ca35..07149c679 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -4237,12 +4237,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Uyarı - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4252,504 +4252,504 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Geçerli emülasyon hızı. 100%'den az veya çok olan değerler emülasyonun bir 3DS'den daha yavaş veya daha hızlı çalıştığını gösterir. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Bir 3DS karesini emüle etmekte geçen zaman, karelimitleme ve v-sync hariç. Tam hız emülasyon için bu en çok 16,67 ms. olmalı. - + Emulated notification LED - + MicroProfile (unavailable) MikroProfil (kullanılamaz) - + Clear Recent Files Son Dosyaları Temizle - + &Continue &Devam et - + &Pause &Duraklat - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar bir uygulama çalıştırıyor - - + + Invalid App Format Geçersiz Uygulama Biçimi - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted Uygulama Şifreli - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App Desteklenmeyen Uygulama - + GBA Virtual Console is not supported by Azahar. GBA Sanal Konsolu Azahar tarafından desteklenmiyor. - - + + Artic Server Artic Sunucusu - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! Uygulama yüklenirken hata oluştu! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA dosyası kullanılmadan önce yüklenmelidir - + Before using this CIA, you must install it. Do you want to install it now? Bu CIA dosyasını kullanmadan önce yüklemeniz gerekir. Şimdi yüklemek ister misiniz? - + Quick Load Hızlı Yükle - + Quick Save Hızlı Kaydet - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Hızlı Kayıt - %1 - + Quick Load - %1 Hızlı Yükleme - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder %1 Klasörü Açılırken Hata Oluştu - - + + Folder does not exist! Klasör mevcut değil! - + Remove Play Time Data - + Reset play time? Oynama süresi sıfırlansın mı? - - - - + + + + Create Shortcut Kısayol Oluştur - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Simge Oluştur - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dump ediliyor... - - + + Cancel İptal et - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Temel RomFS dump edilemedi. Detaylar için kütük dosyasına bakınız. - + Error Opening %1 %1 Açılırken Hata Oluştu - + Select Directory Dizin Seç - + Properties Özellikler - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Çalıştırılabiliri (%1);; Bütün Dosyalar (*.*) - + Load File Dosya Yükle - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. Kurulum tamamlandı. - + (ℹ️) New 3DS setup (ℹ️) Yeni 3DS kurulumu - + (✅) New 3DS setup (✅) Yeni 3DS kurulumu - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Dosyaları Yükle - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Tüm Dosyalar (*.*) - + Connect to Artic Base Artic Base'e Bağla - + Enter Artic Base server address: - + %1 has been installed successfully. %1 başarıyla yüklendi. - + Unable to open File Dosya açılamıyor - + Could not open %1 %1 açılamıyor - + Installation aborted Yükleme iptal edildi - + The installation of %1 was aborted. Please see the log for more details %1'in yüklemesi iptal edildi. Daha fazla detay için lütfen kütüğe bakınız. - + Invalid File Geçersiz Dosya - + %1 is not a valid CIA %1 geçerli bir CIA dosyası değil - + CIA Encrypted CİA Şifreli - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Dosya bulunamadı - + Could not find %1 %1 bulunamadı - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... '%1' siliniyor... - + Failed to uninstall '%1'. '%1' silinemedi. - + Successfully uninstalled '%1'. '%1' başarıyla silindi. - + File not found Dosya bulunamadı - + File "%1" not found "%1" Dosyası bulunamadı - + Savestates Kayıt Durumları - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4758,86 +4758,86 @@ Use at your own risk! Kullanım riski size aittir! - - - + + + Error opening amiibo data file Amiibo veri dosyasını açarken bir hata oldu - + A tag is already in use. Bir etiket zaten kullanılıyor. - + Application is not looking for amiibos. Uygulama amiibo aramıyor. - + Amiibo File (%1);; All Files (*.*) Amiibo Dosyası (%1);; Tüm Dosyalar (*.*) - + Load Amiibo Amiibo Yükle - + Unable to open amiibo file "%1" for reading. - + Record Movie Klip Kaydet - + Movie recording cancelled. Klip kaydı iptal edildi. - - + + Movie Saved Klip Kaydedildi - - + + The movie is successfully saved. Klip başarıyla kayıt edildi. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Geçersiz Ekran Görüntüsü Dizini - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4846,264 +4846,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory FFmpeg Dizini Seç - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. FFmpeg başarıyla yüklendi. - + Installation of FFmpeg failed. Check the log file for details. FFmpeg yüklemesi başarısız oldu. Detaylar için log dosyasına bakınız. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Ekran Kaydediliyor %1 - + Playing %1 / %2 Oynatılıyor %1 / %2 - + Movie Finished Film Bitti - + (Accessing SharedExtData) (SharedExtData'ya Erişiliyor) - + (Accessing SystemSaveData) (SystemSaveData'ya Erişiliyor) - + (Accessing BossExtData) (BossExtData'ya Erişiliyor) - + (Accessing ExtData) (ExtData'ya Erişiliyor) - + (Accessing SaveData) (SaveData'ya Erişiliyor) - + MB/s MB/sn - + KB/s KB/sn - + Artic Traffic: %1 %2%3 - + Speed: %1% Hız: %1% - + Speed: %1% / %2% Hız: %1% / %2% - + App: %1 FPS Uygulama: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kare: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Bir sistem arşivi - + System Archive Not Found Sistem Arşivi Bulunamadı - + System Archive Missing Sistem Arşivi Eksik - + Save/load Error Kaydetme/yükleme Hatası - + Fatal Error Önemli Hata - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Kritik hatayla karşılaşıldı - + Continue Devam - + Quit Application Uygulamadan Çık - + OK Tamam - + Would you like to exit now? Çıkmak istediğinize emin misiniz? - + The application is still running. Would you like to stop emulation? Uygulama hala çalışıyor. Emülasyonu durdurmak ister misiniz? - + Playback Completed Oynatma Tamamlandı - + Movie playback completed. Klip oynatması tamamlandı. - + Update Available Güncelleme Mevcut - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Birincil Pencere - + Secondary Window İkincil Pencere diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 22390537b..9dcd6164b 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -4230,12 +4230,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning Cảnh báo - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4245,591 +4245,591 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Tốc độ giả lập hiện tại. Giá trị cao hoặc thấp hơn 100% thể hiện giả lập đang chạy nhanh hay chậm hơn một chiếc máy 3DS thực sự. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Thời gian để giả lập một khung hình của máy 3DS, không gồm giới hạn khung hay v-sync Một giả lập tốt nhất sẽ tiệm cận 16.67 ms. - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files Xóa danh sách tệp gần đây - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA cần được cài đặt trước khi dùng - + Before using this CIA, you must install it. Do you want to install it now? Trước khi sử dụng CIA, bạn cần cài đặt nó. Bạn có muốn cài đặt nó ngay không? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Lỗi khi mở thư mục %1 - - + + Folder does not exist! Thư mục này không tồn tại! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Đang trích xuất... - - + + Cancel Hủy bỏ - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Không thể trích xuất base RomFS. Kiểm tra log để biết thêm chi tiết. - + Error Opening %1 Lỗi khi mở %1 - + Select Directory Chọn thư mục - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Mở tệp tin - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Mở các tệp tin - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Tất cả tệp tin (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 đã được cài đặt thành công. - + Unable to open File Không thể mở tệp tin - + Could not open %1 Không thể mở %1 - + Installation aborted Việc cài đặt đã bị hoãn - + The installation of %1 was aborted. Please see the log for more details Việc cài đặt %1 đã bị hoãn. Vui lòng xem bản ghi nhật ký để biết thêm chi tiết. - + Invalid File Tệp tin không hợp lệ - + %1 is not a valid CIA %1 không phải là một tệp CIA hợp lệ - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Không tìm thấy tệp - + File "%1" not found Không tìm thấy tệp tin "%1" - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Tệp Amiibo (%1);; Tất cả tệp (*.*) - + Load Amiibo Tải Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Quay phim - + Movie recording cancelled. Ghi hình đã bị hủy. - - + + Movie Saved Đã lưu phim. - - + + The movie is successfully saved. Phim đã được lưu lại thành công. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4838,264 +4838,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Tốc độ: %1% - + Speed: %1% / %2% Tốc độ: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Khung: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Một tập tin hệ thống - + System Archive Not Found Không tìm thấy tập tin hệ thống - + System Archive Missing Thiếu tập tin hệ thống - + Save/load Error - + Fatal Error Lỗi nghiêm trọng - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Tiếp tục - + Quit Application - + OK OK - + Would you like to exit now? Bạn có muốn thoát ngay bây giờ không? - + The application is still running. Would you like to stop emulation? - + Playback Completed Phát lại hoàn tất - + Movie playback completed. Phát lại phim hoàn tất. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 6b052e9a8..657589234 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -4240,12 +4240,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 警告 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4255,506 +4255,506 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. 当前 Artic 连接速度。数值越高,表示传递载荷越大。 - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 当前模拟速度。高于或低于 100% 的值表示模拟正在运行得比实际 3DS 更快或更慢。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. 应用当前显示的每秒帧数。这会因应用和场景而异。 - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 在不计算速度限制和垂直同步的情况下,模拟一个 3DS 帧的实际时间。若要进行全速模拟,这个数值不应超过 16.67 毫秒。 - + Emulated notification LED - + MicroProfile (unavailable) 微档案文件(不可用) - + Clear Recent Files 清除最近文件 - + &Continue 继续(&C) - + &Pause 暂停(&P) - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar 正在运行应用 - - + + Invalid App Format 无效的应用格式 - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. 您的应用格式不受支持。<br/>请遵循以下指引重新转储您的<a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>游戏卡带</a>或<a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>已安装的应用</a>。 - + App Corrupted 应用已损坏 - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. 您的应用已损坏。<br/>请遵循以下指引重新转储您的<a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>游戏卡带</a>或<a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>已安装的应用</a>。 - + App Encrypted 应用已加密 - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> 您的应用已加密。 <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>请查看我们的博客以了解更多信息。</a> - + Unsupported App 不支持的应用 - + GBA Virtual Console is not supported by Azahar. GBA 虚拟主机不受 Azahar 支持。 - - + + Artic Server Artic 服务器 - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! 加载应用时出错! - + An unknown error occurred. Please see the log for more details. 发生了一个未知错误。详情请参阅日志。 - + CIA must be installed before usage CIA 文件必须安装后才能使用 - + Before using this CIA, you must install it. Do you want to install it now? 在使用这个 CIA 文件前,您必须先进行安装。您希望现在就安装它吗? - + Quick Load 快速载入 - + Quick Save 快速保存 - - + + Slot %1 插槽 %1 - + %2 %3 %2 %3 - + Quick Save - %1 快速保存 - %1 - + Quick Load - %1 快速载入 - %1 - + Slot %1 - %2 %3 插槽 %1 - %2 %3 - + Error Opening %1 Folder 无法打开 %1 文件夹 - - + + Folder does not exist! 文件夹不存在! - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 重置游戏时间? - - - - + + + + Create Shortcut 创建快捷方式 - + Do you want to launch the application in fullscreen? 您想以全屏幕运行应用吗? - + Successfully created a shortcut to %1 已经在 %1 上创建了快捷方式。 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? 这将会为当前的 AppImage 创建一个快捷方式。如果您更新,此快捷方式可能会无效。继续吗? - + Failed to create a shortcut to %1 在 %1 上创建快捷方式失败。 - + Create Icon 创建图标 - + Cannot create icon file. Path "%1" does not exist and cannot be created. 无法创建图标文件。路径“%1”不存在,且无法创建。 - + Dumping... 转储中... - - + + Cancel 取消 - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. 无法转储 RomFS 。 有关详细信息,请参考日志文件。 - + Error Opening %1 无法打开 %1 - + Select Directory 选择目录 - + Properties 属性 - + The application properties could not be loaded. 无法加载应用属性。 - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - - + + Set Up System Files 设置系统文件 - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar 需要来自真实掌机的独有数据和固件文件才能使用其部分功能。<br>此类文件和数据可通过 <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic 设置工具</a>进行设置<br>注意:<ul><li><b>此操作会将掌机独有数据安装到 Azahar,<br>执行设置过程后请勿共享您的用户或 nand 文件夹!</b></li><li>在执行设置过程时,Azahar 将关联到运行设置工具的掌机。<br>您可以随时从模拟器配置菜单的“系统”选项卡中取消关联掌机。</li><li>设置系统文件后,请勿同时使用 Azahar 和 3DS 掌机联网,<br>因为这可能会导致问题。</li><li>新 3DS 设置需要先进行老 3DS 设置才能运作(建议两种设置模式都执行)。</li><li>无论运行设置工具的掌机型号如何,两种设置模式均可运作。</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: 输入 Azahar Artic 设置工具地址: - + <br>Choose setup mode: <br>选择设置模式: - + (ℹ️) Old 3DS setup (ℹ️) 老 3DS 设置 - - + + Setup is possible. 可以进行设置。 - + (⚠) New 3DS setup (⚠) 新 3DS 设置 - + Old 3DS setup is required first. 首先需要设置老 3DS。 - + (✅) Old 3DS setup (✅) 老 3DS 设置 - - + + Setup completed. 设置完成。 - + (ℹ️) New 3DS setup (ℹ️) 新 3DS 设置 - + (✅) New 3DS setup (✅) 新 3DS 设置 - + The system files for the selected mode are already set up. Reinstall the files anyway? 所选模式的系统文件已设置。 是否要重新安装文件? - + Load Files 加载多个文件 - + 3DS Installation File (*.cia *.zcia) 3DS 安装文件 (*.cia *.zcia) - - - + + + All Files (*.*) 所有文件 (*.*) - + Connect to Artic Base 连接到 Artic Base - + Enter Artic Base server address: 输入 Artic Base 服务器地址: - + %1 has been installed successfully. %1 已成功安装。 - + Unable to open File 无法打开文件 - + Could not open %1 无法打开 %1 - + Installation aborted 安装失败 - + The installation of %1 was aborted. Please see the log for more details %1 的安装过程失败。请参阅日志以了解细节。 - + Invalid File 文件无效 - + %1 is not a valid CIA %1 不是有效的 CIA 文件 - + CIA Encrypted CIA 已加密 - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> 您的 CIA 文件已加密。 <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>请查看我们的博客以了解更多信息。</a> - + Unable to find File 无法找到文件 - + Could not find %1 找不到 %1 - - - - + + + + Z3DS Compression Z3DS 压缩 - + Failed to compress some files, check log for details. 部分文件压缩失败,请查看日志了解详情。 - + Failed to decompress some files, check log for details. 部分文件解压缩失败,请查看日志了解详情。 - + All files have been compressed successfully. 所有文件已成功压缩。 - + All files have been decompressed successfully. 所有文件已成功解压缩。 - + Uninstalling '%1'... 正在卸载“%1”... - + Failed to uninstall '%1'. 卸载“%1”失败。 - + Successfully uninstalled '%1'. “%1”卸载成功。 - + File not found 找不到文件 - + File "%1" not found 找不到文件“%1” - + Savestates 保存状态 - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4763,86 +4763,86 @@ Use at your own risk! 您必须自行承担使用风险! - - - + + + Error opening amiibo data file 打开 Amiibo 数据文件时出错 - + A tag is already in use. 当前已有 Amiibo 标签在使用中。 - + Application is not looking for amiibos. 应用未在寻找 Amiibo。 - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);;所有文件 (*.*) - + Load Amiibo 加载 Amiibo - + Unable to open amiibo file "%1" for reading. 无法打开 Amiibo 文件 %1 。 - + Record Movie 录制影像 - + Movie recording cancelled. 影像录制已取消。 - - + + Movie Saved 影像已保存 - - + + The movie is successfully saved. 影像已成功保存。 - + Application will unpause 应用将取消暂停 - + The application will be unpaused, and the next frame will be captured. Is this okay? 将取消暂停应用,并捕获下一帧。这样可以吗? - + Invalid Screenshot Directory 无效的截图保存目录 - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. 无法创建指定的截图保存目录。截图保存路径将重设为默认值。 - + Could not load video dumper 无法加载视频转储器 - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4855,265 +4855,265 @@ To view a guide on how to install FFmpeg, press Help. 要查看如何安装 FFmpeg 的指南,请按“帮助”。 - + Load 3DS ROM Files 加载 3DS ROM 文件 - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) 3DS 压缩 ROM 文件 (*.%1) - + Save 3DS Compressed ROM File 保存 3DS 压缩 ROM 文件 - + Select Output 3DS Compressed ROM Folder 选择输出 3DS 压缩 ROM 的文件夹 - + Load 3DS Compressed ROM Files 加载 3DS 压缩 ROM 文件 - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) 3DS 压缩 ROM 文件 (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) 3DS ROM 文件 (*.%1) - + Save 3DS ROM File 保存 3DS ROM 文件 - + Select Output 3DS ROM Folder 选择输出 3DS ROM 的文件夹 - + Select FFmpeg Directory 选择 FFmpeg 目录 - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. 选择的 FFmpeg 目录中缺少 %1 。请确保选择了正确的目录。 - + FFmpeg has been sucessfully installed. FFmpeg 已成功安装。 - + Installation of FFmpeg failed. Check the log file for details. 安装 FFmpeg 失败。详情请参阅日志文件。 - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. 无法开始视频转储。<br>请确保视频编码器配置正确。<br>有关详细信息,请参阅日志。 - + Recording %1 录制中 %1 - + Playing %1 / %2 播放中 %1 / %2 - + Movie Finished 录像播放完毕 - + (Accessing SharedExtData) (正在获取 SharedExtData) - + (Accessing SystemSaveData) (正在获取 SystemSaveData) - + (Accessing BossExtData) (正在获取 BossExtData) - + (Accessing ExtData) (正在获取 ExtData) - + (Accessing SaveData) 正在获取(SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic 流量:%1 %2%3 - + Speed: %1% 速度:%1% - + Speed: %1% / %2% 速度:%1% / %2% - + App: %1 FPS 应用: %1 帧 - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) 帧: %1 毫秒 (GPU: [CMD: %2 毫秒, SWP: %3 毫秒], IPC: %4 毫秒, SVC: %5 毫秒, Rem: %6 毫秒) - + Frame: %1 ms 帧延迟:%1 毫秒 - + VOLUME: MUTE 音量:静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量:%1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 缺失。请 <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>转储您的系统档案</a>。<br/>继续进行模拟可能会导致崩溃和错误。 - + A system archive 系统档案 - + System Archive Not Found 未找到系统档案 - + System Archive Missing 系统档案丢失 - + Save/load Error 保存/读取出现错误 - + Fatal Error 致命错误 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. 发生了致命错误。请<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>参阅日志</a>了解详细信息。<br/>继续进行模拟可能会导致崩溃和错误。 - + Fatal Error encountered 发生致命错误 - + Continue 继续 - + Quit Application 退出应用 - + OK 确定 - + Would you like to exit now? 您现在要退出么? - + The application is still running. Would you like to stop emulation? 应用仍在运行。您想停止模拟吗? - + Playback Completed 播放完成 - + Movie playback completed. 影像播放完成。 - + Update Available 有可用更新 - + Update %1 for Azahar is available. Would you like to download it? Azahar 的更新 %1 已发布。 您要下载吗? - + Primary Window 主窗口 - + Secondary Window 次级窗口 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 8ac9a0442..7fd753d0b 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -4231,12 +4231,12 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + Warning 警告 - + The `azahar` executable is being run directly rather than via the Azahar.app bundle. When run this way, the app may be missing certain functionality such as camera emulation. @@ -4246,592 +4246,592 @@ It is recommended to instead run Azahar using the `open` command, e.g.: - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 目前模擬速度, 「高於/低於」100% 代表模擬速度比 3DS 實機「更快/更慢」。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 不計算影格限制或垂直同步時, 模擬一個 3DS 影格所花的時間。全速模擬時,這個數值最多應為 16.67 毫秒。 - + Emulated notification LED - + MicroProfile (unavailable) - + Clear Recent Files 清除檔案使用紀錄 - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + Invalid system mode - + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. - + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA 檔案必須先安裝 - + Before using this CIA, you must install it. Do you want to install it now? CIA 檔案必須先安裝才能夠執行。您現在要安裝這個檔案嗎? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder 開啟 %1 資料夾時錯誤 - - + + Folder does not exist! 資料夾不存在! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel 取消 - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 開啟 %1 時錯誤 - + Select Directory 選擇目錄 - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 可執行檔案 (%1);;所有檔案 (*.*) - + Load File 讀取檔案 - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files 讀取多個檔案 - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) 所有檔案 (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. 已成功安裝 %1。 - + Unable to open File 無法開啟檔案 - + Could not open %1 無法開啟 %1 - + Installation aborted 安裝中斷 - + The installation of %1 was aborted. Please see the log for more details 安裝 %1 時中斷,請參閱日誌了解細節。 - + Invalid File 無效的檔案 - + %1 is not a valid CIA %1 不是有效的 CIA 檔案 - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - + + + + Z3DS Compression - + Failed to compress some files, check log for details. - + Failed to decompress some files, check log for details. - + All files have been compressed successfully. - + All files have been decompressed successfully. - + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found 找不到檔案 - + File "%1" not found 找不到「%1」 - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo 檔案 (%1);;所有檔案 (*.*) - + Load Amiibo 讀取 Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie 錄影 - + Movie recording cancelled. 錄影已取消。 - - + + Movie Saved 已儲存影片 - - + + The movie is successfully saved. 影片儲存成功。 - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4840,264 +4840,264 @@ To view a guide on how to install FFmpeg, press Help. - + Load 3DS ROM Files - + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds) - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - + Select Output 3DS Compressed ROM Folder - + Load 3DS Compressed ROM Files - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + Select Output 3DS ROM Folder - + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% 速度:%1% - + Speed: %1% / %2% 速度:%1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms 影格:%1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found 找不到系統檔案 - + System Archive Missing - + Save/load Error - + Fatal Error 嚴重錯誤 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue 繼續 - + Quit Application - + OK 確定 - + Would you like to exit now? 您確定要離開嗎? - + The application is still running. Would you like to stop emulation? - + Playback Completed 播放完成 - + Movie playback completed. 影片已結束播放。 - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window diff --git a/src/android/app/src/main/res/values-b+pt+BR/strings.xml b/src/android/app/src/main/res/values-b+pt+BR/strings.xml index 90c0875b2..859768387 100644 --- a/src/android/app/src/main/res/values-b+pt+BR/strings.xml +++ b/src/android/app/src/main/res/values-b+pt+BR/strings.xml @@ -565,6 +565,11 @@ Preparando Shaders Construindo %s + Excluir Cache de Shaders + Selecione a API gráfica para excluir o cache de shaders + Excluindo cache de shaders do título, aguarde... + Cache de shaders excluído + Jogar Desinstalar Aplicativo From 9701a3d8743bc8a53024c07f1d3f82eb06b676c2 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 21 Apr 2026 10:43:11 +0100 Subject: [PATCH 67/98] tools/README.md: Updated release checklist --- tools/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/README.md b/tools/README.md index b4db3f866..932c1778a 100644 --- a/tools/README.md +++ b/tools/README.md @@ -7,7 +7,15 @@ The scripts in this directory assume that your current working directory is the ## Pre-release checklist - [ ] Update compatibility list -- [ ] If this is a major release (2123.1 -> major.minor), update translations +- [ ] Update translations if either of the following apply: + - This is a major release (e.g. 2125.x --> 2126.0) + - This is a minor release, but the release branch hasn't yet diverged from master + +## Post-release checklist + +- [ ] Publish to Google Play Store +- [ ] Publish files to the official Internet Archive account (incl. changelog as .md file) +- [ ] Publish to Flathub ### Note: From b3ee2d8ac5a69e3bf310a67e716606dd98c4c14c Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 21 Apr 2026 14:55:40 +0100 Subject: [PATCH 68/98] tools/README.md: Re-updated release checklist Knew I'd forgotten something (: --- tools/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/README.md b/tools/README.md index 932c1778a..126b8822a 100644 --- a/tools/README.md +++ b/tools/README.md @@ -16,6 +16,7 @@ The scripts in this directory assume that your current working directory is the - [ ] Publish to Google Play Store - [ ] Publish files to the official Internet Archive account (incl. changelog as .md file) - [ ] Publish to Flathub +- [ ] Force-push tagged commit to retroarch-live branch ### Note: From b6c54ac8c7eec14df0706af613ecd29b5082be87 Mon Sep 17 00:00:00 2001 From: OpenSauce Date: Fri, 24 Apr 2026 14:04:16 +0100 Subject: [PATCH 69/98] Update PR template --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 66091f2c0..69460c695 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,5 @@ - [ ] I have read the [Azahar AI Policy document](https://github.com/azahar-emu/azahar/blob/master/AI-POLICY.md) and have disclosed any use of AI if applicable under those terms. +--------- --- 27.3.x AGP: 8.13.1 --> 8.13.2 --- src/android/app/build.gradle.kts | 3 +-- src/android/build.gradle.kts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 5e2dc1960..733656c0e 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -24,12 +24,11 @@ val abiFilter = listOf("arm64-v8a", "x86_64") val downloadedJniLibsPath = "${layout.buildDirectory.get().asFile.path}/downloadedJniLibs" -@Suppress("UnstableApiUsage") android { namespace = "org.citra.citra_emu" compileSdkVersion = "android-35" - ndkVersion = "27.1.12297006" + ndkVersion = "27.3.13750724" compileOptions { sourceCompatibility = JavaVersion.VERSION_17 diff --git a/src/android/build.gradle.kts b/src/android/build.gradle.kts index a0d43cb49..194907da3 100644 --- a/src/android/build.gradle.kts +++ b/src/android/build.gradle.kts @@ -4,8 +4,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.1" apply false - id("com.android.library") version "8.13.1" apply false + id("com.android.application") version "8.13.2" apply false + id("com.android.library") version "8.13.2" apply false id("org.jetbrains.kotlin.android") version "2.0.20" apply false id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20" } From eb498e5ecdd383129a888a94ab6ad4dd7057bc46 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sun, 26 Apr 2026 15:23:28 +0100 Subject: [PATCH 76/98] qt: Fixed outdated use of qt_add_lupdate --- src/citra_qt/CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index 839156723..4c20b510b 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -225,10 +225,13 @@ if (ENABLE_QT_TRANSLATION) if (GENERATE_QT_TRANSLATION) get_target_property(QT_SRCS citra_qt SOURCES) get_target_property(QT_INCLUDES citra_qt INCLUDE_DIRECTORIES) - qt_add_lupdate(citra_qt TS_FILES ${CITRA_QT_LANGUAGES}/en.ts + qt_add_lupdate( + LUPDATE_TARGET citra_qt_lupdate SOURCES ${QT_SRCS} ${UIS} + TS_FILES ${CITRA_QT_LANGUAGES}/en.ts INCLUDE_DIRECTORIES ${QT_INCLUDES} - NO_GLOBAL_TARGET) + NO_GLOBAL_TARGET + ) add_custom_target(translation ALL DEPENDS citra_qt_lupdate) endif() From ec6a0dd1c814d0ee22a9feeb73c7de2e530830b4 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sun, 26 Apr 2026 15:28:31 +0100 Subject: [PATCH 77/98] ci: Migrate Transifex runner to `latest` tag The `transifex` tag has now been removed due to a seperate image no longer being necessary --- .github/workflows/transifex.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/transifex.yml b/.github/workflows/transifex.yml index 8e9093be9..f9d073dd4 100644 --- a/.github/workflows/transifex.yml +++ b/.github/workflows/transifex.yml @@ -7,7 +7,7 @@ on: jobs: transifex: runs-on: ubuntu-latest - container: opensauce04/azahar-build-environment:transifex + container: opensauce04/azahar-build-environment:latest if: ${{ github.repository == 'azahar-emu/azahar' }} steps: - uses: actions/checkout@v4 From 83eef0012e80336be811d90deef33e95586cffc5 Mon Sep 17 00:00:00 2001 From: Rodrigo Iglesias <8595185+RigleGit@users.noreply.github.com> Date: Thu, 30 Apr 2026 09:50:32 +0200 Subject: [PATCH 78/98] macOS: normalize SDMC directory filenames (#2080) * macOS: normalize SDMC directory filenames * Guard macOS filename normalization behind __APPLE__ * Guard macOS filename normalization test * Apply clang-format * Update license headers --- src/common/string_util.cpp | 54 ++++++++++++++++++++++++++++++ src/common/string_util.h | 4 +++ src/core/file_sys/disk_archive.cpp | 24 ++++++++----- src/tests/common/file_util.cpp | 12 ++++++- 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 1637c01f1..117c19df2 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -1,3 +1,7 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + // Copyright 2013 Dolphin Emulator Project / 2014 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -20,6 +24,10 @@ #include #endif +#if defined(__APPLE__) +#include +#endif + namespace Common { /// Make a char lowercase @@ -164,6 +172,52 @@ std::u16string UTF8ToUTF16(std::string_view input) { return boost::locale::conv::utf_to_utf(input.data(), input.data() + input.size()); } +#if defined(__APPLE__) +// macOS filesystems may expose decomposed Unicode names through directory listings. +// Normalize to NFC before passing names to guest APIs that expect stable text. +std::string NormalizeNFDToNFC(std::string_view input) { + const std::string fallback(input); + + // Core Foundation string + CFStringRef source = + CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast(input.data()), + static_cast(input.size()), kCFStringEncodingUTF8, false); + + if (source == nullptr) { + return fallback; + } + + // Mutable copy of the source string + CFMutableStringRef normalized = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, source); + CFRelease(source); + + if (normalized == nullptr) { + return fallback; + } + // Normalize the string to NFC form + CFStringNormalize(normalized, kCFStringNormalizationFormC); + + const CFIndex max_size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(normalized), + kCFStringEncodingUTF8) + + 1; // +1 for null terminator + + std::string output(static_cast(max_size), '\0'); + + // Convert the normalized string back to UTF-8 + const bool converted = + CFStringGetCString(normalized, &output[0], max_size, kCFStringEncodingUTF8); + + CFRelease(normalized); + + if (!converted) { + return fallback; + } + + output.resize(std::strlen(output.c_str())); + return output; +} +#endif + #ifdef _WIN32 static std::wstring CPToUTF16(u32 code_page, const std::string& input) { const auto size = diff --git a/src/common/string_util.h b/src/common/string_util.h index 342434928..033c3ddb1 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -49,6 +49,10 @@ void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _P [[nodiscard]] std::string UTF16ToUTF8(std::u16string_view input); [[nodiscard]] std::u16string UTF8ToUTF16(std::string_view input); +// Returns UTF-8 normalized to NFC on platforms that need explicit Unicode normalization. +#if defined(__APPLE__) +[[nodiscard]] std::string NormalizeNFDToNFC(std::string_view input); +#endif #ifdef _WIN32 [[nodiscard]] std::string UTF16ToUTF8(const std::wstring& input); diff --git a/src/core/file_sys/disk_archive.cpp b/src/core/file_sys/disk_archive.cpp index a7ae5e92e..db0290df6 100644 --- a/src/core/file_sys/disk_archive.cpp +++ b/src/core/file_sys/disk_archive.cpp @@ -1,13 +1,15 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include +#include #include #include "common/archives.h" #include "common/common_types.h" #include "common/file_util.h" #include "common/logging/log.h" +#include "common/string_util.h" #include "core/file_sys/disk_archive.h" #include "core/file_sys/errors.h" @@ -62,22 +64,29 @@ u32 DiskDirectory::Read(const u32 count, Entry* entries) { while (entries_read < count && children_iterator != directory.children.cend()) { const FileUtil::FSTEntry& file = *children_iterator; + // Directory entries are exposed to the guest as UTF-16. Normalize host UTF-8 names first + // so host Unicode normalization differences do not leak into guest-visible SDMC paths. +#if defined(__APPLE__) + const std::string filename = Common::NormalizeNFDToNFC(file.virtualName); +#else const std::string& filename = file.virtualName; +#endif + const std::u16string filename_utf16 = Common::UTF8ToUTF16(filename); Entry& entry = entries[entries_read]; LOG_TRACE(Service_FS, "File {}: size={} dir={}", filename, file.size, file.isDirectory); - // TODO(Link Mauve): use a proper conversion to UTF-16. - for (std::size_t j = 0; j < FILENAME_LENGTH; ++j) { - entry.filename[j] = filename[j]; - if (!filename[j]) - break; + std::fill(std::begin(entry.filename), std::end(entry.filename), u'\0'); + + const std::size_t copy_length = std::min(filename_utf16.size(), FILENAME_LENGTH - 1); + for (std::size_t j = 0; j < copy_length; ++j) { + entry.filename[j] = filename_utf16[j]; } FileUtil::SplitFilename83(filename, entry.short_name, entry.extension); entry.is_directory = file.isDirectory; - entry.is_hidden = (filename[0] == '.'); + entry.is_hidden = (!filename.empty() && filename[0] == '.'); entry.is_read_only = 0; entry.file_size = file.size; @@ -92,5 +101,4 @@ u32 DiskDirectory::Read(const u32 count, Entry* entries) { } return entries_read; } - } // namespace FileSys diff --git a/src/tests/common/file_util.cpp b/src/tests/common/file_util.cpp index bd7fcbdd9..72734e0a9 100644 --- a/src/tests/common/file_util.cpp +++ b/src/tests/common/file_util.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -24,3 +24,13 @@ TEST_CASE("SplitFilename83 Sanity", "[common]") { REQUIRE(std::memcmp(short_name.data(), expected_short_name.data(), short_name.size()) == 0); REQUIRE(std::memcmp(extension.data(), expected_extension.data(), extension.size()) == 0); } + +#if defined(__APPLE__) + +TEST_CASE("NormalizeNFDToNFC Sanity", "[common]") { + const std::string decomposed = "i\xCC\x81"; + const std::string composed = "\xC3\xAD"; + + REQUIRE(Common::NormalizeNFDToNFC(decomposed) == composed); +} +#endif \ No newline at end of file From 76a71d76d4d5d846bb1f0d3ed438ec890f7e5128 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Mon, 4 May 2026 16:06:30 +0100 Subject: [PATCH 79/98] externals: Revert to a patched version of OpenAL v1.24.1 --- .gitmodules | 2 +- externals/openal-soft | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 18c5cc79a..e2460ab15 100644 --- a/.gitmodules +++ b/.gitmodules @@ -66,7 +66,7 @@ url = https://github.com/septag/dds-ktx [submodule "openal-soft"] path = externals/openal-soft - url = https://github.com/kcat/openal-soft + url = https://github.com/azahar-emu/openal-soft [submodule "glslang"] path = externals/glslang url = https://github.com/KhronosGroup/glslang diff --git a/externals/openal-soft b/externals/openal-soft index c41d64c6a..e399840fc 160000 --- a/externals/openal-soft +++ b/externals/openal-soft @@ -1 +1 @@ -Subproject commit c41d64c6a35f6174bf4a27010aeac52a8d3bb2c6 +Subproject commit e399840fc6aba5f7bc3f0633e8ff10bba0640906 From b081f800a4896ec6933a69c4a9ea0c126815693e Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Mon, 4 May 2026 16:38:40 +0100 Subject: [PATCH 80/98] Revert "ci: Override Android SDK Ninja with newer version" This reverts commit eee7f076eea4f7e643455dbcf9b00eb592bda542. --- .github/workflows/build.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c804ad5b4..0201aa3b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -256,18 +256,15 @@ jobs: echo "GIT_TAG_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV fi echo $GIT_TAG_NAME - - name: Update Android SDK CMake version - if: ${{ env.SHOULD_RUN == 'true' }} - run: | - yes | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "cmake;3.30.3" - name: Install tools if: ${{ env.SHOULD_RUN == 'true' }} run: | sudo apt-get update -y - sudo apt-get install -y apksigner ccache - echo "Checking ninja version..." - /usr/local/bin/ninja --version - ln -sf /usr/local/bin/ninja /usr/local/lib/android/sdk/cmake/3.30.3/bin/ninja + sudo apt-get install ccache apksigner -y + - name: Update Android SDK CMake version + if: ${{ env.SHOULD_RUN == 'true' }} + run: | + echo "y" | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "cmake;3.30.3" - name: Build if: ${{ env.SHOULD_RUN == 'true' }} run: JAVA_HOME=$JAVA_HOME_17_X64 ./.ci/android.sh From 5ddbaeae237954d1f9c1843e6cf75d8b160c2601 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Thu, 7 May 2026 01:36:21 +0200 Subject: [PATCH 81/98] gsp: Fix GPU interrupt queue and add GPU timing emulation (#2095) --- CMakeModules/GenerateSettingKeys.cmake | 1 + .../features/settings/SettingKeys.kt | 1 + .../features/settings/model/BooleanSetting.kt | 3 +- .../settings/ui/SettingsFragmentPresenter.kt | 9 + src/android/app/src/main/jni/config.cpp | 1 + src/android/app/src/main/jni/default_ini.h | 4 + .../app/src/main/res/values/strings.xml | 2 + src/citra_qt/configuration/config.cpp | 4 + .../configuration/configure_graphics.cpp | 9 + .../configuration/configure_graphics.h | 1 + .../configuration/configure_graphics.ui | 12 +- src/common/hacks/hack_list.cpp | 13 ++ src/common/hacks/hack_list.h | 1 + src/common/settings.cpp | 2 + src/common/settings.h | 3 +- src/core/core.cpp | 10 +- src/core/hle/service/gsp/gsp_gpu.cpp | 209 ++++++++++++++++-- src/core/hle/service/gsp/gsp_gpu.h | 126 ++++++++++- src/core/hle/service/gsp/gsp_interrupt.h | 19 +- src/video_core/gpu.cpp | 91 +++++++- src/video_core/pica/pica_core.cpp | 11 +- src/video_core/pica/pica_core.h | 83 +++++++ src/video_core/pica/regs_external.h | 18 +- 23 files changed, 592 insertions(+), 41 deletions(-) diff --git a/CMakeModules/GenerateSettingKeys.cmake b/CMakeModules/GenerateSettingKeys.cmake index 90110cd33..988c51575 100644 --- a/CMakeModules/GenerateSettingKeys.cmake +++ b/CMakeModules/GenerateSettingKeys.cmake @@ -48,6 +48,7 @@ foreach(KEY IN ITEMS "texture_filter" "texture_sampling" "delay_game_render_thread_us" + "simulate_3ds_gpu_timings" "layout_option" "swap_screen" "upright_screen" diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt index 1d6e0dcee..de2ab1118 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt @@ -45,6 +45,7 @@ object SettingKeys { external fun texture_filter(): String external fun texture_sampling(): String external fun delay_game_render_thread_us(): String + external fun simulate_3ds_gpu_timings(): String external fun layout_option(): String external fun swap_screen(): String external fun upright_screen(): String diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index e12d87544..cfa4aa946 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -56,7 +56,8 @@ enum class BooleanSetting( COMPRESS_INSTALLED_CIA_CONTENT(SettingKeys.compress_cia_installs(), Settings.SECTION_STORAGE, false), ANDROID_HIDE_IMAGES(SettingKeys.android_hide_images(), Settings.SECTION_MISC, false), APPLY_REGION_FREE_PATCH(SettingKeys.apply_region_free_patch(), Settings.SECTION_SYSTEM, true), - USE_INTEGER_SCALING(SettingKeys.use_integer_scaling(), Settings.SECTION_RENDERER, false); + USE_INTEGER_SCALING(SettingKeys.use_integer_scaling(), Settings.SECTION_RENDERER, false), + SIMULATE_3DS_GPU_TIMINGS(SettingKeys.simulate_3ds_gpu_timings(), Settings.SECTION_RENDERER, true); override var boolean: Boolean = defaultValue diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 25e56517f..3c12a5a8f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1790,6 +1790,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) BooleanSetting.VSYNC.defaultValue ) ) + add( + SwitchSetting( + BooleanSetting.SIMULATE_3DS_GPU_TIMINGS, + R.string.simulate_3ds_gpu_timings, + R.string.simulate_3ds_gpu_timings_description, + BooleanSetting.SIMULATE_3DS_GPU_TIMINGS.key, + BooleanSetting.SIMULATE_3DS_GPU_TIMINGS.defaultValue + ) + ) add( SwitchSetting( BooleanSetting.DEBUG_RENDERER, diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index e0fa260c5..aba68a623 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -179,6 +179,7 @@ void Config::ReadValues() { ReadSetting("Renderer", Settings::values.bg_blue); ReadSetting("Renderer", Settings::values.custom_second_layer_opacity); ReadSetting("Renderer", Settings::values.delay_game_render_thread_us); + ReadSetting("Renderer", Settings::values.simulate_3ds_gpu_timings); ReadSetting("Renderer", Settings::values.disable_right_eye_render); ReadSetting("Renderer", Settings::values.swap_eyes_3d); ReadSetting("Renderer", Settings::values.render_3d_which_display); diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index ce93d0e6f..46a796792 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -196,6 +196,10 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"( # Set to 0 for no delay, only useful in dynamic-fps games to simulate GPU delay. )") DECLARE_KEY(delay_game_render_thread_us) BOOST_HANA_STRING(R"( +# Delays GPU completion events based on measurements taken from real hardware +# 0: No delay, 1 (default): Enable delay +)") DECLARE_KEY(simulate_3ds_gpu_timings) BOOST_HANA_STRING(R"( + # Disables rendering the right eye image # Greatly improves performance in some games, but can cause flickering in others. # 0 : Enable right eye rendering, 1: Disable right eye rendering diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 08e927081..577d1737c 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -264,6 +264,8 @@ Enhances the visuals of applications by applying a filter to textures. The supported filters are Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale, and MMPX. Delay Game Render Thread Delay the game render thread when it submits data to the GPU. Helps with performance issues in the (very few) applications with dynamic framerates. + Simulate 3DS GPU Timings + Delays GPU completion events based on measurements taken from real hardware, so that games have more realistic GPU time measurements. Helps stabilize dynamic FPS games. Disabling this feature may improve performance in some rare cases at the cost of stability. Advanced Texture Sampling Overrides the sampling filter used by games. This can be useful in certain cases with poorly behaved games when upscaling. If unsure, set this to Game Controlled. diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index a5aa9896b..c797f61f5 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -722,6 +722,8 @@ void QtConfig::ReadRendererValues() { ReadGlobalSetting(Settings::values.delay_game_render_thread_us); ReadGlobalSetting(Settings::values.disable_right_eye_render); + ReadGlobalSetting(Settings::values.simulate_3ds_gpu_timings); + if (global) { ReadBasicSetting(Settings::values.use_shader_jit); } @@ -1266,6 +1268,8 @@ void QtConfig::SaveRendererValues() { WriteGlobalSetting(Settings::values.delay_game_render_thread_us); WriteGlobalSetting(Settings::values.disable_right_eye_render); + WriteGlobalSetting(Settings::values.simulate_3ds_gpu_timings); + if (global) { WriteSetting(Settings::QKeys::use_shader_jit, Settings::values.use_shader_jit.GetValue(), true); diff --git a/src/citra_qt/configuration/configure_graphics.cpp b/src/citra_qt/configuration/configure_graphics.cpp index aac27ab16..2a2ea3f6c 100644 --- a/src/citra_qt/configuration/configure_graphics.cpp +++ b/src/citra_qt/configuration/configure_graphics.cpp @@ -154,6 +154,7 @@ void ConfigureGraphics::SetConfiguration() { ui->toggle_display_refresh_rate_detection->setChecked( Settings::values.use_display_refresh_rate_detection.GetValue()); } + ui->simulate_3ds_gpu_timings->setChecked(Settings::values.simulate_3ds_gpu_timings.GetValue()); } void ConfigureGraphics::ApplyConfiguration() { @@ -182,6 +183,9 @@ void ConfigureGraphics::ApplyConfiguration() { ConfigurationShared::ApplyPerGameSetting( &Settings::values.delay_game_render_thread_us, ui->delay_render_combo, [this](s32) { return ui->delay_render_slider->value(); }); + ConfigurationShared::ApplyPerGameSetting(&Settings::values.simulate_3ds_gpu_timings, + ui->simulate_3ds_gpu_timings, + simulate_3ds_gpu_timings); if (Settings::IsConfiguringGlobal()) { Settings::values.use_shader_jit = ui->toggle_shader_jit->isChecked(); @@ -212,6 +216,8 @@ void ConfigureGraphics::SetupPerGameUI() { ui->physical_device_combo->setEnabled(Settings::values.physical_device.UsingGlobal()); ui->delay_render_combo->setEnabled( Settings::values.delay_game_render_thread_us.UsingGlobal()); + ui->simulate_3ds_gpu_timings->setEnabled( + Settings::values.simulate_3ds_gpu_timings.UsingGlobal()); return; } @@ -254,6 +260,9 @@ void ConfigureGraphics::SetupPerGameUI() { ConfigurationShared::SetColoredTristate(ui->disable_spirv_optimizer, Settings::values.disable_spirv_optimizer, disable_spirv_optimizer); + ConfigurationShared::SetColoredTristate(ui->simulate_3ds_gpu_timings, + Settings::values.simulate_3ds_gpu_timings, + simulate_3ds_gpu_timings); } void ConfigureGraphics::SetPhysicalDeviceComboVisibility(int index) { diff --git a/src/citra_qt/configuration/configure_graphics.h b/src/citra_qt/configuration/configure_graphics.h index 61a462a67..f4ec4f104 100644 --- a/src/citra_qt/configuration/configure_graphics.h +++ b/src/citra_qt/configuration/configure_graphics.h @@ -44,6 +44,7 @@ private: ConfigurationShared::CheckState async_presentation; ConfigurationShared::CheckState spirv_shader_gen; ConfigurationShared::CheckState disable_spirv_optimizer; + ConfigurationShared::CheckState simulate_3ds_gpu_timings; std::unique_ptr ui; QColor bg_color; }; diff --git a/src/citra_qt/configuration/configure_graphics.ui b/src/citra_qt/configuration/configure_graphics.ui index ff5ec613f..7f9a01956 100644 --- a/src/citra_qt/configuration/configure_graphics.ui +++ b/src/citra_qt/configuration/configure_graphics.ui @@ -372,7 +372,7 @@ 0 - 16000 + 65000 100 @@ -404,6 +404,16 @@ + + + + <html><head/><body><p>Delays GPU completion events based on measurements taken from real hardware, so that games have more realistic GPU time measurements. Helps stabilize dynamic FPS games. Disabling this feature may improve performance in some rare cases at the cost of stability.</p></body></html> + + + Simulate 3DS GPU timings + + + diff --git a/src/common/hacks/hack_list.cpp b/src/common/hacks/hack_list.cpp index 5f320c673..73662c028 100644 --- a/src/common/hacks/hack_list.cpp +++ b/src/common/hacks/hack_list.cpp @@ -198,5 +198,18 @@ HackManager hack_manager = { 0x00040000001D1A00, // EUR }, }}, + {HackType::DELAY_TEXTURE_COPY_COMPLETION, + HackEntry{ + .mode = HackAllowMode::FORCE, + .affected_title_ids = + { + // Super Mario 3D Land + 0x0004000000054100, // JPN + 0x0004000000054000, // USA + 0x0004000000053F00, // EUR + 0x0004000000089E00, // CHN + 0x0004000000089D00, // KOR + }, + }}, }}; } \ No newline at end of file diff --git a/src/common/hacks/hack_list.h b/src/common/hacks/hack_list.h index 61a8cccfa..1c34d22e0 100644 --- a/src/common/hacks/hack_list.h +++ b/src/common/hacks/hack_list.h @@ -16,6 +16,7 @@ enum class HackType : int { REGION_FROM_SECURE, REQUIRES_SHADER_FIXUP, SPOOF_FRIEND_CODE_SEED, + DELAY_TEXTURE_COPY_COMPLETION, }; class UserHackData {}; diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 2ac231f50..db40cc951 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -106,6 +106,7 @@ void LogSettings() { log_setting("Renderer_TextureSampling", GetTextureSamplingName(values.texture_sampling.GetValue())); log_setting("Renderer_DelayGameRenderThreasUs", values.delay_game_render_thread_us.GetValue()); + log_setting("Renderer_Simulate3DSGPUTimings", values.simulate_3ds_gpu_timings.GetValue()); log_setting("Renderer_DisableRightEyeRender", values.disable_right_eye_render.GetValue()); log_setting("Stereoscopy_Render3d", values.render_3d.GetValue()); log_setting("Stereoscopy_Factor3d", values.factor_3d.GetValue()); @@ -215,6 +216,7 @@ void RestoreGlobalState(bool is_powered_on) { values.texture_filter.SetGlobal(true); values.texture_sampling.SetGlobal(true); values.delay_game_render_thread_us.SetGlobal(true); + values.simulate_3ds_gpu_timings.SetGlobal(true); values.layout_option.SetGlobal(true); values.portrait_layout_option.SetGlobal(true); values.secondary_display_layout.SetGlobal(true); diff --git a/src/common/settings.h b/src/common/settings.h index 5eca53421..730128885 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -540,8 +540,9 @@ struct Values { SwitchableSetting texture_filter{TextureFilter::NoFilter, Keys::texture_filter}; SwitchableSetting texture_sampling{TextureSampling::GameControlled, Keys::texture_sampling}; - SwitchableSetting delay_game_render_thread_us{0, 0, 16000, + SwitchableSetting delay_game_render_thread_us{0, 0, 65000, Keys::delay_game_render_thread_us}; + SwitchableSetting simulate_3ds_gpu_timings{true, Keys::simulate_3ds_gpu_timings}; SwitchableSetting layout_option{LayoutOption::Default, Keys::layout_option}; SwitchableSetting swap_screen{false, Keys::swap_screen}; diff --git a/src/core/core.cpp b/src/core/core.cpp index 0132e24bd..597f4c525 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -581,8 +581,9 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, auto gsp = service_manager->GetService("gsp::Gpu"); gpu = std::make_unique(*this, emu_window, secondary_window); - gpu->SetInterruptHandler( - [gsp](Service::GSP::InterruptId interrupt_id) { gsp->SignalInterrupt(interrupt_id); }); + gpu->SetInterruptHandler([gsp](Service::GSP::InterruptId interrupt_id, u64 wait_delay_ns) { + gsp->SignalInterrupt(interrupt_id, wait_delay_ns); + }); auto plg_ldr = Service::PLGLDR::GetService(*this); if (plg_ldr) { @@ -902,8 +903,9 @@ void System::serialize(Archive& ar, const unsigned int file_version) { // Re-register gpu callback, because gsp service changed after service_manager got // serialized auto gsp = service_manager->GetService("gsp::Gpu"); - gpu->SetInterruptHandler( - [gsp](Service::GSP::InterruptId interrupt_id) { gsp->SignalInterrupt(interrupt_id); }); + gpu->SetInterruptHandler([gsp](Service::GSP::InterruptId interrupt_id, u64 wait_delay_ns) { + gsp->SignalInterrupt(interrupt_id, wait_delay_ns); + }); // Apply per program settings and switch the shader cache to the title running when the // savestate was created. diff --git a/src/core/hle/service/gsp/gsp_gpu.cpp b/src/core/hle/service/gsp/gsp_gpu.cpp index 39d10f2d3..853dd8d3c 100644 --- a/src/core/hle/service/gsp/gsp_gpu.cpp +++ b/src/core/hle/service/gsp/gsp_gpu.cpp @@ -12,6 +12,7 @@ #include "common/hacks/hack_manager.h" #include "common/settings.h" #include "core/core.h" +#include "core/core_timing.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/shared_memory.h" #include "core/hle/kernel/shared_page.h" @@ -295,6 +296,23 @@ void GSP_GPU::SetAxiConfigQoSMode(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_GSP, "(STUBBED) called mode=0x{:08X}", mode); } +void GSP_GPU::SetPerfLogMode(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + bool enabled = rp.Pop() != 0; + + perf_recorder.SetEnabled(enabled); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultSuccess); +} + +void GSP_GPU::GetPerfLog(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + + IPC::RequestBuilder rb = rp.MakeBuilder(15, 0); + rb.PushRaw(perf_recorder.GetResults()); +} + void GSP_GPU::RegisterInterruptRelayQueue(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); u32 flags = rp.Pop(); @@ -337,7 +355,124 @@ void GSP_GPU::UnregisterInterruptRelayQueue(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_GSP, "called"); } -void GSP_GPU::SignalInterruptForThread(InterruptId interrupt_id, u32 thread_id) { +// Uncomment the following line to display the average delay calculated for every frame. +// #define SHOW_AVERAGE_TIME_PER_FRAME + +void GSP_GPU::SignalInterruptForThread(InterruptId interrupt_id, u32 thread_id, u64 wait_delay_ns) { + + // Every gsp request takes a constant amount of time to be + // processed and control returned to the application. This + // time is estimated below. + static constexpr u64 sync_delay_nanoseconds = 300 * 1000; + + // For a reason not yet understood, Super Mario 3D Land hangs on a white screen after the title + // screen when any of the save slots have the completion star icons. This is in some way related + // to the timings of texture copy commands, and gets fixed if we increase the amount of time + // those take. This issue may be resolved as timings become more accurate in the future. + static constexpr u64 sync_delay_nanoseconds_delayed_texcopy = 1000 * 1000; + +#ifdef SHOW_AVERAGE_TIME_PER_FRAME + auto track_average = [&](bool is_vsync) { + using clock = std::chrono::steady_clock; + + static uint64_t total_ns = 0; + static uint64_t sample_count = 0; + static auto last_print = clock::now(); + + if (!is_vsync) { + total_ns += wait_delay_ns; + ++sample_count; + } + + auto now = clock::now(); + + if (now - last_print >= std::chrono::milliseconds(250)) { + double average_ns = + (sample_count > 0) + ? (static_cast(total_ns) / static_cast(sample_count)) + : 0; + + LOG_INFO(Service_GSP, "Average delay milliseconds per frame: {}", + average_ns / 1000000.f); + + total_ns = 0; + sample_count = 0; + last_print = now; + } + }; +#endif + + // Signal VBlank interrupt immediately, this interrupt is signaled from + // an scheduler event so it already has the proper timing. + if (interrupt_id == InterruptId::PDC0 || interrupt_id == InterruptId::PDC1) { + +#ifdef SHOW_AVERAGE_TIME_PER_FRAME + track_average(true); +#endif + + if (perf_recorder.IsEnabled()) { + constexpr u64 nanoseconds_per_frame = static_cast( + ((static_cast(VideoCore::FRAME_TICKS) / BASE_CLOCK_RATE_ARM11) * 1e9)); + + perf_recorder.UpdateTime(interrupt_id, nanoseconds_per_frame); + } + + ProcessPendingInterruptImpl(interrupt_id, thread_id); + return; + } + + if (perf_recorder.IsEnabled()) { + perf_recorder.UpdateTime(interrupt_id, wait_delay_ns); + } + + if (Settings::values.simulate_3ds_gpu_timings.GetValue()) { + + if (delay_texture_copy_completion) { + wait_delay_ns += (interrupt_id == InterruptId::PPF) + ? sync_delay_nanoseconds_delayed_texcopy + : sync_delay_nanoseconds; + } else { + wait_delay_ns += sync_delay_nanoseconds; + } + } else { + if (delay_texture_copy_completion && interrupt_id == InterruptId::PPF) { + wait_delay_ns += sync_delay_nanoseconds_delayed_texcopy; + } else { + wait_delay_ns = 0; + } + } + +#ifdef SHOW_AVERAGE_TIME_PER_FRAME + track_average(false); +#endif + + if (wait_delay_ns) { + size_t pending_interrupt_id = + pending_interrupts.Push(std::make_pair(interrupt_id, thread_id)); + if (pending_interrupt_id == std::numeric_limits::max()) { + LOG_ERROR(Service_GSP, "Pending interrupts queue is full"); + ProcessPendingInterruptImpl(interrupt_id, thread_id); + } else { + system.Kernel().timing.ScheduleEvent(nsToCycles(wait_delay_ns), + SignalInterruptEventType, + static_cast(pending_interrupt_id)); + } + } else { + ProcessPendingInterruptImpl(interrupt_id, thread_id); + } +} + +void Service::GSP::GSP_GPU::ProcessPendingInterrupt(size_t pending_interrupt_id) { + auto pending_interrupt = pending_interrupts.Pop(pending_interrupt_id); + if (!pending_interrupt.has_value()) { + return; + } + const auto& [interrupt_id, thread_id] = *pending_interrupt; + + ProcessPendingInterruptImpl(interrupt_id, thread_id); +} + +void Service::GSP::GSP_GPU::ProcessPendingInterruptImpl(InterruptId interrupt_id, u32 thread_id) { SessionData* session_data = FindRegisteredThreadData(thread_id); if (!session_data) { return; @@ -349,32 +484,55 @@ void GSP_GPU::SignalInterruptForThread(InterruptId interrupt_id, u32 thread_id) return; } + const bool is_pdc = interrupt_id == InterruptId::PDC0 || interrupt_id == InterruptId::PDC1; auto* interrupt_relay_queue = GetInterruptRelayQueue(thread_id); - u8 next = interrupt_relay_queue->index; - next += interrupt_relay_queue->number_interrupts; - next = next % 0x34; // 0x34 is the number of interrupt slots - interrupt_relay_queue->number_interrupts += 1; + auto queue_interrupt = [&]() { + if (interrupt_relay_queue->number_interrupts >= InterruptRelayQueue::max_slots) { + interrupt_relay_queue->error_code = InterruptRelayQueue::queue_full_error; + } else { + u8 next = interrupt_relay_queue->index; + next += interrupt_relay_queue->number_interrupts; + next %= InterruptRelayQueue::max_slots; - interrupt_relay_queue->slot[next] = interrupt_id; - interrupt_relay_queue->error_code = 0x0; // No error + interrupt_relay_queue->number_interrupts += 1; + + interrupt_relay_queue->slot[next] = interrupt_id; + + interrupt_event->Signal(); + } + }; + + if (is_pdc) { + if (!interrupt_relay_queue->ignore_pdc.Value()) { + + if (interrupt_relay_queue->number_interrupts >= + InterruptRelayQueue::stop_queuing_pdc_threeshold) { + if (interrupt_id == InterruptId::PDC0) { + interrupt_relay_queue->missed_PDC0++; + } else { + interrupt_relay_queue->missed_PDC1++; + } + } else { + queue_interrupt(); + } + } + + // Update framebuffer information if requested + const s32 screen_id = (interrupt_id == InterruptId::PDC0) ? 0 : 1; - // Update framebuffer information if requested - const s32 screen_id = (interrupt_id == InterruptId::PDC0) ? 0 - : (interrupt_id == InterruptId::PDC1) ? 1 - : -1; - if (screen_id != -1) { auto* info = GetFrameBufferInfo(thread_id, screen_id); if (info->is_dirty) { system.GPU().SetBufferSwap(screen_id, info->framebuffer_info[info->index]); info->is_dirty.Assign(false); } - } - interrupt_event->Signal(); + } else { + queue_interrupt(); + } } -void GSP_GPU::SignalInterrupt(InterruptId interrupt_id) { +void GSP_GPU::SignalInterrupt(InterruptId interrupt_id, u64 wait_delay_ns) { if (nullptr == shared_memory) { LOG_WARNING(Service_GSP, "cannot synchronize until GSP shared memory has been created!"); return; @@ -385,7 +543,7 @@ void GSP_GPU::SignalInterrupt(InterruptId interrupt_id) { // right), but the PDC0/1 interrupts are signaled for every registered thread. if (interrupt_id == InterruptId::PDC0 || interrupt_id == InterruptId::PDC1) { for (u32 thread_id = 0; thread_id < MaxGSPThreads; ++thread_id) { - SignalInterruptForThread(interrupt_id, thread_id); + SignalInterruptForThread(interrupt_id, thread_id, wait_delay_ns); } return; } @@ -395,7 +553,7 @@ void GSP_GPU::SignalInterrupt(InterruptId interrupt_id) { return; } - SignalInterruptForThread(interrupt_id, active_thread_id); + SignalInterruptForThread(interrupt_id, active_thread_id, wait_delay_ns); } void GSP_GPU::SetLcdForceBlack(Kernel::HLERequestContext& ctx) { @@ -692,6 +850,11 @@ Result GSP_GPU::AcquireGpuRight(const Kernel::HLERequestContext& ctx, Common::Hacks::HackType::REQUIRES_SHADER_FIXUP, process->codeset->program_id, Common::Hacks::HackAllowMode::DISALLOW) != Common::Hacks::HackAllowMode::DISALLOW; + delay_texture_copy_completion = + Common::Hacks::hack_manager.GetHackAllowMode( + Common::Hacks::HackType::DELAY_TEXTURE_COPY_COMPLETION, process->codeset->program_id, + Common::Hacks::HackAllowMode::DISALLOW) != Common::Hacks::HackAllowMode::DISALLOW; + auto& gpu = system.GPU(); gpu.ApplyPerProgramSettings(process->codeset->program_id); gpu.GetRightEyeDisabler().SetEnabled(right_eye_disable_allow); @@ -818,6 +981,9 @@ void GSP_GPU::serialize(Archive& ar, const unsigned int) { ar & first_initialization; ar & used_thread_ids; ar & saved_vram; + ar & delay_texture_copy_completion; + ar & pending_interrupts; + ar & perf_recorder; } SERIALIZE_IMPL(GSP_GPU) @@ -840,8 +1006,8 @@ GSP_GPU::GSP_GPU(Core::System& system) : ServiceFramework("gsp::Gpu", 4), system {0x000E, nullptr, "SetTextureCopy"}, {0x000F, nullptr, "SetMemoryFill"}, {0x0010, &GSP_GPU::SetAxiConfigQoSMode, "SetAxiConfigQoSMode"}, - {0x0011, nullptr, "SetPerfLogMode"}, - {0x0012, nullptr, "GetPerfLog"}, + {0x0011, &GSP_GPU::SetPerfLogMode, "SetPerfLogMode"}, + {0x0012, &GSP_GPU::GetPerfLog, "GetPerfLog"}, {0x0013, &GSP_GPU::RegisterInterruptRelayQueue, "RegisterInterruptRelayQueue"}, {0x0014, &GSP_GPU::UnregisterInterruptRelayQueue, "UnregisterInterruptRelayQueue"}, {0x0015, &GSP_GPU::TryAcquireRight, "TryAcquireRight"}, @@ -866,6 +1032,11 @@ GSP_GPU::GSP_GPU(Core::System& system) : ServiceFramework("gsp::Gpu", 4), system Kernel::MemoryRegion::BASE, "GSP:SharedMemory") .Unwrap(); + SignalInterruptEventType = system.Kernel().timing.RegisterEvent( + "GSPPendingInterrupt", [this](uintptr_t arg, s64 cycle_late) { + ProcessPendingInterrupt(static_cast(arg)); + }); + first_initialization = true; }; diff --git a/src/core/hle/service/gsp/gsp_gpu.h b/src/core/hle/service/gsp/gsp_gpu.h index 0864e37de..3afbb0916 100644 --- a/src/core/hle/service/gsp/gsp_gpu.h +++ b/src/core/hle/service/gsp/gsp_gpu.h @@ -4,8 +4,10 @@ #pragma once +#include #include #include +#include #include #include #include @@ -104,7 +106,7 @@ public: * Signals that the specified interrupt type has occurred to userland code * @param interrupt_id ID of interrupt that is being signalled */ - void SignalInterrupt(InterruptId interrupt_id); + void SignalInterrupt(InterruptId interrupt_id, u64 wait_delay_ns); /** * Retrieves the framebuffer info stored in the GSP shared memory for the @@ -143,7 +145,11 @@ private: * @param interrupt_id ID of interrupt that is being signalled. * @param thread_id GSP thread that will receive the interrupt. */ - void SignalInterruptForThread(InterruptId interrupt_id, u32 thread_id); + void SignalInterruptForThread(InterruptId interrupt_id, u32 thread_id, u64 wait_delay_ns); + + void ProcessPendingInterrupt(size_t pending_interrupt_id); + + void ProcessPendingInterruptImpl(InterruptId interrupt_id, u32 thread_id); /** * GSP_GPU::WriteHWRegs service function @@ -240,6 +246,10 @@ private: */ void SetAxiConfigQoSMode(Kernel::HLERequestContext& ctx); + void SetPerfLogMode(Kernel::HLERequestContext& ctx); + + void GetPerfLog(Kernel::HLERequestContext& ctx); + /** * GSP_GPU::RegisterInterruptRelayQueue service function * Inputs: @@ -405,6 +415,118 @@ private: /// Thread ids currently in use by the sessions connected to the GSPGPU service. std::array used_thread_ids{}; + /// The current thread needs a longer emulated texture copy completion + bool delay_texture_copy_completion{}; + + class PendingInterruptArray { + public: + PendingInterruptArray() { + for (size_t i = 0; i < array_size; i++) { + elements[i].first = InterruptId::COUNT; + } + } + + size_t Push(const std::pair elem) { + if (elements[head].first != InterruptId::COUNT) { + // If the head position is occupied, the queue is full + return std::numeric_limits::max(); + } + + elements[head] = elem; + size_t index = head; + head = (head + 1) % array_size; + return index; + } + + std::optional> Pop(size_t at) { + if (at >= array_size || elements[at].first == InterruptId::COUNT) { + // Invalid index or already free + return std::nullopt; + } + + std::pair value = elements[at]; + elements[at].first = InterruptId::COUNT; + + return value; + } + + private: + static constexpr size_t array_size = 512; + size_t head = 0; + + std::array, array_size> elements; + + template + void serialize(Archive& ar, const unsigned int) { + ar & elements; + ar & head; + } + friend class boost::serialization::access; + }; + + class PerformanceRecorder { + public: + struct PerformanceEntry { + u32 delta_time{}; + u32 sum_time{}; + + template + void serialize(Archive& ar, const unsigned int) { + ar & delta_time; + ar & sum_time; + } + friend class boost::serialization::access; + }; + + using PerfArray = std::array(InterruptId::COUNT)>; + + PerformanceRecorder() = default; + + void Reset() { + entries.fill({}); + } + + bool IsEnabled() { + return enabled; + } + + void SetEnabled(bool _enabled) { + enabled = _enabled; + if (enabled) { + Reset(); + } + } + + void UpdateTime(InterruptId id, u64 nanoseconds) { + // These counters may overflow, which is normal. + entries[static_cast(id)].delta_time = static_cast(nanoseconds); + entries[static_cast(id)].sum_time += static_cast(nanoseconds); + } + + const PerfArray& GetResults() { + return entries; + } + + private: + PerfArray entries{}; + bool enabled{}; + + template + void serialize(Archive& ar, const unsigned int) { + ar & entries; + ar & enabled; + } + friend class boost::serialization::access; + }; + + // This array is only needed to keep track of delayed notifications and simulate the GPU + // taking some time to finish the work, it doesn't exist on real hardware. + PendingInterruptArray pending_interrupts; + + PerformanceRecorder perf_recorder; + + Core::TimingEventType* SignalInterruptEventType = nullptr; + friend class SessionData; template diff --git a/src/core/hle/service/gsp/gsp_interrupt.h b/src/core/hle/service/gsp/gsp_interrupt.h index db2b584a6..efd46b39e 100644 --- a/src/core/hle/service/gsp/gsp_interrupt.h +++ b/src/core/hle/service/gsp/gsp_interrupt.h @@ -1,10 +1,11 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include +#include "common/bit_field.h" #include "common/common_types.h" namespace Service::GSP { @@ -18,25 +19,35 @@ enum class InterruptId : u8 { PPF = 0x04, P3D = 0x05, DMA = 0x06, + + COUNT, }; /// GSP thread interrupt relay queue struct InterruptRelayQueue { + static constexpr size_t max_slots = 0x34; + static constexpr size_t stop_queuing_pdc_threeshold = 0x20; + static constexpr u8 queue_full_error = 0x1; + // Index of last interrupt in the queue u8 index; // Number of interrupts remaining to be processed by the userland code u8 number_interrupts; // Error code - zero on success, otherwise an error has occurred u8 error_code; - u8 padding1; + + union { + u8 config; + BitField<0, 1, u8> ignore_pdc; + }; u32 missed_PDC0; u32 missed_PDC1; - InterruptId slot[0x34]; ///< Interrupt ID slots + InterruptId slot[max_slots]; ///< Interrupt ID slots }; static_assert(sizeof(InterruptRelayQueue) == 0x40, "InterruptRelayQueue struct has incorrect size"); -using InterruptHandler = std::function; +using InterruptHandler = std::function; } // namespace Service::GSP diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 9a76f4859..735144f42 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -26,6 +26,63 @@ namespace VideoCore { constexpr VAddr VADDR_LCD = 0x1ED02000; constexpr VAddr VADDR_GPU = 0x1EF00000; +class DelayGenerator { +private: + DelayGenerator() = default; + + // Average transfer speed based on measurements taken from real + // hardware. 4 different modes have been taken into consideration: + // RAM -> RAM, RAM -> VRAM, VRAM -> RAM and VRAM -> VRAM. + // Furthermore, measurements are split into DMA transfers and tex + // copies. For simplicity, we will assume fills are as fast as + // texture copies. + + static constexpr double mibps_to_ns_per_byte(double mib_per_sec) { + return 1'000'000'000.0 / (mib_per_sec * 1024.0 * 1024.0); + } + + static constexpr std::array, 2> speed_mibps = { + {{ + 190.0, // DMA RAMTORAM + 310.0, // DMA RAMTOVRAM + 380.0, // DMA VRAMTORAM + 380.0, // DMA VRAMTOVRAM + }, + { + 450.0, // TEX RAMTORAM + 3100.0, // TEX RAMTOVRAM + 5400.0, // TEX VRAMTORAM + 5400.0, // TEX VRAMTOVRAM + }}}; + +public: + enum class CopyMode { + RAMTORAM, + RAMTOVRAM, + VRAMTORAM, + VRAMTOVRAM, + }; + + static CopyMode GetCopyMode(bool input_vram, bool output_vram) { + if (!input_vram && !output_vram) { + return CopyMode::RAMTORAM; + } else if (!input_vram && output_vram) { + return CopyMode::RAMTOVRAM; + } else if (input_vram && !output_vram) { + return CopyMode::VRAMTORAM; + } else { + return CopyMode::VRAMTOVRAM; + } + } + + static u64 CalculateDelayNanoseconds(CopyMode mode, bool is_textre, size_t size) { + double base_ns_per_byte = + mibps_to_ns_per_byte(speed_mibps[is_textre][static_cast(mode)]); + + return static_cast(size * base_ns_per_byte); + } +}; + MICROPROFILE_DEFINE(GPU_DisplayTransfer, "GPU", "DisplayTransfer", MP_RGB(100, 100, 255)); MICROPROFILE_DEFINE(GPU_CmdlistProcessing, "GPU", "Cmdlist Processing", MP_RGB(100, 255, 100)); @@ -102,7 +159,17 @@ void GPU::Execute(const Service::GSP::Command& command) { const auto process = impl->system.Kernel().GetCurrentProcess(); impl->memory.CopyBlock(*process, command.dma_request.dest_address, command.dma_request.source_address, command.dma_request.size); - impl->signal_interrupt(Service::GSP::InterruptId::DMA); + + auto is_vram = [&](u32 addr) { + return addr >= Memory::VRAM_VADDR && addr <= Memory::VRAM_VADDR_END; + }; + + u64 delay = DelayGenerator::CalculateDelayNanoseconds( + DelayGenerator::GetCopyMode(is_vram(command.dma_request.source_address), + is_vram(command.dma_request.dest_address)), + false, command.dma_request.size); + + impl->signal_interrupt(Service::GSP::InterruptId::DMA, delay); break; } case CommandId::SubmitCmdList: { @@ -361,13 +428,18 @@ void GPU::MemoryFill(u32 index, u32 intr_index) { impl->sw_blitter->MemoryFill(config); } + // Treat fill as texture transfer from VRAM + u64 delay = DelayGenerator::CalculateDelayNanoseconds( + DelayGenerator::GetCopyMode(true, config.IsVRAM()), true, + config.GetEndAddress() - config.GetStartAddress()); + // It seems that it won't signal interrupt if "address_start" is zero. // TODO: hwtest this if (config.GetStartAddress() != 0) { if (intr_index == 0) { - impl->signal_interrupt(Service::GSP::InterruptId::PSC0); + impl->signal_interrupt(Service::GSP::InterruptId::PSC0, delay); } else if (intr_index == 1) { - impl->signal_interrupt(Service::GSP::InterruptId::PSC1); + impl->signal_interrupt(Service::GSP::InterruptId::PSC1, delay); } } @@ -391,11 +463,15 @@ void GPU::MemoryTransfer() { impl->debug_context->OnEvent(Pica::DebugContext::Event::IncomingDisplayTransfer, nullptr); } + u64 delay{}; // Perform memory transfer if (config.is_texture_copy) { if (!impl->rasterizer->AccelerateTextureCopy(config)) { impl->sw_blitter->TextureCopy(config); } + delay = DelayGenerator::CalculateDelayNanoseconds( + DelayGenerator::GetCopyMode(config.IsInputVRAM(), config.IsOutputVRAM()), true, + config.texture_copy.size); } else { if (right_eye_disabler->ShouldAllowDisplayTransfer(config.GetPhysicalInputAddress(), config.input_height)) { @@ -403,11 +479,14 @@ void GPU::MemoryTransfer() { impl->sw_blitter->DisplayTransfer(config); } } + delay = DelayGenerator::CalculateDelayNanoseconds( + DelayGenerator::GetCopyMode(config.IsInputVRAM(), config.IsOutputVRAM()), true, + config.input_width * config.input_height * BytesPerPixel(config.input_format)); } // Complete transfer. config.trigger.Assign(0); - impl->signal_interrupt(Service::GSP::InterruptId::PPF); + impl->signal_interrupt(Service::GSP::InterruptId::PPF, delay); } void GPU::VBlankCallback(std::uintptr_t user_data, s64 cycles_late) { @@ -415,8 +494,8 @@ void GPU::VBlankCallback(std::uintptr_t user_data, s64 cycles_late) { impl->renderer->SwapBuffers(); // Signal to GSP that GPU interrupt has occurred - impl->signal_interrupt(Service::GSP::InterruptId::PDC0); - impl->signal_interrupt(Service::GSP::InterruptId::PDC1); + impl->signal_interrupt(Service::GSP::InterruptId::PDC0, 0); + impl->signal_interrupt(Service::GSP::InterruptId::PDC1, 0); // Reschedule recurrent event impl->timing.ScheduleEvent(FRAME_TICKS - cycles_late, impl->vblank_event); diff --git a/src/video_core/pica/pica_core.cpp b/src/video_core/pica/pica_core.cpp index 9f19e9572..d264c35b5 100644 --- a/src/video_core/pica/pica_core.cpp +++ b/src/video_core/pica/pica_core.cpp @@ -98,7 +98,7 @@ void PicaCore::SetInterruptHandler(Service::GSP::InterruptHandler& signal_interr void PicaCore::ProcessCmdList(PAddr list, u32 size, bool ignore_list) { if (ignore_list) { - signal_interrupt(Service::GSP::InterruptId::P3D); + signal_interrupt(Service::GSP::InterruptId::P3D, delay_generator.CalculateAndResetDelay()); return; } // Initialize command list tracking. @@ -148,6 +148,8 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask, bool& stop_requeste return; } + delay_generator.AddCommands(1); + // Expand a 4-bit mask to 4-byte mask, e.g. 0b0101 -> 0x00FF00FF constexpr std::array ExpandBitsToBytes = { 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 0x00ff0000, 0x00ff00ff, @@ -174,7 +176,8 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask, bool& stop_requeste // TODO(PabloMK7): This logic is not fully accurate, but close enough: // https://problemkaputt.de/gbatek-3ds-gpu-internal-registers-finalize-interrupt-registers.htm if (any_byte_match(regs.internal.reg_array[id], regs.internal.irq_compare)) [[likely]] { - signal_interrupt(Service::GSP::InterruptId::P3D); + signal_interrupt(Service::GSP::InterruptId::P3D, + delay_generator.CalculateAndResetDelay()); if (regs.internal.irq_autostop) [[likely]] { stop_requested = true; } @@ -551,6 +554,10 @@ void PicaCore::DrawArrays(bool is_indexed) { return accelerate_draw; }(); + // Add vertices to the delay generator. + delay_generator.AddVertices(regs.internal.pipeline.num_vertices, + regs.internal.pipeline.triangle_topology); + // Attempt to use hardware vertex shaders if possible. if (accelerate_draw && rasterizer->AccelerateDrawBatch(is_indexed)) { return; diff --git a/src/video_core/pica/pica_core.h b/src/video_core/pica/pica_core.h index 61d8e75c2..426a3ca8e 100644 --- a/src/video_core/pica/pica_core.h +++ b/src/video_core/pica/pica_core.h @@ -29,6 +29,86 @@ namespace Pica { class DebugContext; class ShaderEngine; +class DelayGenerator { +private: + // A GPU is a very complex system, the timings resulting from + // a 3D draw depend on many factors, including triangle counts, + // texture sizes and format, shader complexity, cache + // and memory layout, etc. At this point in time, we don't + // have enough information nor implemented hw emulation + // capabilities to achieve a proper timing estimate. + // + // Instead, we will try to measure how complex a scene is based + // on the amount of geometry that is drawn, the amount of GPU + // commands and the shader complexity. We will ignore all + // the other factors for now. + + // Using Mario Kart 7 as the reference, it is understood that on + // average the console can handle around 20k triangles per frame. + // This game uses standard GPU features, with no fancy stuff, + // so we can consider it an average. To prevent hurting performance, + // we will also assume the GPU is twice as powerful. Afterall we only + // want timing accuracy to fix bugs at this point. + // This average already takes into account shader complexity averages. + static constexpr float nanoseconds_per_triangle = 800.f / 2; + + // Of the total amount of submitted triangles, many of them will be culled. + // This heavily depends on the specific scene, so we will assume 35% of the + // triangles being culled. Furthermore, the culled triangles will take way less + // processing time as they will skip most of the pipeline processing, so we + // can assume that a culled triangle will only take about 20% of the time. + static constexpr float culled_triangle_threshold = 0.35f; // 35% + static constexpr float culled_triangle_time_cost = 0.20f; // 20% + + // We will assume that each command will take around 6 cycles @ 268MHz + // There are no real measurements to support this claim, but it sounds + // reasonable. TODO: Measure on real HW. + static constexpr float nanoseconds_per_command = 22.4f; + +public: + inline void AddCommands(size_t commands) { + command_count += commands; + } + + inline void AddVertices(size_t vertices, PipelineRegs::TriangleTopology topology) { + size_t triangles{}; + if (topology == PipelineRegs::TriangleTopology::Fan || + topology == PipelineRegs::TriangleTopology::Strip) { + triangles = (vertices >= 3) ? (vertices - 2) : 1; + } else { + // Geometry shaders produce more vertices per given vertex, + // but they are not that relevant for timing emulation. + triangles = vertices / 3; + } + + triangle_count += triangles; + } + + u64 CalculateAndResetDelay() { + float result = command_count * nanoseconds_per_command; + + result += (1.f - culled_triangle_threshold) * triangle_count * nanoseconds_per_triangle; + result += culled_triangle_threshold * triangle_count * + (nanoseconds_per_triangle * culled_triangle_time_cost); + + triangle_count = 0; + command_count = 0; + + return static_cast(result); + } + +private: + size_t triangle_count{}; + size_t command_count{}; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const u32 file_version) { + ar & triangle_count; + ar & command_count; + } +}; + class PicaCore { public: explicit PicaCore(Memory::MemorySystem& memory, std::shared_ptr debug_context_); @@ -277,6 +357,8 @@ public: AttributeBuffer input_default_attributes{}; ImmediateModeState immediate{}; + DelayGenerator delay_generator{}; + private: friend class boost::serialization::access; template @@ -291,6 +373,7 @@ private: ar & fog; ar & input_default_attributes; ar & immediate; + ar & delay_generator; ar & geometry_pipeline; ar & primitive_assembler; ar & cmd_list; diff --git a/src/video_core/pica/regs_external.h b/src/video_core/pica/regs_external.h index a629a11a7..4961ee23f 100644 --- a/src/video_core/pica/regs_external.h +++ b/src/video_core/pica/regs_external.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -10,6 +10,7 @@ #include "common/assert.h" #include "common/bit_field.h" #include "common/common_funcs.h" +#include "core/memory.h" namespace Pica { @@ -85,6 +86,11 @@ struct MemoryFillConfig { return DecodeAddressRegister(address_end); } + bool IsVRAM() const { + u32 addr = GetStartAddress(); + return !(addr >= Memory::FCRAM_PADDR && addr < Memory::FCRAM_PADDR_END); + } + inline std::string DebugName() const { return fmt::format("from {:#X} to {:#X} with {}-bit value {:#X}", GetStartAddress(), GetEndAddress(), fill_32bit ? "32" : (fill_24bit ? "24" : "16"), @@ -155,6 +161,16 @@ struct DisplayTransferConfig { input_width.Value(), output_width.Value()); } + bool IsInputVRAM() { + u32 addr = GetPhysicalInputAddress(); + return !(addr >= Memory::FCRAM_PADDR && addr < Memory::FCRAM_PADDR_END); + } + + bool IsOutputVRAM() { + u32 addr = GetPhysicalOutputAddress(); + return !(addr >= Memory::FCRAM_PADDR && addr < Memory::FCRAM_PADDR_END); + } + union { u32 output_size; From b5407250902330062dae4514514748ab8d96dd4a Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Thu, 7 May 2026 13:48:35 +0200 Subject: [PATCH 82/98] Revamp GDB implemenation and add a some minor debug features (#2086) --- CMakeLists.txt | 3 +- CMakeModules/GenerateSettingKeys.cmake | 1 + docker/azahar-room/Dockerfile | 1 + src/android/app/build.gradle.kts | 3 +- .../java/org/citra/citra_emu/NativeLibrary.kt | 74 +- src/android/app/src/main/jni/config.cpp | 1 + src/android/app/src/main/jni/default_ini.h | 9 +- .../app/src/main/res/values/strings.xml | 19 +- src/citra_qt/citra_qt.cpp | 37 +- src/citra_qt/configuration/config.cpp | 7 +- src/citra_qt/configuration/config.h | 2 +- .../configuration/configure_debug.cpp | 30 +- src/citra_qt/configuration/configure_debug.ui | 19 +- src/citra_qt/main.ui | 34 + src/common/CMakeLists.txt | 1 + src/common/memory_ref.h | 6 +- src/common/optional_helper.h | 42 + src/common/settings.cpp | 2 + src/common/settings.h | 1 + src/common/string_util.cpp | 13 +- src/common/string_util.h | 1 + src/core/CMakeLists.txt | 14 +- src/core/arm/arm_interface.h | 27 +- src/core/arm/dynarmic/arm_dynarmic.cpp | 79 +- src/core/arm/dynarmic/arm_dynarmic.h | 8 +- src/core/arm/dyncom/arm_dyncom.cpp | 8 +- src/core/arm/dyncom/arm_dyncom.h | 6 +- .../arm/dyncom/arm_dyncom_interpreter.cpp | 20 +- src/core/arm/skyeye_common/armstate.cpp | 46 +- src/core/arm/skyeye_common/armstate.h | 10 + src/core/core.cpp | 34 +- src/core/core.h | 20 +- src/core/gdbstub/gdbstub.cpp | 947 +++++++++++++----- src/core/gdbstub/gdbstub.h | 57 +- src/core/gdbstub/hio.cpp | 34 +- src/core/gdbstub/hio.h | 15 +- src/core/hle/kernel/process.cpp | 55 + src/core/hle/kernel/process.h | 6 +- src/core/hle/kernel/svc.cpp | 6 +- src/core/hle/kernel/thread.cpp | 26 +- src/core/hle/kernel/thread.h | 10 + src/core/memory.cpp | 342 ++++++- src/core/memory.h | 61 +- 43 files changed, 1671 insertions(+), 466 deletions(-) create mode 100644 src/common/optional_helper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d58cc70d..d98994384 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,7 @@ endif() # Track which options were explicitly set by the user (for libretro conflict detection) set(_LIBRETRO_INCOMPATIBLE_OPTIONS - ENABLE_SDL2 ENABLE_QT ENABLE_WEB_SERVICE ENABLE_SCRIPTING + ENABLE_SDL2 ENABLE_QT ENABLE_WEB_SERVICE ENABLE_SCRIPTING ENABLE_GDBSTUB ENABLE_OPENAL ENABLE_ROOM ENABLE_ROOM_STANDALONE ENABLE_CUBEB ENABLE_LIBUSB) set(_USER_SET_OPTIONS "") foreach(_opt IN LISTS _LIBRETRO_INCOMPATIBLE_OPTIONS) @@ -122,6 +122,7 @@ CMAKE_DEPENDENT_OPTION(ENABLE_ROOM_STANDALONE "Enable generating a standalone de option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) option(ENABLE_SCRIPTING "Enable RPC server for scripting" ON) +option(ENABLE_GDBSTUB "Enable GDB stub for emulated applications" ON) CMAKE_DEPENDENT_OPTION(ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT IOS" OFF) option(ENABLE_OPENAL "Enables the OpenAL audio backend" ON) diff --git a/CMakeModules/GenerateSettingKeys.cmake b/CMakeModules/GenerateSettingKeys.cmake index 988c51575..96a131f72 100644 --- a/CMakeModules/GenerateSettingKeys.cmake +++ b/CMakeModules/GenerateSettingKeys.cmake @@ -116,6 +116,7 @@ foreach(KEY IN ITEMS "log_filter" "log_regex_filter" "toggle_unique_data_console_type" + "break_on_unmapped_memory_access" "use_integer_scaling" "layouts_to_cycle" "camera_inner_flip" diff --git a/docker/azahar-room/Dockerfile b/docker/azahar-room/Dockerfile index c47896dd9..9a5f07820 100644 --- a/docker/azahar-room/Dockerfile +++ b/docker/azahar-room/Dockerfile @@ -9,6 +9,7 @@ COPY . /var/azahar-src RUN mkdir builddir && cd builddir && \ cmake /var/azahar-src -G Ninja \ -DENABLE_QT=OFF \ + -DENABLE_GDBSTUB=OFF \ -DENABLE_TESTS=OFF \ -DENABLE_ROOM=ON \ -DENABLE_ROOM_STANDALONE=ON \ diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 733656c0e..2ee844985 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -79,7 +79,8 @@ android { "-DENABLE_QT=0", // Don't use QT "-DENABLE_SDL2=0", // Don't use SDL "-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work - "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" // Support Android 15 16KiB page sizes + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", // Support Android 15 16KiB page sizes + "-DENABLE_GDBSTUB=OFF", // Disable GDB stub ) } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt index 018fea670..1ef5c8d83 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt @@ -19,6 +19,7 @@ import android.view.Surface import android.view.View import android.widget.TextView import androidx.annotation.Keep +import androidx.annotation.StringRes import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.fragment.app.DialogFragment @@ -317,6 +318,12 @@ object NativeLibrary { canContinue = false } + CoreError.ErrorCoreExceptionRaised -> { + title = emulationActivity.getString(R.string.fatal_error) + message = emulationActivity.getString(R.string.fatal_error_message) + canContinue = false + } + CoreError.ErrorUnknown -> { title = emulationActivity.getString(R.string.fatal_error) message = emulationActivity.getString(R.string.fatal_error_message) @@ -439,7 +446,7 @@ object NativeLibrary { return } - if (resultCode == EmulationErrorDialogFragment.ShutdownRequested) { + if (resultCode == CoreError.ShutdownRequested.value) { emulationActivity.finish() return } @@ -458,23 +465,26 @@ object NativeLibrary { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { emulationActivity = requireActivity() as EmulationActivity - var captionId = R.string.loader_error_invalid_format val result = requireArguments().getInt(RESULT_CODE) - if (result == ErrorLoader_ErrorEncrypted) { - captionId = R.string.loader_error_encrypted + var captionString = getString(R.string.loader_error_invalid_format) + if (result == CoreError.ErrorLoader_ErrorEncrypted.value) { + captionString = getString(R.string.loader_error_encrypted) } - if (result == ErrorArticDisconnected) { - captionId = R.string.artic_base + if (result == CoreError.ErrorArticDisconnected.value) { + captionString = getString(R.string.artic_base) } val alert = MaterialAlertDialogBuilder(requireContext()) - .setTitle(captionId) + .setTitle(captionString) .setMessage( Html.fromHtml( - if (result == ErrorArticDisconnected) - CitraApplication.appContext.resources.getString(R.string.artic_server_comm_error) + if (result == CoreError.ErrorArticDisconnected.value) + getString(R.string.artic_server_comm_error) + else if (result == CoreError.ErrorLoader_ErrorEncrypted.value) + getString(R.string.loader_error_encrypted_desc) else - CitraApplication.appContext.resources.getString(R.string.redump_games), + getString(R.string.loader_error_generic, + getString(CoreError.fromInt(result).stringRes), result), Html.FROM_HTML_MODE_LEGACY ) ) @@ -496,21 +506,6 @@ object NativeLibrary { const val RESULT_CODE = "resultcode" - const val Success = 0 - const val ErrorNotInitialized = 1 - const val ErrorGetLoader = 2 - const val ErrorSystemMode = 3 - const val ErrorLoader = 4 - const val ErrorLoader_ErrorEncrypted = 5 - const val ErrorLoader_ErrorInvalidFormat = 6 - const val ErrorLoader_ErrorGBATitle = 7 - const val ErrorSystemFiles = 8 - const val ErrorSavestate = 9 - const val ErrorArticDisconnected = 10 - const val ErrorN3DSApplication = 11 - const val ShutdownRequested = 12 - const val ErrorUnknown = 13 - fun newInstance(resultCode: Int): EmulationErrorDialogFragment { val args = Bundle() args.putInt(RESULT_CODE, resultCode) @@ -857,12 +852,29 @@ object NativeLibrary { FileUtil.deleteDocument(path) } - enum class CoreError { - ErrorSystemFiles, - ErrorSavestate, - ErrorArticDisconnected, - ErrorN3DSApplication, - ErrorUnknown + enum class CoreError(val value: Int, @StringRes val stringRes: Int) { + Success(0, R.string.core_error_success), + ErrorNotInitialized(1, R.string.core_error_not_initialized), + ErrorGetLoader(2, R.string.core_error_get_loader), + ErrorSystemMode(3, R.string.core_error_system_mode), + ErrorLoader(4, R.string.core_error_loader), + ErrorLoader_ErrorEncrypted(5, R.string.core_error_loader_encrypted), + ErrorLoader_ErrorInvalidFormat(6, R.string.core_error_loader_invalid_format), + ErrorLoader_ErrorGBATitle(7, R.string.core_error_loader_gba_title), + ErrorSystemFiles(8, R.string.core_error_system_files), + ErrorSavestate(9, R.string.core_error_savestate), + ErrorArticDisconnected(10, R.string.core_error_artic_disconnected), + ErrorN3DSApplication(11, R.string.core_error_n3ds_application), + ErrorCoreExceptionRaised(12, R.string.core_error_core_exception_raised), + ErrorMemoryExceptionRaised(13, R.string.core_error_memory_exception_raised), + ShutdownRequested(14, R.string.core_error_shutdown_requested), + ErrorUnknown(15, R.string.core_error_unknown); + + companion object { + fun fromInt(value: Int): CoreError { + return entries.find { it.value == value } ?: ErrorUnknown + } + } } enum class InstallStatus { diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index aba68a623..8ac729fce 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -317,6 +317,7 @@ void Config::ReadValues() { ReadSetting("Debugging", Settings::values.instant_debug_log); ReadSetting("Debugging", Settings::values.enable_rpc_server); ReadSetting("Debugging", Settings::values.toggle_unique_data_console_type); + ReadSetting("Debugging", Settings::values.break_on_unmapped_memory_access); for (const auto& service_module : Service::service_module_map) { bool use_lle = diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 46a796792..bfe406d77 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -35,7 +35,10 @@ constexpr std::array android_config_omitted_keys = { Keys::audio_encoder, Keys::audio_encoder_options, Keys::audio_bitrate, - Keys::last_artic_base_addr, // On Android, this value is stored as a "preference" + Keys::last_artic_base_addr, // On Android, this value is stored as a "preference" + Keys::break_on_unmapped_memory_access, // Does nothing as the error is ignored + Keys::use_gdbstub, // GDB functionality disabled by deafult on Android + Keys::gdbstub_port, }; // clang-format off @@ -531,10 +534,6 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"( # 0 (default): Off, 1: On )") DECLARE_KEY(renderer_debug) BOOST_HANA_STRING(R"( -# Port for listening to GDB connections. -)") DECLARE_KEY(use_gdbstub) BOOST_HANA_STRING(R"( -)") DECLARE_KEY(gdbstub_port) BOOST_HANA_STRING(R"( - # Flush log output on every message # Immediately commits the debug log to file. Use this if Azahar crashes and the log output is being cut. )") DECLARE_KEY(instant_debug_log) BOOST_HANA_STRING(R"( diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 577d1737c..72e7eecf7 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -393,7 +393,6 @@ Learn More Close Reset to Default - game cartridges or installed titles.]]> Default None Auto @@ -437,9 +436,27 @@ Your ROM is Encrypted + blog post for more information.]]> Invalid ROM format ROM file does not exist No bootable game present! + An error occurred while loading ROM: \"%s (%d)\" + Success + Not initialized + Loader for file not found, incompatible file type + Failed to parse file + Generic loader error + Encrypted file + Corrupted file + File is GBA title + Missing system files + Savestate failed + Artic Base disconnected + File is New 3DS application + Core exception raised + Memory exception raised + Shutdown requested + Unknown error Press Back to access the menu. diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 62fb24b9b..180591c9f 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -855,10 +855,11 @@ void GMainWindow::InitializeHotkeys() { // QAction Hotkeys const auto link_action_shortcut = [&](QAction* action, const QString& action_name, - const bool primary_only = false) { + const bool primary_only = false, + const bool auto_repeat = false) { static const QString main_window = QStringLiteral("Main Window"); action->setShortcut(hotkey_registry.GetKeySequence(main_window, action_name)); - action->setAutoRepeat(false); + action->setAutoRepeat(auto_repeat); this->addAction(action); if (!primary_only) secondary_window->addAction(action); @@ -875,6 +876,9 @@ void GMainWindow::InitializeHotkeys() { link_action_shortcut(ui->action_Show_Status_Bar, QStringLiteral("Toggle Status Bar")); link_action_shortcut(ui->action_Fullscreen, fullscreen, true); link_action_shortcut(ui->action_Capture_Screenshot, QStringLiteral("Capture Screenshot")); + link_action_shortcut(ui->action_Debug_Pause, QStringLiteral("Debug Pause")); + link_action_shortcut(ui->action_Debug_Resume, QStringLiteral("Debug Resume")); + link_action_shortcut(ui->action_Debug_Step, QStringLiteral("Debug Step"), false, true); link_action_shortcut(ui->action_Screen_Layout_Swap_Screens, QStringLiteral("Swap Screens")); link_action_shortcut(ui->action_Screen_Layout_Upright_Screens, QStringLiteral("Rotate Screens Upright")); @@ -1189,6 +1193,23 @@ void GMainWindow::ConnectMenuEvents() { connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot); connect_menu(ui->action_Dump_Video, &GMainWindow::OnDumpVideo); + // Tools debug + connect_menu(ui->action_Debug_Pause, [this] { + if (emu_thread) { + emu_thread->SetRunning(false); + } + }); + connect_menu(ui->action_Debug_Resume, [this] { + if (emu_thread) { + emu_thread->SetRunning(true); + } + }); + connect_menu(ui->action_Debug_Step, [this] { + if (emu_thread) { + emu_thread->ExecStep(); + } + }); + // Tools connect_menu(ui->action_Compress_ROM_File, &GMainWindow::OnCompressFile); connect_menu(ui->action_Decompress_ROM_File, &GMainWindow::OnDecompressFile); @@ -3880,6 +3901,18 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result, std::string det .c_str()); error_severity_icon = QMessageBox::Icon::Critical; can_continue = false; + } else if (result == Core::System::ResultStatus::ErrorCoreExceptionRaised) { + title = tr("An exception occurred"); + message = tr("An exception occurred while executing the emulated application.\n\n"); + message += QString::fromStdString(details); + error_severity_icon = QMessageBox::Icon::Critical; + can_continue = false; + } else if (result == Core::System::ResultStatus::ErrorMemoryExceptionRaised) { + title = tr("An invalid memory access occurred"); + message = + tr("An invalid memory access occurred while executing the emulated application.\n\n"); + message += QString::fromStdString(details); + error_severity_icon = QMessageBox::Icon::Critical; } else { title = tr("Fatal Error"); message = tr("A fatal error occurred. " diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index c797f61f5..30d54a93f 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -57,12 +57,15 @@ const std::array, Settings::NativeAnalog::NumAnalogs> QtConfi // This must be in alphabetical order according to action name as it must have the same order as // UISetting::values.shortcuts, which is alphabetically ordered. // clang-format off -const std::array QtConfig::default_hotkeys {{ +const std::array QtConfig::default_hotkeys {{ {QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::ApplicationShortcut}}, {QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}}, {QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}}, {QStringLiteral("Audio Volume Up"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}}, {QStringLiteral("Capture Screenshot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::WidgetWithChildrenShortcut}}, + {QStringLiteral("Debug Pause"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F4"),Qt::WidgetWithChildrenShortcut}}, + {QStringLiteral("Debug Resume"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F5"),Qt::WidgetWithChildrenShortcut}}, + {QStringLiteral("Debug Step"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F6"),Qt::WidgetWithChildrenShortcut}}, {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}}, {QStringLiteral("Decrease 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+-"), Qt::ApplicationShortcut}}, {QStringLiteral("Decrease Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("-"), Qt::ApplicationShortcut}}, @@ -510,6 +513,7 @@ void QtConfig::ReadDebuggingValues() { ReadBasicSetting(Settings::values.instant_debug_log); ReadBasicSetting(Settings::values.enable_rpc_server); ReadBasicSetting(Settings::values.toggle_unique_data_console_type); + ReadBasicSetting(Settings::values.break_on_unmapped_memory_access); qt_config->beginGroup(QStringLiteral("LLE")); for (const auto& service_module : Service::service_module_map) { @@ -1096,6 +1100,7 @@ void QtConfig::SaveDebuggingValues() { WriteBasicSetting(Settings::values.instant_debug_log); WriteBasicSetting(Settings::values.enable_rpc_server); WriteBasicSetting(Settings::values.toggle_unique_data_console_type); + WriteBasicSetting(Settings::values.break_on_unmapped_memory_access); qt_config->beginGroup(QStringLiteral("LLE")); for (const auto& service_module : Settings::values.lle_modules) { diff --git a/src/citra_qt/configuration/config.h b/src/citra_qt/configuration/config.h index 3fba498ed..6cc87f7f0 100644 --- a/src/citra_qt/configuration/config.h +++ b/src/citra_qt/configuration/config.h @@ -26,7 +26,7 @@ public: static const std::array default_buttons; static const std::array, Settings::NativeAnalog::NumAnalogs> default_analogs; - static const std::array default_hotkeys; + static const std::array default_hotkeys; private: void Initialize(const std::string& config_name); diff --git a/src/citra_qt/configuration/configure_debug.cpp b/src/citra_qt/configuration/configure_debug.cpp index 0fe4f49cf..bdb945eb9 100644 --- a/src/citra_qt/configuration/configure_debug.cpp +++ b/src/citra_qt/configuration/configure_debug.cpp @@ -12,6 +12,7 @@ #include "common/file_util.h" #include "common/logging/backend.h" #include "common/settings.h" +#include "core/core.h" #include "ui_configure_debug.h" #ifdef ENABLE_VULKAN #include "video_core/renderer_vulkan/vk_instance.h" @@ -33,6 +34,17 @@ ConfigureDebug::ConfigureDebug(bool is_powered_on_, QWidget* parent) ui->setupUi(this); SetConfiguration(); + connect(ui->toggle_gdbstub, &QCheckBox::clicked, + [this](bool checked) { ui->debug_next_process->setEnabled(checked); }); + + connect(ui->debug_next_process, &QCheckBox::clicked, [](bool checked) { + if (checked) { + Core::System::GetInstance().SetDebugNextProcessFlag(); + } else { + Core::System::GetInstance().ClearDebugNextProcessFlag(); + } + }); + connect(ui->open_log_button, &QPushButton::clicked, []() { QString path = QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LogDir)); QDesktopServices::openUrl(QUrl::fromLocalFile(path)); @@ -87,6 +99,10 @@ ConfigureDebug::ConfigureDebug(bool is_powered_on_, QWidget* parent) ui->clock_speed_label->setVisible(Settings::IsConfiguringGlobal()); ui->clock_speed_combo->setVisible(!Settings::IsConfiguringGlobal()); +#ifndef ENABLE_GDBSTUB + ui->gdb_groupbox->setVisible(false); +#endif + SetupPerGameUI(); } @@ -94,6 +110,9 @@ ConfigureDebug::~ConfigureDebug() = default; void ConfigureDebug::SetConfiguration() { ui->toggle_gdbstub->setChecked(Settings::values.use_gdbstub.GetValue()); + if (!ui->toggle_gdbstub->isChecked()) { + ui->debug_next_process->setEnabled(false); + } ui->gdbport_spinbox->setEnabled(Settings::values.use_gdbstub.GetValue()); ui->gdbport_spinbox->setValue(Settings::values.gdbstub_port.GetValue()); ui->toggle_console->setEnabled(!is_powered_on); @@ -112,6 +131,8 @@ void ConfigureDebug::SetConfiguration() { #endif // !ENABLE_SCRIPTING ui->toggle_unique_data_console_type->setChecked( Settings::values.toggle_unique_data_console_type.GetValue()); + ui->break_on_unmapped_memory_access->setChecked( + Settings::values.break_on_unmapped_memory_access.GetValue()); ui->toggle_renderer_debug->setChecked(Settings::values.renderer_debug.GetValue()); ui->toggle_dump_command_buffers->setChecked(Settings::values.dump_command_buffers.GetValue()); @@ -133,6 +154,10 @@ void ConfigureDebug::SetConfiguration() { ui->clock_display_label->setText( QStringLiteral("%1%").arg(Settings::values.cpu_clock_percentage.GetValue())); ui->instant_debug_log->setChecked(Settings::values.instant_debug_log.GetValue()); + + if (Core::System::GetInstance().GetDebugNextProcessFlag()) { + ui->debug_next_process->setChecked(true); + } } void ConfigureDebug::ApplyConfiguration() { @@ -153,6 +178,8 @@ void ConfigureDebug::ApplyConfiguration() { Settings::values.enable_rpc_server = ui->enable_rpc_server->isChecked(); Settings::values.toggle_unique_data_console_type = ui->toggle_unique_data_console_type->isChecked(); + Settings::values.break_on_unmapped_memory_access = + ui->break_on_unmapped_memory_access->isChecked(); Settings::values.renderer_debug = ui->toggle_renderer_debug->isChecked(); Settings::values.dump_command_buffers = ui->toggle_dump_command_buffers->isChecked(); Settings::values.instant_debug_log = ui->instant_debug_log->isChecked(); @@ -174,10 +201,11 @@ void ConfigureDebug::SetupPerGameUI() { ConfigurationShared::SetHighlight(ui->clock_speed_widget, index == 1); }); - ui->groupBox->setVisible(false); + ui->gdb_groupbox->setVisible(false); ui->groupBox_2->setVisible(false); ui->enable_rpc_server->setVisible(false); ui->toggle_unique_data_console_type->setVisible(false); + ui->break_on_unmapped_memory_access->setVisible(false); ui->toggle_cpu_jit->setVisible(false); } diff --git a/src/citra_qt/configuration/configure_debug.ui b/src/citra_qt/configuration/configure_debug.ui index 990835a80..d9c833949 100644 --- a/src/citra_qt/configuration/configure_debug.ui +++ b/src/citra_qt/configuration/configure_debug.ui @@ -17,7 +17,7 @@ - + GDB @@ -60,6 +60,13 @@ + + + + Pause next non-sysmodule process at start + + + @@ -299,6 +306,16 @@ + + + + <html><head/><body><p>Pauses emulation and shows an error message if an unmapped memory access is detected.</p></body></html> + + + Break on unmapped memory access + + + diff --git a/src/citra_qt/main.ui b/src/citra_qt/main.ui index acca5361d..1e5dbb4e5 100644 --- a/src/citra_qt/main.ui +++ b/src/citra_qt/main.ui @@ -206,6 +206,16 @@ + + + Debug + + + + + + + @@ -453,6 +463,30 @@ Capture Screenshot + + + true + + + Debug Pause + + + + + true + + + Debug Resume + + + + + true + + + Debug Step + + true diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 4b6e74c49..931899f5f 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -59,6 +59,7 @@ add_library(citra_common STATIC microprofile.cpp microprofile.h microprofileui.h + optional_helper.h param_package.cpp param_package.h play_time_manager.cpp diff --git a/src/common/memory_ref.h b/src/common/memory_ref.h index f5935bf4c..3e4ddc67f 100644 --- a/src/common/memory_ref.h +++ b/src/common/memory_ref.h @@ -1,4 +1,4 @@ -// Copyright 2020 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -153,7 +153,9 @@ private: void serialize(Archive& ar, const unsigned int) { ar & backing_mem; ar & offset; - Init(); + if (Archive::is_loading::value) { + Init(); + } } friend class boost::serialization::access; }; diff --git a/src/common/optional_helper.h b/src/common/optional_helper.h new file mode 100644 index 000000000..f057973d9 --- /dev/null +++ b/src/common/optional_helper.h @@ -0,0 +1,42 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include + +namespace detail { +template +struct is_optional_trait : std::false_type { + using value_type = T; +}; + +template +struct is_optional_trait> : std::true_type { + using value_type = T; +}; +} // namespace detail + +/** + * Returns true if T is a std::optional, false otherwise. + * For example: + * using Test1 = u32; + * using Test2 = std::optional; + * is_optional_type -> false + * is_optional_type -> true + */ +template +inline constexpr bool is_optional_type = detail::is_optional_trait::value; + +/** + * Provides the inner type of T if it is a std::optional, or T itself if it is not. + * For example: + * using Test1 = u32; + * using Test2 = std::optional; + * optional_value_type -> u32 + * optional_value_type -> u32 + */ +template +using optional_inner_or_type = typename detail::is_optional_trait::value_type; diff --git a/src/common/settings.cpp b/src/common/settings.cpp index db40cc951..df8451e28 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -166,6 +166,8 @@ void LogSettings() { log_setting("Debugging_InstantDebugLog", values.instant_debug_log.GetValue()); log_setting("Debugging_ToggleUniqueDataConsoleType", values.toggle_unique_data_console_type.GetValue()); + log_setting("Debugging_BreakOnUnmappedMemoryAccess", + values.break_on_unmapped_memory_access.GetValue()); } bool IsConfiguringGlobal() { diff --git a/src/common/settings.h b/src/common/settings.h index 730128885..c5c924201 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -643,6 +643,7 @@ struct Values { Setting instant_debug_log{false, Keys::instant_debug_log}; Setting enable_rpc_server{false, Keys::enable_rpc_server}; Setting toggle_unique_data_console_type{false, Keys::toggle_unique_data_console_type}; + Setting break_on_unmapped_memory_access{false, Keys::break_on_unmapped_memory_access}; // Miscellaneous Setting log_filter{"*:Info", Keys::log_filter}; diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 117c19df2..64effc9e2 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -122,8 +122,7 @@ void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _P _CompleteFilename += _Filename; } -std::vector SplitString(const std::string& str, const char delim) { - std::istringstream iss(str); +static std::vector SplitString(std::istringstream& iss, const char delim) { std::vector output(1); while (std::getline(iss, *output.rbegin(), delim)) { @@ -134,6 +133,16 @@ std::vector SplitString(const std::string& str, const char delim) { return output; } +std::vector SplitString(std::string_view str, const char delim) { + std::istringstream iss{std::string(str)}; + return SplitString(iss, delim); +} + +std::vector SplitString(const std::string& str, const char delim) { + std::istringstream iss(str); + return SplitString(iss, delim); +} + std::string TabsToSpaces(int tab_size, std::string in) { std::size_t i = 0; diff --git a/src/common/string_util.h b/src/common/string_util.h index 033c3ddb1..5c6d0bdac 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -36,6 +36,7 @@ namespace Common { [[nodiscard]] bool EndsWith(const std::string& value, const std::string& ending); +[[nodiscard]] std::vector SplitString(std::string_view str, const char delim); [[nodiscard]] std::vector SplitString(const std::string& str, const char delim); // "C:/Windows/winhelp.exe" to "C:/Windows/", "winhelp", ".exe" diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index ec7a45bfe..e3f8e5275 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -126,10 +126,6 @@ add_library(citra_core STATIC frontend/image_interface.cpp frontend/image_interface.h frontend/input.h - gdbstub/gdbstub.cpp - gdbstub/gdbstub.h - gdbstub/hio.cpp - gdbstub/hio.h hle/applets/applet.cpp hle/applets/applet.h hle/applets/erreula.cpp @@ -529,6 +525,16 @@ if (ENABLE_SCRIPTING) ) endif() +if (ENABLE_GDBSTUB) + target_compile_definitions(citra_core PUBLIC -DENABLE_GDBSTUB) + target_sources(citra_core PRIVATE + gdbstub/gdbstub.cpp + gdbstub/gdbstub.h + gdbstub/hio.cpp + gdbstub/hio.h + ) +endif() + if ("x86_64" IN_LIST ARCHITECTURE OR "arm64" IN_LIST ARCHITECTURE) target_sources(citra_core PRIVATE arm/dynarmic/arm_dynarmic.cpp diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 1f6ddc9e9..ceb945148 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -186,6 +186,13 @@ public: /// Prepare core for thread reschedule (if needed to correctly handle state) virtual void PrepareReschedule() = 0; + /** + * Whether the backend allows to break with single instruction accuracy + * when Run() is used. If false is returned, the user should expect + * innaccuracies with memory watchpoints access exceptions. + */ + virtual bool HasSingleInstructionBreakAccuracy() = 0; + Core::Timing::Timer& GetTimer() { return *timer; } @@ -198,12 +205,28 @@ public: return id; } + /** + * Sets the core to not being runnable until its break condition is handled. + */ + void SetBreakFlag() { + break_flag = true; + } + + /* + * Sets the core being runnable after its break condition was handled. + */ + void ClearBreakFlag() { + break_flag = false; + } + protected: // This us used for serialization. Returning nullptr is valid if page tables are not used. virtual std::shared_ptr GetPageTable() const = 0; std::shared_ptr timer; + bool break_flag{}; + private: u32 id; @@ -213,6 +236,7 @@ private: void save(Archive& ar, const unsigned int file_version) const { ar << timer; ar << id; + ar << break_flag; const auto page_table = GetPageTable(); ar << page_table; for (int i = 0; i < 15; i++) { @@ -258,6 +282,7 @@ private: ClearInstructionCache(); ar >> timer; ar >> id; + ar >> break_flag; std::shared_ptr page_table{}; ar >> page_table; SetPageTable(page_table); diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 2cdc9c119..64b740569 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -1,7 +1,8 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include #include #include @@ -13,10 +14,20 @@ #include "core/arm/dynarmic/arm_tick_counts.h" #include "core/core.h" #include "core/core_timing.h" +#ifdef ENABLE_GDBSTUB #include "core/gdbstub/gdbstub.h" +#endif #include "core/hle/kernel/svc.h" #include "core/memory.h" +#ifndef SIGILL +constexpr u32 SIGILL = 4; +#endif + +#ifndef SIGTRAP +constexpr u32 SIGTRAP = 5; +#endif + namespace Core { class DynarmicUserCallbacks final : public Dynarmic::A32::UserCallbacks { @@ -25,6 +36,10 @@ public: : parent(parent), svc_context(parent.system), memory(parent.memory) {} ~DynarmicUserCallbacks() = default; + std::optional MemoryReadCode(VAddr vaddr) override { + return memory.Read32OrNullopt(vaddr); + } + std::uint8_t MemoryRead8(VAddr vaddr) override { return memory.Read8(vaddr); } @@ -82,12 +97,13 @@ public: case Dynarmic::A32::Exception::NoExecuteFault: break; case Dynarmic::A32::Exception::Breakpoint: +#ifdef ENABLE_GDBSTUB if (GDBStub::IsConnected()) { - parent.jit->HaltExecution(); parent.SetPC(pc); - parent.ServeBreak(); + parent.ServeBreak(SIGTRAP); return; } +#endif break; case Dynarmic::A32::Exception::SendEvent: case Dynarmic::A32::Exception::SendEventLocal: @@ -99,11 +115,40 @@ public: case Dynarmic::A32::Exception::PreloadInstruction: return; } - for (int i = 0; i < 16; i++) { - LOG_CRITICAL(Debug, "r{:02d} = {:08X}", i, parent.GetReg(i)); + + static constexpr auto ExceptionToString = [](Dynarmic::A32::Exception e) -> std::string { + switch (e) { + case Dynarmic::A32::Exception::UndefinedInstruction: + return "UndefinedInstruction"; + case Dynarmic::A32::Exception::UnpredictableInstruction: + return "UnpredictableInstruction"; + case Dynarmic::A32::Exception::DecodeError: + return "DecodeError"; + case Dynarmic::A32::Exception::NoExecuteFault: + return "NoExecuteFault"; + case Dynarmic::A32::Exception::Breakpoint: + return "Breakpoint"; + default: + return fmt::format("Unknown({})", e); + } + }; + + parent.SetPC(pc); +#ifdef ENABLE_GDBSTUB + if (GDBStub::IsConnected()) { + parent.ServeBreak(SIGILL); + } else +#endif + { + std::string error; + for (int i = 0; i < 16; i++) { + error += fmt::format("r{:02d} = {:08X}\n", i, parent.GetReg(i)); + } + error += fmt::format("ExceptionRaised(exception = {}, pc = {:08X})", + ExceptionToString(exception), pc); + parent.system.SetStatus(Core::System::ResultStatus::ErrorCoreExceptionRaised, + error.c_str()); } - ASSERT_MSG(false, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})", exception, - pc, MemoryReadCode(pc).value()); } void AddTicks(std::uint64_t ticks) override { @@ -138,16 +183,19 @@ MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64)); void ARM_Dynarmic::Run() { ASSERT(memory.GetCurrentPageTable() == current_page_table); MICROPROFILE_SCOPE(ARM_Jit); + if (break_flag) [[unlikely]] { + return; + } jit->Run(); } void ARM_Dynarmic::Step() { - jit->Step(); - - if (GDBStub::IsConnected()) { - ServeBreak(); + if (break_flag) [[unlikely]] { + return; } + + jit->Step(); } void ARM_Dynarmic::SetPC(u32 pc) { @@ -294,11 +342,10 @@ void ARM_Dynarmic::SetPageTable(const std::shared_ptr& page_t jits.emplace(current_page_table, std::move(new_jit)); } -void ARM_Dynarmic::ServeBreak() { - Kernel::Thread* thread = system.Kernel().GetCurrentThreadManager().GetCurrentThread(); - SaveContext(thread->context); - GDBStub::Break(); - GDBStub::SendTrap(thread, 5); +void ARM_Dynarmic::ServeBreak([[maybe_unused]] int signal) { +#ifdef ENABLE_GDBSTUB + GDBStub::Break(signal); +#endif } std::unique_ptr ARM_Dynarmic::MakeJit() { diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index ec0c13390..713bd99db 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -56,11 +56,15 @@ public: void ClearExclusiveState() override; void SetPageTable(const std::shared_ptr& page_table) override; + bool HasSingleInstructionBreakAccuracy() override { + return false; + } + protected: std::shared_ptr GetPageTable() const override; private: - void ServeBreak(); + void ServeBreak(int signal); friend class DynarmicUserCallbacks; Core::System& system; diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index c9bb66e38..63db2f9c4 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -24,10 +24,16 @@ ARM_DynCom::ARM_DynCom(Core::System& system_, Memory::MemorySystem& memory, ARM_DynCom::~ARM_DynCom() {} void ARM_DynCom::Run() { + if (break_flag) [[unlikely]] { + return; + } ExecuteInstructions(std::max(timer->GetDowncount(), 0)); } void ARM_DynCom::Step() { + if (break_flag) [[unlikely]] { + return; + } ExecuteInstructions(1); } diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h index 3fd37989a..cfe1d3e92 100644 --- a/src/core/arm/dyncom/arm_dyncom.h +++ b/src/core/arm/dyncom/arm_dyncom.h @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -51,6 +51,10 @@ public: void SetPageTable(const std::shared_ptr& page_table) override; void PrepareReschedule() override; + bool HasSingleInstructionBreakAccuracy() override { + return true; + } + protected: std::shared_ptr GetPageTable() const override; diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index 862c422bc..af30fdad3 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp @@ -1,3 +1,7 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + // Copyright 2012 Michael Kang, 2014 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -19,7 +23,9 @@ #include "core/arm/skyeye_common/vfp/vfp.h" #include "core/core.h" #include "core/core_timing.h" +#ifdef ENABLE_GDBSTUB #include "core/gdbstub/gdbstub.h" +#endif #include "core/hle/kernel/svc.h" #include "core/memory.h" @@ -918,9 +924,11 @@ MICROPROFILE_DEFINE(DynCom_Execute, "DynCom", "Execute", MP_RGB(255, 0, 0)); unsigned InterpreterMainLoop(ARMul_State* cpu) { MICROPROFILE_SCOPE(DynCom_Execute); +#ifdef ENABLE_GDBSTUB /// Nearest upcoming GDB code execution breakpoint, relative to the last dispatch's address. GDBStub::BreakpointAddress breakpoint_data; breakpoint_data.type = GDBStub::BreakpointType::None; +#endif #undef RM #undef RS @@ -948,17 +956,15 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { #define INC_PC(l) ptr += sizeof(arm_inst) + l #define INC_PC_STUB ptr += sizeof(arm_inst) -#ifdef ANDROID +#ifndef ENABLE_GDBSTUB #define GDB_BP_CHECK #else #define GDB_BP_CHECK \ cpu->Cpsr &= ~(1 << 5); \ cpu->Cpsr |= cpu->TFlag << 5; \ - if (GDBStub::IsServerEnabled()) { \ - if (GDBStub::IsMemoryBreak()) { \ - goto END; \ - } else if (breakpoint_data.type != GDBStub::BreakpointType::None && \ - PC == breakpoint_data.address) { \ + if (GDBStub::IsServerEnabled()) [[unlikely]] { \ + if (breakpoint_data.type != GDBStub::BreakpointType::None && \ + PC == breakpoint_data.address) { \ cpu->RecordBreak(breakpoint_data); \ goto END; \ } \ @@ -1651,7 +1657,7 @@ DISPATCH: { goto END; } -#ifndef ANDROID +#ifdef ENABLE_GDBSTUB // Find breakpoint if one exists within the block if (GDBStub::IsConnected()) { breakpoint_data = diff --git a/src/core/arm/skyeye_common/armstate.cpp b/src/core/arm/skyeye_common/armstate.cpp index 9de68dc11..9ff89c5a7 100644 --- a/src/core/arm/skyeye_common/armstate.cpp +++ b/src/core/arm/skyeye_common/armstate.cpp @@ -1,15 +1,23 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include +#include #include "common/logging/log.h" #include "common/swap.h" #include "core/arm/skyeye_common/armstate.h" #include "core/arm/skyeye_common/vfp/vfp.h" #include "core/core.h" +#ifdef ENABLE_GDBSTUB +#include "core/gdbstub/gdbstub.h" +#endif #include "core/memory.h" +#ifndef SIGTRAP +constexpr u32 SIGTRAP = 5; +#endif + ARMul_State::ARMul_State(Core::System& system_, Memory::MemorySystem& memory_, PrivilegeMode initial_mode) : system{system_}, memory{memory_} { @@ -182,26 +190,12 @@ void ARMul_State::ResetMPCoreCP15Registers() { CP15[CP15_MAIN_TLB_LOCKDOWN_ATTRIBUTE] = 0x00000000; CP15[CP15_TLB_DEBUG_CONTROL] = 0x00000000; } -#ifdef ANDROID -static void CheckMemoryBreakpoint(u32 address, GDBStub::BreakpointType type) {} -#else -static void CheckMemoryBreakpoint(u32 address, GDBStub::BreakpointType type) { - if (GDBStub::IsServerEnabled() && GDBStub::CheckBreakpoint(address, type)) { - LOG_DEBUG(Debug, "Found memory breakpoint @ {:08x}", address); - GDBStub::Break(true); - } -} -#endif u8 ARMul_State::ReadMemory8(u32 address) const { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Read); - return memory.Read8(address); } u16 ARMul_State::ReadMemory16(u32 address) const { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Read); - u16 data = memory.Read16(address); if (InBigEndianMode()) @@ -211,8 +205,6 @@ u16 ARMul_State::ReadMemory16(u32 address) const { } u32 ARMul_State::ReadMemory32(u32 address) const { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Read); - u32 data = memory.Read32(address); if (InBigEndianMode()) @@ -222,8 +214,6 @@ u32 ARMul_State::ReadMemory32(u32 address) const { } u64 ARMul_State::ReadMemory64(u32 address) const { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Read); - u64 data = memory.Read64(address); if (InBigEndianMode()) @@ -233,14 +223,10 @@ u64 ARMul_State::ReadMemory64(u32 address) const { } void ARMul_State::WriteMemory8(u32 address, u8 data) { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Write); - memory.Write8(address, data); } void ARMul_State::WriteMemory16(u32 address, u16 data) { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Write); - if (InBigEndianMode()) data = Common::swap16(data); @@ -248,8 +234,6 @@ void ARMul_State::WriteMemory16(u32 address, u16 data) { } void ARMul_State::WriteMemory32(u32 address, u32 data) { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Write); - if (InBigEndianMode()) data = Common::swap32(data); @@ -257,8 +241,6 @@ void ARMul_State::WriteMemory32(u32 address, u32 data) { } void ARMul_State::WriteMemory64(u32 address, u64 data) { - CheckMemoryBreakpoint(address, GDBStub::BreakpointType::Write); - if (InBigEndianMode()) data = Common::swap64(data); @@ -601,6 +583,7 @@ void ARMul_State::WriteCP15Register(u32 value, u32 crn, u32 opcode_1, u32 crm, u } void ARMul_State::ServeBreak() { +#ifdef ENABLE_GDBSTUB if (!GDBStub::IsServerEnabled()) { return; } @@ -609,12 +592,9 @@ void ARMul_State::ServeBreak() { DEBUG_ASSERT(Reg[15] == last_bkpt.address); } - Kernel::Thread* thread = system.Kernel().GetCurrentThreadManager().GetCurrentThread(); - system.GetRunningCore().SaveContext(thread->context); - - if (last_bkpt_hit || GDBStub::IsMemoryBreak() || GDBStub::GetCpuStepFlag()) { + if (last_bkpt_hit) { last_bkpt_hit = false; - GDBStub::Break(); - GDBStub::SendTrap(thread, 5); + GDBStub::Break(SIGTRAP); } +#endif } diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h index f36c46c07..925881304 100644 --- a/src/core/arm/skyeye_common/armstate.h +++ b/src/core/arm/skyeye_common/armstate.h @@ -1,3 +1,7 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + /* armdefs.h -- ARMulator common definitions: ARM6 Instruction Emulator. Copyright (C) 1994 Advanced RISC Machines Ltd. @@ -21,7 +25,9 @@ #include #include "common/common_types.h" #include "core/arm/skyeye_common/arm_regformat.h" +#ifdef ENABLE_GDBSTUB #include "core/gdbstub/gdbstub.h" +#endif namespace Core { class System; @@ -199,10 +205,12 @@ public: return TFlag ? 2 : 4; } +#ifdef ENABLE_GDBSTUB void RecordBreak(GDBStub::BreakpointAddress bkpt) { last_bkpt = bkpt; last_bkpt_hit = true; } +#endif void ServeBreak(); @@ -267,6 +275,8 @@ private: u32 exclusive_tag; // The address for which the local monitor is in exclusive access mode bool exclusive_state; +#ifdef ENABLE_GDBSTUB GDBStub::BreakpointAddress last_bkpt{}; bool last_bkpt_hit = false; +#endif }; diff --git a/src/core/core.cpp b/src/core/core.cpp index 597f4c525..28af9f4f0 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -26,7 +26,9 @@ #include "core/dumping/backend.h" #include "core/file_sys/ncch_container.h" #include "core/frontend/image_interface.h" +#ifdef ENABLE_GDBSTUB #include "core/gdbstub/gdbstub.h" +#endif #include "core/global.h" #include "core/hle/kernel/ipc_debugger/recorder.h" #include "core/hle/kernel/kernel.h" @@ -83,23 +85,17 @@ System::ResultStatus System::RunLoop(bool tight_loop) { return ResultStatus::ErrorNotInitialized; } +#ifdef ENABLE_GDBSTUB if (GDBStub::IsServerEnabled()) { - Kernel::Thread* thread = kernel->GetCurrentThreadManager().GetCurrentThread(); - if (thread && running_core) { - running_core->SaveContext(thread->context); + // The break flag is only set if GDB is connected, + // we can do clearing here safely. If it is ever + // used outside, move the clearing outside the if. + for (auto& cpu_core : cpu_cores) { + cpu_core->ClearBreakFlag(); } GDBStub::HandlePacket(*this); - - // If the loop is halted and we want to step, use a tiny (1) number of instructions to - // execute. Otherwise, get out of the loop function. - if (GDBStub::GetCpuHaltFlag()) { - if (GDBStub::GetCpuStepFlag()) { - tight_loop = false; - } else { - return ResultStatus::Success; - } - } } +#endif Signal signal{Signal::None}; u32 param{}; @@ -259,6 +255,8 @@ System::ResultStatus System::RunLoop(bool tight_loop) { cpu_core->GetTimer().Idle(); PrepareReschedule(); } else { + // In the rare case the break flag is set (due to exception thrown) + // there is probably no need to adjust the timer accordingly. if (tight_loop) { cpu_core->Run(); } else { @@ -269,10 +267,6 @@ System::ResultStatus System::RunLoop(bool tight_loop) { } } - if (GDBStub::IsServerEnabled()) { - GDBStub::SetCpuStepFlag(false); - } - Reschedule(); return status; @@ -571,7 +565,9 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, app_loader->ReadProgramId(loading_title_id); HW::AES::InitKeys(); Service::Init(*this, loading_title_id, lle_modules, !app_loader->DoingInitialSetup()); +#ifdef ENABLE_GDBSTUB GDBStub::DeferStart(); +#endif if (!registered_image_interface) { registered_image_interface = std::make_shared(); @@ -696,7 +692,9 @@ void System::Shutdown(bool is_deserializing) { gpu.reset(); if (!is_deserializing) { lle_modules.clear(); +#ifdef ENABLE_GDBSTUB GDBStub::Shutdown(); +#endif perf_stats.reset(); app_loader.reset(); } @@ -759,8 +757,10 @@ void System::Reset() { } void System::ApplySettings() { +#ifdef ENABLE_GDBSTUB GDBStub::SetServerPort(Settings::values.gdbstub_port.GetValue()); GDBStub::ToggleServer(Settings::values.use_gdbstub.GetValue()); +#endif if (gpu) { #ifndef ANDROID diff --git a/src/core/core.h b/src/core/core.h index 05620da32..971bd7b32 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -103,8 +103,10 @@ public: ErrorSavestate, ///< Error saving or loading ErrorArticDisconnected, ///< Error when artic base disconnects ErrorN3DSApplication, ///< Error launching New 3DS application in Old 3DS mode - ShutdownRequested, ///< Emulated program requested a system shutdown - ErrorUnknown ///< Any other error + ErrorCoreExceptionRaised, ///< The CPU emulation raised an exception + ErrorMemoryExceptionRaised, ///< Unmmaped memory was accessed + ShutdownRequested, ///< Emulated program requested a system shutdown + ErrorUnknown ///< Any other error }; explicit System(); @@ -403,6 +405,18 @@ public: info_led_color_changed = func; } + void SetDebugNextProcessFlag() { + debug_next_process = true; + } + + bool GetDebugNextProcessFlag() { + return debug_next_process; + } + + void ClearDebugNextProcessFlag() { + debug_next_process = false; + } + private: /** * Initialize the emulated system. @@ -512,6 +526,8 @@ private: Common::Vec3 info_led_color; std::function info_led_color_changed; + bool debug_next_process; + friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int file_version); diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index 660168bc1..017677606 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -1,3 +1,7 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + // Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. @@ -36,8 +40,16 @@ #include "core/gdbstub/gdbstub.h" #include "core/gdbstub/hio.h" #include "core/hle/kernel/process.h" +#include "core/loader/loader.h" #include "core/memory.h" +#ifndef ENABLE_GDBSTUB +#error "File was compiled with GDB stub support disabled" +#endif + +// Uncomment to log all GDB traffic +// #define PRINT_GDB_TRAFFIC + namespace GDBStub { namespace { constexpr int GDB_BUFFER_SIZE = 10000; @@ -59,20 +71,38 @@ constexpr u32 SIGTERM = 15; constexpr u32 MSG_WAITALL = 8; #endif +#ifndef SIGSEGV +constexpr u32 SIGSEGV = 11; +#endif + +#ifdef _WIN32 +using SOCKET = UINT_PTR; +#else +using SOCKET = int; +#define closesocket(x) close(x) +#endif // _WIN32 + +#define INVALID_SOCKET ((SOCKET)(~0)) + constexpr u32 SP_REGISTER = 13; constexpr u32 LR_REGISTER = 14; constexpr u32 PC_REGISTER = 15; constexpr u32 CPSR_REGISTER = 25; constexpr u32 D0_REGISTER = 26; constexpr u32 FPSCR_REGISTER = 42; +constexpr u32 FPEXC_REGISTER = 43; // For sample XML files see the GDB source /gdb/features // GDB also wants the l character at the start // This XML defines what the registers are for this specific ARM device +// The CPSR is register 25, rather than register 16, because the FPA registers historically were +// placed between the PC and the CPSR in the "g" packet. constexpr char target_xml[] = R"(l + arm + 3DS @@ -90,11 +120,6 @@ constexpr char target_xml[] = - - - @@ -115,32 +140,41 @@ constexpr char target_xml[] = + )"; -int gdbserver_socket = -1; +SOCKET gdbserver_socket = INVALID_SOCKET; bool defer_start = false; u8 command_buffer[GDB_BUFFER_SIZE]; -u32 command_length; +u32 recv_command_length; +u32 send_command_length; u32 latest_signal = 0; -bool memory_break = false; static Kernel::Thread* current_thread = nullptr; +static Kernel::Process* current_process = nullptr; // Binding to a port within the reserved ports range (0-1023) requires root permissions, // so default to a port outside of that range. u16 gdbstub_port = 24689; -bool halt_loop = true; -bool step_loop = false; -bool send_trap = false; +constexpr bool supports_extended_mode = true; +bool is_extended_mode = false; + +bool is_running = false; +bool current_process_finished = false; // If set to false, the server will never be started and no // gdbstub-related functions will be executed. std::atomic server_enabled(false); +SOCKET accept_socket = INVALID_SOCKET; +int continue_thread = -1; + +static Kernel::Thread* break_thread = nullptr; +static int break_signal = 0; #ifdef _WIN32 WSADATA InitData; @@ -159,17 +193,47 @@ BreakpointMap breakpoints_read; BreakpointMap breakpoints_write; } // Anonymous namespace +static void ResetState() { + gdbserver_socket = INVALID_SOCKET; + defer_start = false; + + memset(command_buffer, 0, GDB_BUFFER_SIZE); + recv_command_length = 0; + send_command_length = 0; + + latest_signal = 0; + + current_thread = nullptr; + current_process = nullptr; + + is_extended_mode = false; + + is_running = false; + current_process_finished = false; + + accept_socket = INVALID_SOCKET; + continue_thread = -1; + + break_thread = nullptr; + break_signal = 0; + + breakpoints_execute.clear(); + breakpoints_read.clear(); + breakpoints_write.clear(); +} + static Kernel::Thread* FindThreadById(int id) { - u32 num_cores = Core::GetNumCores(); - for (u32 i = 0; i < num_cores; ++i) { - const auto& threads = - Core::System::GetInstance().Kernel().GetThreadManager(i).GetThreadList(); - for (auto& thread : threads) { - if (thread->GetThreadId() == static_cast(id)) { - return thread.get(); - } + if (!current_process) { + return nullptr; + } + + auto thread_list = current_process->GetThreadList(); + for (auto& thread : thread_list) { + if (thread->GetThreadId() == static_cast(id)) { + return thread.get(); } } + return nullptr; } @@ -210,6 +274,8 @@ static u64 FpuRead(std::size_t id, Kernel::Thread* thread = nullptr) { return ret; } else if (id == FPSCR_REGISTER) { return thread->context.fpscr; + } else if (id == FPEXC_REGISTER) { + return thread->context.fpexc; } else { return 0; } @@ -225,6 +291,15 @@ static void FpuWrite(std::size_t id, u64 val, Kernel::Thread* thread = nullptr) thread->context.fpu_registers[2 * (id - D0_REGISTER) + 1] = static_cast(val >> 32); } else if (id == FPSCR_REGISTER) { thread->context.fpscr = static_cast(val); + } else if (id == FPEXC_REGISTER) { + thread->context.fpexc = static_cast(val); + } +} + +// Clear instruction cache for all cores. +static void ClearAllInstructionCache() { + for (int i = 0; i < Core::GetNumCores(); i++) { + Core::GetCore(i).ClearInstructionCache(); } } @@ -356,13 +431,42 @@ static u64 GdbHexToLong(const u8* src) { return output; } +static int GetErrno() { +#ifdef _WIN32 + return WSAGetLastError(); +#else + return errno; +#endif +} + +static bool SetNonBlock(SOCKET socket, bool nonblock) { +#ifdef _WIN32 + unsigned long nonblocking = nonblock ? 1 : 0; + int ret = ioctlsocket(socket, FIONBIO, &nonblocking); + if (ret < 0) { + LOG_ERROR(Debug_GDBStub, "Failed to set non-blocking gdb socket"); + return false; + } +#else + int flags = nonblock ? O_NONBLOCK : 0; + + const int ret = ::fcntl(socket, F_SETFL, flags); + if (ret < 0) { + LOG_ERROR(Debug_GDBStub, "Failed to set non-blocking gdb socket"); + return false; + } +#endif + return true; +} + /// Read a byte from the gdb client. static u8 ReadByte() { - u8 c; + u8 c{}; std::size_t received_size = recv(gdbserver_socket, reinterpret_cast(&c), 1, MSG_WAITALL); if (received_size != 1) { - LOG_ERROR(Debug_GDBStub, "recv failed : {}", received_size); - Shutdown(); + LOG_ERROR(Debug_GDBStub, "recv failed : {}", GetErrno()); + ToggleServer(false); + ToggleServer(true); } return c; @@ -409,17 +513,34 @@ static void RemoveBreakpoint(BreakpointType type, VAddr addr) { bp->second.len, bp->second.addr, type); if (type == BreakpointType::Execute) { - Core::System::GetInstance().Memory().WriteBlock( - *Core::System::GetInstance().Kernel().GetCurrentProcess(), bp->second.addr, - bp->second.inst.data(), bp->second.inst.size()); + Core::System::GetInstance().Memory().WriteBlock(*current_process, bp->second.addr, + bp->second.inst.data(), bp->second.len); u32 num_cores = Core::GetNumCores(); for (u32 i = 0; i < num_cores; ++i) { Core::GetCore(i).ClearInstructionCache(); } + } else { + Core::System::GetInstance().Memory().UnregisterWatchpoint(*current_process, bp->second.addr, + bp->second.len); } p.erase(addr); } +void RemoveAllBreakpoints() { + std::vector> trash_bin; + + for (auto type : {BreakpointType::Execute, BreakpointType::Read, BreakpointType::Write}) { + auto& map = GetBreakpointMap(type); + for (auto b : map) { + trash_bin.push_back({type, b.first}); + } + } + + for (auto& p : trash_bin) { + RemoveBreakpoint(p.first, p.second); + } +} + BreakpointAddress GetNextBreakpointFromAddress(VAddr addr, BreakpointType type) { const BreakpointMap& p = GetBreakpointMap(type); const auto next_breakpoint = p.lower_bound(addr); @@ -436,38 +557,65 @@ BreakpointAddress GetNextBreakpointFromAddress(VAddr addr, BreakpointType type) return breakpoint; } -bool CheckBreakpoint(VAddr addr, BreakpointType type) { +bool CheckBreakpoint(VAddr addr, u32 access_len, BreakpointType type) { if (!IsConnected()) { return false; } const BreakpointMap& p = GetBreakpointMap(type); - const auto bp = p.find(addr); - if (bp == p.end()) { - return false; - } + // Access range: [addr, access_end) + const VAddr access_end = addr + access_len; - u32 len = bp->second.len; + for (const auto& [base_addr, bp] : p) { + if (!bp.active) { + continue; + } - // IDA Pro defaults to 4-byte breakpoints for all non-hardware breakpoints - // no matter if it's a 4-byte or 2-byte instruction. When you execute a - // Thumb instruction with a 4-byte breakpoint set, it will set a breakpoint on - // two instructions instead of the single instruction you placed the breakpoint - // on. So, as a way to make sure that execution breakpoints are only breaking - // on the instruction that was specified, set the length of an execution - // breakpoint to 1. This should be fine since the CPU should never begin executing - // an instruction anywhere except the beginning of the instruction. - if (type == BreakpointType::Execute) { - len = 1; - } + u32 bp_len = bp.len; - if (bp->second.active && (addr >= bp->second.addr && addr < bp->second.addr + len)) { - LOG_DEBUG(Debug_GDBStub, - "Found breakpoint type {} @ {:08x}, range: {:08x}" - " - {:08x} ({:x} bytes)", - type, addr, bp->second.addr, bp->second.addr + len, len); - return true; + // IDA Pro defaults to 4-byte breakpoints for all non-hardware breakpoints + // no matter if it's a 4-byte or 2-byte instruction. When you execute a + // Thumb instruction with a 4-byte breakpoint set, it will set a breakpoint on + // two instructions instead of the single instruction you placed the breakpoint + // on. So, as a way to make sure that execution breakpoints are only breaking + // on the instruction that was specified, set the length of an execution + // breakpoint to 1. This should be fine since the CPU should never begin executing + // an instruction anywhere except the beginning of the instruction. + if (type == BreakpointType::Execute) { + bp_len = 1; + } + + // Breakpoint/watchpoint range: [bp.addr, bp_end) + const VAddr bp_end = bp.addr + bp_len; + + bool hit = false; + + if (type == BreakpointType::Execute) { + // Execute breakpoints should only trigger on exact PC match. + hit = (addr == bp.addr); + } else { + // Range overlap test: + // [addr, access_end) overlaps [bp.addr, bp_end) + hit = (addr < bp_end) && (bp.addr < access_end); + } + + if (hit) { + LOG_DEBUG(Debug_GDBStub, + "Found breakpoint type {}, " + "access range: {:08x} - {:08x}, " + "breakpoint range: {:08x} - {:08x}", + type, addr, addr, access_end, bp.addr, bp_end); + + if (type != BreakpointType::Execute && + !Core::GetCore(0).HasSingleInstructionBreakAccuracy()) { + LOG_WARNING(Debug_GDBStub, + "The current CPU backend does not support accurate watchpoints and " + "memory exceptions. Disable CPU JIT for more accuracy."); + } + + return true; + } } return false; @@ -492,28 +640,35 @@ void SendReply(const char* reply) { std::memset(command_buffer, 0, sizeof(command_buffer)); - command_length = static_cast(strlen(reply)); - if (command_length + 4 > sizeof(command_buffer)) { + send_command_length = static_cast(strlen(reply)); + +#ifdef PRINT_GDB_TRAFFIC + LOG_INFO(Debug_GDBStub, "Res: {}", reply); +#endif + + if (send_command_length + 4 > sizeof(command_buffer)) { LOG_ERROR(Debug_GDBStub, "command_buffer overflow in SendReply"); return; } - std::memcpy(command_buffer + 1, reply, command_length); + std::memcpy(command_buffer + 1, reply, send_command_length); - u8 checksum = CalculateChecksum(command_buffer, command_length + 1); + u8 checksum = CalculateChecksum(command_buffer, send_command_length + 1); command_buffer[0] = GDB_STUB_START; - command_buffer[command_length + 1] = GDB_STUB_END; - command_buffer[command_length + 2] = NibbleToHex(checksum >> 4); - command_buffer[command_length + 3] = NibbleToHex(checksum); + command_buffer[send_command_length + 1] = GDB_STUB_END; + command_buffer[send_command_length + 2] = NibbleToHex(checksum >> 4); + command_buffer[send_command_length + 3] = NibbleToHex(checksum); u8* ptr = command_buffer; - u32 left = command_length + 4; + u32 left = send_command_length + 4; while (left > 0) { s32 sent_size = static_cast(send(gdbserver_socket, reinterpret_cast(ptr), left, 0)); if (sent_size < 0) { LOG_ERROR(Debug_GDBStub, "gdb: send failed"); - return Shutdown(); + ToggleServer(false); + ToggleServer(true); + return; } left -= sent_size; @@ -528,60 +683,103 @@ static void HandleQuery() { if (strcmp(query, "TStatus") == 0) { SendReply("T0"); + } else if (strncmp(query, "Attached", strlen("Attached")) == 0) { + SendReply("1"); } else if (strncmp(query, "Supported", strlen("Supported")) == 0) { // PacketSize needs to be large enough for target xml - SendReply("PacketSize=2000;qXfer:features:read+;qXfer:threads:read+"); + SendReply("PacketSize=9800;qXfer:features:read+;qXfer:osdata:read+;qXfer:threads:read+;" + "vContSupported+"); } else if (strncmp(query, "Xfer:features:read:target.xml:", strlen("Xfer:features:read:target.xml:")) == 0) { SendReply(target_xml); } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) { - std::string val = "m"; - u32 num_cores = Core::GetNumCores(); - for (u32 i = 0; i < num_cores; ++i) { - const auto& threads = - Core::System::GetInstance().Kernel().GetThreadManager(i).GetThreadList(); - for (const auto& thread : threads) { - val += fmt::format("{:x},", thread->GetThreadId()); - } + if (!current_process) { + SendReply("E01"); + return; } + + auto thread_list = current_process->GetThreadList(); + std::string val = "m"; + for (const auto& thread : thread_list) { + val += fmt::format("{:x},", thread->GetThreadId()); + } + val.pop_back(); SendReply(val.c_str()); } else if (strncmp(query, "sThreadInfo", strlen("sThreadInfo")) == 0) { SendReply("l"); + } else if (strncmp(query, "Xfer:osdata:read:processes", strlen("Xfer:osdata:read:processes")) == + 0) { + std::string buffer; + buffer += "l"; + auto process_list = Core::System::GetInstance().Kernel().GetProcessList(); + for (const auto& p : process_list) { + buffer += fmt::format("" + "{}" + "{}" + "", + p->process_id, p->codeset->name); + } + buffer += ""; + SendReply(buffer.c_str()); } else if (strncmp(query, "Xfer:threads:read", strlen("Xfer:threads:read")) == 0) { + if (!current_process) { + SendReply("E01"); + return; + } + std::string buffer; buffer += "l"; buffer += ""; - u32 num_cores = Core::GetNumCores(); - for (u32 i = 0; i < num_cores; ++i) { - const auto& threads = - Core::System::GetInstance().Kernel().GetThreadManager(i).GetThreadList(); - for (const auto& thread : threads) { - buffer += fmt::format(R"*()*", - thread->GetThreadId(), thread->GetThreadId()); - } + auto thread_list = current_process->GetThreadList(); + for (const auto& thread : thread_list) { + buffer += fmt::format(R"*()*", + thread->GetThreadId(), thread->GetThreadId()); } buffer += ""; + SendReply(buffer.c_str()); } else { SendReply(""); } } - -/// Handle set thread command from gdb client. -static void HandleSetThread() { - int thread_id = -1; - if (command_buffer[2] != '-') { - thread_id = static_cast(HexToInt(command_buffer + 2, command_length - 2)); +static bool SetThread(int thread_id) { + if (!current_process) { + // The process has not been selected yet + return false; } + if (thread_id >= 1) { current_thread = FindThreadById(thread_id); } if (!current_thread) { - thread_id = 1; - current_thread = FindThreadById(thread_id); + auto thread_list = current_process->GetThreadList(); + if (thread_list.size() > 0) { + // Select the lowest thread ID, which is the main thread + std::sort(thread_list.begin(), thread_list.end(), + [](const std::shared_ptr& a, + const std::shared_ptr& b) { + return a->thread_id < b->thread_id; + }); + current_thread = thread_list[0].get(); + } } - if (current_thread) { + return current_thread != nullptr; +} +/// Handle set thread command from gdb client. +static void HandleSetThread() { + int thread_id = -1; + if (command_buffer[2] != '-') { + thread_id = static_cast(HexToInt(command_buffer + 2, recv_command_length - 2)); + } + + if (command_buffer[1] == 'c') { + continue_thread = thread_id; + SendReply("OK"); + return; + } + + if (SetThread(thread_id)) { SendReply("OK"); return; } @@ -590,7 +788,12 @@ static void HandleSetThread() { /// Handle thread alive command from gdb client. static void HandleThreadAlive() { - int thread_id = static_cast(HexToInt(command_buffer + 1, command_length - 1)); + if (!current_process) { + SendReply("E01"); + return; + } + + int thread_id = static_cast(HexToInt(command_buffer + 1, recv_command_length - 1)); if (thread_id == 0) { thread_id = 1; } @@ -601,13 +804,27 @@ static void HandleThreadAlive() { SendReply("E01"); } +static void HandleExtendedMode() { + if (supports_extended_mode) { + is_extended_mode = true; + SendReply("OK"); + } else { + SendReply(""); + } +} + /** * Send signal packet to client. * * @param signal Signal to be sent to client. */ -static void SendSignal(Kernel::Thread* thread, u32 signal, bool full = true) { - if (gdbserver_socket == -1) { +static void SendStopReply(Kernel::Thread* thread, u32 signal, bool full = true) { + if (gdbserver_socket == INVALID_SOCKET) { + return; + } + + if (current_process_finished) { + SendReply("W00"); return; } @@ -619,11 +836,16 @@ static void SendSignal(Kernel::Thread* thread, u32 signal, bool full = true) { std::string buffer; if (full) { - + Core::ARM_Interface::ThreadContext ctx{}; + if (thread) { + ctx = thread->context; + } else { + Core::GetRunningCore().SaveContext(ctx); + } buffer = fmt::format("T{:02x}{:02x}:{:08x};{:02x}:{:08x};{:02x}:{:08x}", latest_signal, - PC_REGISTER, htonl(Core::GetRunningCore().GetPC()), SP_REGISTER, - htonl(Core::GetRunningCore().GetReg(SP_REGISTER)), LR_REGISTER, - htonl(Core::GetRunningCore().GetReg(LR_REGISTER))); + PC_REGISTER, htonl(ctx.cpu_registers[PC_REGISTER]), SP_REGISTER, + htonl(ctx.cpu_registers[SP_REGISTER]), LR_REGISTER, + htonl(ctx.cpu_registers[LR_REGISTER])); } else { buffer = fmt::format("T{:02x}", latest_signal); } @@ -636,9 +858,59 @@ static void SendSignal(Kernel::Thread* thread, u32 signal, bool full = true) { SendReply(buffer.c_str()); } +static void HandleGetStopReason() { + if (is_extended_mode) { + // In extended mode, tell the debugger that there is no selected process yet. + // That way the debugger can ask for the process list and attach to the right one. + if (!current_process) { + // The process has not been selected yet. + SendReply("W00"); + } else { + SendStopReply(current_thread, latest_signal); + } + } else { + // In non extended mode, select the process corresponding to the "main" + // launched application. + u64 program_id = 0; + Core::System::GetInstance().GetAppLoader().ReadProgramId(program_id); + auto process_list = Core::System::GetInstance().Kernel().GetProcessList(); + for (const auto& process : process_list) { + if (process->codeset->program_id == program_id) { + current_process = process.get(); + current_process->SetDebugBreak(true); + is_running = false; + if (SetThread(0)) { + SendStopReply(current_thread, 0); + } else { + // Should never happen + SendReply("W00"); + } + return; + } + } + + // No process, should never happen + SendReply("W00"); + } +} + +static void BreakImpl(int signal) { + if (signal == SIGSEGV && !Core::GetCore(0).HasSingleInstructionBreakAccuracy()) { + LOG_WARNING(Debug_GDBStub, "The current CPU backend does not support accurate watchpoints " + "and memory exceptions. Disable CPU JIT for more accuracy."); + } + + current_process->SetDebugBreak(true); + is_running = false; + + latest_signal = signal; + + SendStopReply(current_thread, signal); +} + /// Read command from gdb client. static void ReadCommand() { - command_length = 0; + recv_command_length = 0; std::memset(command_buffer, 0, sizeof(command_buffer)); u8 c = ReadByte(); @@ -647,8 +919,7 @@ static void ReadCommand() { return; } else if (c == 0x03) { LOG_INFO(Debug_GDBStub, "gdb: found break command\n"); - halt_loop = true; - SendSignal(current_thread, SIGTRAP); + BreakImpl(SIGTRAP); return; } else if (c != GDB_STUB_START) { LOG_DEBUG(Debug_GDBStub, "gdb: read invalid byte {:02x}\n", c); @@ -656,27 +927,27 @@ static void ReadCommand() { } while ((c = ReadByte()) != GDB_STUB_END) { - if (command_length >= sizeof(command_buffer)) { + if (recv_command_length >= sizeof(command_buffer)) { LOG_ERROR(Debug_GDBStub, "gdb: command_buffer overflow\n"); SendPacket(GDB_STUB_NACK); return; } - command_buffer[command_length++] = c; + command_buffer[recv_command_length++] = c; } u8 checksum_received = HexCharToValue(ReadByte()) << 4; checksum_received |= HexCharToValue(ReadByte()); - u8 checksum_calculated = CalculateChecksum(command_buffer, command_length); + u8 checksum_calculated = CalculateChecksum(command_buffer, recv_command_length); if (checksum_received != checksum_calculated) { LOG_ERROR( Debug_GDBStub, "gdb: invalid checksum: calculated {:02x} and read {:02x} for ${}# (length: {})\n", checksum_calculated, checksum_received, reinterpret_cast(command_buffer), - command_length); + recv_command_length); - command_length = 0; + recv_command_length = 0; SendPacket(GDB_STUB_NACK); return; @@ -694,7 +965,7 @@ static bool IsDataAvailable() { fd_set fd_socket; FD_ZERO(&fd_socket); - FD_SET(static_cast(gdbserver_socket), &fd_socket); + FD_SET(gdbserver_socket, &fd_socket); struct timeval t; t.tv_sec = 0; @@ -710,6 +981,11 @@ static bool IsDataAvailable() { /// Send requested register to gdb client. static void ReadRegister() { + if (!current_process || !current_thread) { + SendReply("E01"); + return; + } + static u8 reply[64]; std::memset(reply, 0, sizeof(reply)); @@ -727,6 +1003,8 @@ static void ReadRegister() { LongToGdbHex(reply, FpuRead(id, current_thread)); } else if (id == FPSCR_REGISTER) { IntToGdbHex(reply, static_cast(FpuRead(id, current_thread))); + } else if (id == FPEXC_REGISTER) { + IntToGdbHex(reply, static_cast(FpuRead(id, current_thread))); } else { return SendReply("E01"); } @@ -736,6 +1014,11 @@ static void ReadRegister() { /// Send all registers to the gdb client. static void ReadRegisters() { + if (!current_process || !current_thread) { + SendReply("E01"); + return; + } + static u8 buffer[GDB_BUFFER_SIZE - 4]; std::memset(buffer, 0, sizeof(buffer)); @@ -759,11 +1042,31 @@ static void ReadRegisters() { IntToGdbHex(bufptr, static_cast(FpuRead(FPSCR_REGISTER, current_thread))); + bufptr += 8; + + IntToGdbHex(bufptr, static_cast(FpuRead(FPEXC_REGISTER, current_thread))); + SendReply(reinterpret_cast(buffer)); } +static void UpdateCPUThreadContext() { + u32 core_id = current_thread->core_id; + auto& system = Core::System::GetInstance(); + auto& thread_manager = system.Kernel().GetThreadManager(core_id); + if (thread_manager.GetCurrentThread() == current_thread) { + // Only update CPU context if current thread is active, + // otherwise it will be updated when the thread is selected + Core::GetCore(current_thread->core_id).LoadContext(current_thread->context); + } +} + /// Modify data of register specified by gdb client. static void WriteRegister() { + if (!current_process || !current_thread) { + SendReply("E01"); + return; + } + const u8* buffer_ptr = command_buffer + 3; u32 id = HexCharToValue(command_buffer[1]); @@ -781,71 +1084,84 @@ static void WriteRegister() { FpuWrite(id, GdbHexToLong(buffer_ptr), current_thread); } else if (id == FPSCR_REGISTER) { FpuWrite(id, GdbHexToInt(buffer_ptr), current_thread); + } else if (id == FPEXC_REGISTER) { + FpuWrite(id, GdbHexToInt(buffer_ptr), current_thread); } else { return SendReply("E01"); } - Core::GetRunningCore().LoadContext(current_thread->context); + UpdateCPUThreadContext(); SendReply("OK"); } /// Modify all registers with data received from the client. static void WriteRegisters() { + if (!current_process || !current_thread) { + SendReply("E01"); + return; + } + const u8* buffer_ptr = command_buffer + 1; if (command_buffer[0] != 'G') return SendReply("E01"); - for (u32 i = 0, reg = 0; reg <= FPSCR_REGISTER; i++, reg++) { + for (u32 i = 0, reg = 0; reg <= FPEXC_REGISTER; i++, reg++) { if (reg <= PC_REGISTER) { - RegWrite(reg, GdbHexToInt(buffer_ptr + i * 8)); + RegWrite(reg, GdbHexToInt(buffer_ptr + i * 8), current_thread); } else if (reg == CPSR_REGISTER) { - RegWrite(reg, GdbHexToInt(buffer_ptr + i * 8)); + RegWrite(reg, GdbHexToInt(buffer_ptr + i * 8), current_thread); } else if (reg == CPSR_REGISTER - 1) { // Dummy FPA register, ignore } else if (reg < CPSR_REGISTER) { // Dummy FPA registers, ignore i += 2; } else if (reg >= D0_REGISTER && reg < FPSCR_REGISTER) { - FpuWrite(reg, GdbHexToLong(buffer_ptr + i * 16)); + FpuWrite(reg, GdbHexToLong(buffer_ptr + i * 16), current_thread); i++; // Skip padding } else if (reg == FPSCR_REGISTER) { - FpuWrite(reg, GdbHexToInt(buffer_ptr + i * 8)); + FpuWrite(reg, GdbHexToInt(buffer_ptr + i * 8), current_thread); + } else if (reg == FPEXC_REGISTER) { + FpuWrite(reg, GdbHexToInt(buffer_ptr + i * 8), current_thread); } } - Core::GetRunningCore().LoadContext(current_thread->context); + UpdateCPUThreadContext(); SendReply("OK"); } /// Read location in memory specified by gdb client. static void ReadMemory() { + if (!current_process) { + SendReply(""); + return; + } + static u8 reply[GDB_BUFFER_SIZE - 4]; auto start_offset = command_buffer + 1; - auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); + auto addr_pos = std::find(start_offset, command_buffer + recv_command_length, ','); VAddr addr = HexToInt(start_offset, static_cast(addr_pos - start_offset)); start_offset = addr_pos + 1; - u32 len = - HexToInt(start_offset, static_cast((command_buffer + command_length) - start_offset)); + u32 len = HexToInt(start_offset, + static_cast((command_buffer + recv_command_length) - start_offset)); LOG_DEBUG(Debug_GDBStub, "ReadMemory addr: {:08x} len: {:08x}", addr, len); if (len * 2 > sizeof(reply)) { - SendReply("E01"); + SendReply(""); } auto& memory = Core::System::GetInstance().Memory(); - if (!memory.IsValidVirtualAddress(*Core::System::GetInstance().Kernel().GetCurrentProcess(), - addr)) { - return SendReply("E00"); + if (!memory.IsValidVirtualAddress(*current_process, addr)) { + return SendReply(""); } std::vector data(len); - memory.ReadBlock(addr, data.data(), len); + memory.ReadBlock(*current_process, addr, data.data(), len); MemToGdbHex(reply, data.data(), len); reply[len * 2] = '\0'; @@ -858,60 +1174,84 @@ static void ReadMemory() { /// Modify location in memory with data received from the gdb client. static void WriteMemory() { + if (!current_process) { + SendReply("E01"); + return; + } + auto start_offset = command_buffer + 1; - auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); + auto addr_pos = std::find(start_offset, command_buffer + recv_command_length, ','); VAddr addr = HexToInt(start_offset, static_cast(addr_pos - start_offset)); start_offset = addr_pos + 1; - auto len_pos = std::find(start_offset, command_buffer + command_length, ':'); + auto len_pos = std::find(start_offset, command_buffer + recv_command_length, ':'); u32 len = HexToInt(start_offset, static_cast(len_pos - start_offset)); auto& memory = Core::System::GetInstance().Memory(); - if (!memory.IsValidVirtualAddress(*Core::System::GetInstance().Kernel().GetCurrentProcess(), - addr)) { - return SendReply("E00"); + if (!memory.IsValidVirtualAddress(*current_process, addr)) { + return SendReply("E0E"); } std::vector data(len); GdbHexToMem(data.data(), len_pos + 1, len); - memory.WriteBlock(addr, data.data(), len); - Core::GetRunningCore().ClearInstructionCache(); + memory.WriteBlock(*current_process, addr, data.data(), len); + ClearAllInstructionCache(); SendReply("OK"); } -void Break(bool is_memory_break) { - send_trap = true; - - memory_break = is_memory_break; -} - -/// Tell the CPU that it should perform a single step. -static void Step() { - if (command_length > 1) { - RegWrite(PC_REGISTER, GdbHexToInt(command_buffer + 1), current_thread); - Core::GetRunningCore().LoadContext(current_thread->context); +void Break(int signal) { + if (!IsConnected() || !current_process || + Core::System::GetInstance().Kernel().GetCurrentProcess().get() != current_process) { + LOG_ERROR(Debug_GDBStub, "Got signal for un-attached process, ignoring..."); + return; } - step_loop = true; - halt_loop = true; - send_trap = true; + + if (break_thread) { + LOG_ERROR(Debug_GDBStub, + "Got multiple break signals in quick succession, latest may be lost"); + return; + } + + break_thread = + Core::System::GetInstance().Kernel().GetCurrentThreadManager().GetCurrentThread(); + if (break_thread) { + break_signal = signal; + } + + // Try to break CPU asap + Core::GetRunningCore().SetBreakFlag(); Core::GetRunningCore().ClearInstructionCache(); -} - -bool IsMemoryBreak() { - if (!IsConnected()) { - return false; - } - - return memory_break; + Core::GetRunningCore().PrepareReschedule(); } /// Tell the CPU to continue executing. static void Continue() { - memory_break = false; - step_loop = false; - halt_loop = false; - Core::GetRunningCore().ClearInstructionCache(); + if (!current_process) { + return; + } + + u32 thread_id = -1; + if (continue_thread == 0) { + thread_id = current_process->GetThreadList()[0]->thread_id; + } else { + thread_id = continue_thread; + } + + // There is no documentation anywhere if continue should + // reset the continue thread value. Luma3DS implementation + // does this, and looks like IDA Pro expects it that way too. + continue_thread = -1; + + std::vector continue_list{}; + if (thread_id != -1) { + continue_list.push_back(thread_id); + } + + current_process->SetDebugBreak(false, continue_list); + is_running = true; + + ClearAllInstructionCache(); } /** @@ -924,20 +1264,26 @@ static void Continue() { static bool CommitBreakpoint(BreakpointType type, VAddr addr, u32 len) { BreakpointMap& p = GetBreakpointMap(type); + if (type == BreakpointType::Execute && len != 2 && len != 4) { + return false; + } + Breakpoint breakpoint; breakpoint.active = true; breakpoint.addr = addr; breakpoint.len = len; - Core::System::GetInstance().Memory().ReadBlock( - *Core::System::GetInstance().Kernel().GetCurrentProcess(), addr, breakpoint.inst.data(), - breakpoint.inst.size()); + Core::System::GetInstance().Memory().ReadBlock(*current_process, addr, breakpoint.inst.data(), + len); static constexpr std::array btrap{0x70, 0x00, 0x20, 0xe1}; + static constexpr std::array btrap_thumb{0x00, 0xBE}; + if (type == BreakpointType::Execute) { Core::System::GetInstance().Memory().WriteBlock( - *Core::System::GetInstance().Kernel().GetCurrentProcess(), addr, btrap.data(), - btrap.size()); - Core::GetRunningCore().ClearInstructionCache(); + *current_process, addr, (len == 2) ? btrap_thumb.data() : btrap.data(), len); + ClearAllInstructionCache(); + } else { + Core::System::GetInstance().Memory().RegisterWatchpoint(*current_process, addr, len); } p.insert({addr, breakpoint}); @@ -949,6 +1295,11 @@ static bool CommitBreakpoint(BreakpointType type, VAddr addr, u32 len) { /// Handle add breakpoint command from gdb client. static void AddBreakpoint() { + if (!current_process) { + SendReply("E01"); + return; + } + BreakpointType type; u8 type_id = HexCharToValue(command_buffer[1]); @@ -971,12 +1322,12 @@ static void AddBreakpoint() { } auto start_offset = command_buffer + 3; - auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); + auto addr_pos = std::find(start_offset, command_buffer + recv_command_length, ','); VAddr addr = HexToInt(start_offset, static_cast(addr_pos - start_offset)); start_offset = addr_pos + 1; - u32 len = - HexToInt(start_offset, static_cast((command_buffer + command_length) - start_offset)); + u32 len = HexToInt(start_offset, + static_cast((command_buffer + recv_command_length) - start_offset)); if (type == BreakpointType::Access) { // Access is made up of Read and Write types, so add both breakpoints @@ -998,6 +1349,11 @@ static void AddBreakpoint() { /// Handle remove breakpoint command from gdb client. static void RemoveBreakpoint() { + if (!current_process) { + SendReply("E01"); + return; + } + BreakpointType type; u8 type_id = HexCharToValue(command_buffer[1]); @@ -1020,7 +1376,7 @@ static void RemoveBreakpoint() { } auto start_offset = command_buffer + 3; - auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); + auto addr_pos = std::find(start_offset, command_buffer + recv_command_length, ','); VAddr addr = HexToInt(start_offset, static_cast(addr_pos - start_offset)); if (type == BreakpointType::Access) { @@ -1035,11 +1391,146 @@ static void RemoveBreakpoint() { SendReply("OK"); } +void HandleVCommand() { + std::string_view cmd_view((const char*)command_buffer, recv_command_length); + + if (cmd_view.size() <= 1) { + SendReply("E01"); + return; + } + size_t delimiter_pos = cmd_view.find(';'); + std::string_view command = + cmd_view.substr(1, delimiter_pos == cmd_view.npos ? cmd_view.npos : delimiter_pos); + if (command == "Attach;") { + if (!is_extended_mode) { + SendReply("E01"); + return; + } + + std::string_view arg = cmd_view.substr(delimiter_pos + 1); + u32 pid = HexToInt(reinterpret_cast(arg.data()), arg.size()); + auto process = Core::System::GetInstance().Kernel().GetProcessById(pid); + if (!process) { + SendReply("E02"); + } else { + current_process = process.get(); + current_process->SetDebugBreak(true); + is_running = false; + if (SetThread(0)) { + SendStopReply(current_thread, 0); + } else { + // Should never happen + SendReply("W00"); + } + } + return; + } else if (command == "Cont?") { + SendReply("vCont;c;C"); + } else if (command == "Cont;") { + if (!current_process) { + SendReply("E01"); + return; + } + + std::string_view arg = cmd_view.substr(delimiter_pos + 1); + auto actions = Common::SplitString(arg, ';'); + + if (actions.empty()) { + SendReply("E01"); + return; + } + for (auto& action : actions) { + auto threads = Common::SplitString(action, ':'); + if (threads.empty()) { + SendReply("E01"); + return; + } + char action_type = threads[0][0]; + if (action_type != 'c' && action_type != 'C') { + SendReply("E01"); + return; + } + std::vector thread_ids; + for (size_t i = 1; i < threads.size(); i++) { + thread_ids.push_back( + HexToInt(reinterpret_cast(threads[i].c_str()), threads[i].size())); + } + + current_process->SetDebugBreak(false, thread_ids); + is_running = true; + } + } else { + SendReply(""); + } +} + +void OnProcessExit(u32 process_id) { + if (!GDBStub::IsConnected || !current_process || current_process->process_id != process_id) { + return; + } + + current_process_finished = true; + if (is_running) { + SendStopReply(nullptr, 0); + } + current_process = nullptr; + current_thread = nullptr; +} + +void OnThreadExit(u32 thread_id) { + if (!GDBStub::IsConnected || !current_thread || current_thread->thread_id != thread_id) { + return; + } + + current_thread = nullptr; +} + void HandlePacket(Core::System& system) { + if (!IsConnected()) { if (defer_start) { ToggleServer(true); + defer_start = false; } + + // Handle accept new GDB connection + if (accept_socket != INVALID_SOCKET) { + sockaddr_in saddr_client; + sockaddr* client_addr = reinterpret_cast(&saddr_client); + socklen_t client_addrlen = sizeof(saddr_client); + gdbserver_socket = + static_cast(accept(accept_socket, client_addr, &client_addrlen)); + if (gdbserver_socket == INVALID_SOCKET) { +#ifdef _WIN32 + if (GetErrno() == WSAEWOULDBLOCK) { + // Nothing connected yet + return; + } +#else + if (GetErrno() == EAGAIN || GetErrno() == EWOULDBLOCK) { + // Nothing connected yet + return; + } +#endif + LOG_ERROR(Debug_GDBStub, "Failed to accept gdb client"); + } else { + LOG_INFO(Debug_GDBStub, "Client connected.\n"); + SetNonBlock(gdbserver_socket, false); + } + + shutdown(accept_socket, SHUT_RDWR); + closesocket(accept_socket); + accept_socket = INVALID_SOCKET; + } + return; + } + + if (break_thread) { + current_thread = break_thread; + break_thread = nullptr; + int signal = break_signal; + break_signal = 0; + BreakImpl(signal); return; } @@ -1053,10 +1544,15 @@ void HandlePacket(Core::System& system) { } ReadCommand(); - if (command_length == 0) { + if (recv_command_length == 0) { return; } +#ifdef PRINT_GDB_TRAFFIC + std::string cmd_str(command_buffer + 1, command_buffer + recv_command_length); + LOG_INFO(Debug_GDBStub, "Req: {:c} {}", command_buffer[0], cmd_str); +#endif + LOG_DEBUG(Debug_GDBStub, "Packet: {0:d} ('{0:c}')", command_buffer[0]); switch (command_buffer[0]) { @@ -1067,16 +1563,29 @@ void HandlePacket(Core::System& system) { HandleSetThread(); break; case '?': - SendSignal(current_thread, latest_signal); + HandleGetStopReason(); + break; + case '!': + HandleExtendedMode(); + break; + case 'D': + SendReply("OK"); + ToggleServer(false); + ToggleServer(true); + // Continue execution + continue_thread = -1; + Continue(); break; case 'k': LOG_INFO(Debug_GDBStub, "killed by gdb"); ToggleServer(false); - // Continue execution so we don't hang forever after shutting down the server + // Continue execution and stop emulation + continue_thread = -1; Continue(); + system.RequestShutdown(); return; case 'F': - HandleHioReply(system, command_buffer, command_length); + HandleHioReply(system, current_process, command_buffer, recv_command_length); break; case 'g': ReadRegisters(); @@ -1097,7 +1606,8 @@ void HandlePacket(Core::System& system) { WriteMemory(); break; case 's': - Step(); + // Single step not supported, return ENOTSUP + SendReply("E5F"); return; case 'C': case 'c': @@ -1112,6 +1622,9 @@ void HandlePacket(Core::System& system) { case 'T': HandleThreadAlive(); break; + case 'v': + HandleVCommand(); + break; default: SendReply(""); break; @@ -1127,14 +1640,12 @@ void ToggleServer(bool status) { server_enabled = status; // Start server - if (!IsConnected() && Core::System::GetInstance().IsPoweredOn()) { + if (!IsInitialized() && Core::System::GetInstance().IsPoweredOn()) { Init(); } } else { // Stop server - if (IsConnected()) { - Shutdown(); - } + Shutdown(); server_enabled = status; } @@ -1146,21 +1657,9 @@ void DeferStart() { static void Init(u16 port) { if (!server_enabled) { - // Set the halt loop to false in case the user enabled the gdbstub mid-execution. - // This way the CPU can still execute normally. - halt_loop = false; - step_loop = false; return; } - // Setup initial gdbstub status - halt_loop = true; - step_loop = false; - - breakpoints_execute.clear(); - breakpoints_read.clear(); - breakpoints_write.clear(); - // Start gdb server LOG_INFO(Debug_GDBStub, "Starting GDB server on port {}...", port); @@ -1173,50 +1672,36 @@ static void Init(u16 port) { WSAStartup(MAKEWORD(2, 2), &InitData); #endif - int tmpsock = static_cast(socket(PF_INET, SOCK_STREAM, 0)); - if (tmpsock == -1) { + accept_socket = static_cast(socket(PF_INET, SOCK_STREAM, 0)); + if (accept_socket == INVALID_SOCKET) { LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket"); + return; } // Set socket to SO_REUSEADDR so it can always bind on the same port int reuse_enabled = 1; - if (setsockopt(tmpsock, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse_enabled, + if (setsockopt(accept_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse_enabled, sizeof(reuse_enabled)) < 0) { LOG_ERROR(Debug_GDBStub, "Failed to set gdb socket option"); + Shutdown(); + return; } const sockaddr* server_addr = reinterpret_cast(&saddr_server); socklen_t server_addrlen = sizeof(saddr_server); - if (bind(tmpsock, server_addr, server_addrlen) < 0) { + if (bind(accept_socket, server_addr, server_addrlen) < 0) { LOG_ERROR(Debug_GDBStub, "Failed to bind gdb socket"); + Shutdown(); + return; } - if (listen(tmpsock, 1) < 0) { + if (listen(accept_socket, 1) < 0) { LOG_ERROR(Debug_GDBStub, "Failed to listen to gdb socket"); + Shutdown(); + return; } - // Wait for gdb to connect - LOG_INFO(Debug_GDBStub, "Waiting for gdb to connect...\n"); - sockaddr_in saddr_client; - sockaddr* client_addr = reinterpret_cast(&saddr_client); - socklen_t client_addrlen = sizeof(saddr_client); - gdbserver_socket = static_cast(accept(tmpsock, client_addr, &client_addrlen)); - if (gdbserver_socket < 0) { - // In the case that we couldn't start the server for whatever reason, just start CPU - // execution like normal. - halt_loop = false; - step_loop = false; - - LOG_ERROR(Debug_GDBStub, "Failed to accept gdb client"); - } else { - LOG_INFO(Debug_GDBStub, "Client connected.\n"); - saddr_client.sin_addr.s_addr = ntohl(saddr_client.sin_addr.s_addr); - } - - // Clean up temporary socket if it's still alive at this point. - if (tmpsock != -1) { - shutdown(tmpsock, SHUT_RDWR); - } + SetNonBlock(accept_socket, true); } void Init() { @@ -1227,18 +1712,28 @@ void Shutdown() { if (!server_enabled) { return; } - defer_start = false; + + RemoveAllBreakpoints(); LOG_INFO(Debug_GDBStub, "Stopping GDB ..."); - if (gdbserver_socket != -1) { + if (gdbserver_socket != INVALID_SOCKET) { shutdown(gdbserver_socket, SHUT_RDWR); - gdbserver_socket = -1; + closesocket(gdbserver_socket); + gdbserver_socket = INVALID_SOCKET; + } + + if (accept_socket != INVALID_SOCKET) { + shutdown(accept_socket, SHUT_RDWR); + closesocket(accept_socket); + accept_socket = INVALID_SOCKET; } #ifdef _WIN32 WSACleanup(); #endif + ResetState(); + LOG_INFO(Debug_GDBStub, "GDB stopped."); } @@ -1246,36 +1741,12 @@ bool IsServerEnabled() { return server_enabled; } +bool IsInitialized() { + return IsServerEnabled() && + (accept_socket != INVALID_SOCKET || gdbserver_socket != INVALID_SOCKET); +} + bool IsConnected() { - return IsServerEnabled() && gdbserver_socket != -1; -} - -bool GetCpuHaltFlag() { - return halt_loop; -} - -void SetCpuHaltFlag(bool halt) { - halt_loop = halt; -} - -bool GetCpuStepFlag() { - return step_loop; -} - -void SetCpuStepFlag(bool is_step) { - step_loop = is_step; -} - -void SendTrap(Kernel::Thread* thread, int trap) { - if (!send_trap) { - return; - } - - current_thread = thread; - - SendSignal(thread, trap); - - halt_loop = true; - send_trap = false; + return IsServerEnabled() && gdbserver_socket != INVALID_SOCKET; } }; // namespace GDBStub diff --git a/src/core/gdbstub/gdbstub.h b/src/core/gdbstub/gdbstub.h index fc0c7df23..0fd3c7c00 100644 --- a/src/core/gdbstub/gdbstub.h +++ b/src/core/gdbstub/gdbstub.h @@ -1,3 +1,7 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + // Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. @@ -10,6 +14,10 @@ #include "common/common_types.h" #include "core/hle/kernel/thread.h" +#ifndef ENABLE_GDBSTUB +#error "File was included with GDB stub support disabled" +#endif + namespace Core { class System; } @@ -60,18 +68,28 @@ void Shutdown(); /// Checks if the gdbstub server is enabled. bool IsServerEnabled(); +/// Returns true if the GDB server is initialized +bool IsInitialized(); + /// Returns true if there is an active socket connection. bool IsConnected(); /** * Signal to the gdbstub server that it should halt CPU execution. * - * @param is_memory_break If true, the break resulted from a memory breakpoint. + * @param signal Signal that produced the break (SIGTRAP by default) */ -void Break(bool is_memory_break = false); +void Break(int signal); -/// Determine if there was a memory breakpoint. -bool IsMemoryBreak(); +/** + * Signal to the GDB stub that the specified process ID is exiting + */ +void OnProcessExit(u32 process_id); + +/** + * Signal to the GDB stub that the specified thread ID is exiting + */ +void OnThreadExit(u32 thread_id); /// Read and handle packet from gdb client. void HandlePacket(Core::System& system); @@ -88,37 +106,10 @@ BreakpointAddress GetNextBreakpointFromAddress(VAddr addr, GDBStub::BreakpointTy * Check if a breakpoint of the specified type exists at the given address. * * @param addr Address of breakpoint. + * @param access_len Access size in bytes. * @param type Type of breakpoint. */ -bool CheckBreakpoint(VAddr addr, GDBStub::BreakpointType type); - -// If set to true, the CPU will halt at the beginning of the next CPU loop. -bool GetCpuHaltFlag(); - -/** - * If set to true, the CPU will halt at the beginning of the next CPU loop. - * - * @param halt whether to halt on the next loop - */ -void SetCpuHaltFlag(bool halt); - -// If set to true and the CPU is halted, the CPU will step one instruction. -bool GetCpuStepFlag(); - -/** - * When set to true, the CPU will step one instruction when the CPU is halted next. - * - * @param is_step - */ -void SetCpuStepFlag(bool is_step); - -/** - * Send trap signal from thread back to the gdbstub server. - * - * @param thread Sending thread. - * @param trap Trap no. - */ -void SendTrap(Kernel::Thread* thread, int trap); +bool CheckBreakpoint(VAddr addr, u32 access_len, BreakpointType type); /** * Send reply to gdb client. diff --git a/src/core/gdbstub/hio.cpp b/src/core/gdbstub/hio.cpp index 00eab9061..8a8a7adc6 100644 --- a/src/core/gdbstub/hio.cpp +++ b/src/core/gdbstub/hio.cpp @@ -1,13 +1,22 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include #include "common/string_util.h" #include "core/core.h" #include "core/gdbstub/gdbstub.h" #include "core/gdbstub/hio.h" +#ifndef ENABLE_GDBSTUB +#error "File was compiled with GDB stub support disabled" +#endif + +#ifndef SIGTRAP +constexpr u32 SIGTRAP = 5; +#endif + namespace GDBStub { namespace { @@ -23,9 +32,6 @@ enum class Status { static std::atomic request_status{Status::NoRequest}; -static std::atomic was_halted = false; -static std::atomic was_stepping = false; - } // namespace /** @@ -54,7 +60,7 @@ static void SendErrorReply(int error_code, int retval = -1) { SendReply(packet.data()); } -void SetHioRequest(Core::System& system, const VAddr addr) { +void SetHioRequest(Core::System& system, Kernel::Process* process, const VAddr addr) { if (!IsServerEnabled()) { LOG_WARNING(Debug_GDBStub, "HIO requested but GDB stub is not running"); return; @@ -70,14 +76,13 @@ void SetHioRequest(Core::System& system, const VAddr addr) { } auto& memory = system.Memory(); - const auto process = system.Kernel().GetCurrentProcess(); if (!memory.IsValidVirtualAddress(*process, addr)) { LOG_WARNING(Debug_GDBStub, "Invalid address for HIO request"); return; } - memory.ReadBlock(addr, ¤t_hio_request, sizeof(PackedGdbHioRequest)); + memory.ReadBlock(*process, addr, ¤t_hio_request, sizeof(PackedGdbHioRequest)); if (current_hio_request.magic != std::array{'G', 'D', 'B', '\0'}) { std::string_view bad_magic{ @@ -97,18 +102,13 @@ void SetHioRequest(Core::System& system, const VAddr addr) { current_hio_request_addr = addr; request_status = Status::NotSent; - was_halted = GetCpuHaltFlag(); - was_stepping = GetCpuStepFlag(); - // Now halt, so that no further instructions are executed until the request // is processed by the client. We will continue after the reply comes back - Break(); - SetCpuHaltFlag(true); - SetCpuStepFlag(false); + Break(SIGTRAP); system.GetRunningCore().ClearInstructionCache(); } -void HandleHioReply(Core::System& system, const u8* const command_buffer, +void HandleHioReply(Core::System& system, Kernel::Process* process, const u8* const command_buffer, const u32 command_length) { if (!IsWaitingForHioReply()) { LOG_WARNING(Debug_GDBStub, "Got HIO reply but never sent a request"); @@ -177,7 +177,6 @@ void HandleHioReply(Core::System& system, const u8* const command_buffer, current_hio_request.retval, current_hio_request.gdb_errno, current_hio_request.ctrl_c); - const auto process = system.Kernel().GetCurrentProcess(); auto& memory = system.Memory(); // should have been checked when we first initialized the request, @@ -188,15 +187,14 @@ void HandleHioReply(Core::System& system, const u8* const command_buffer, return; } - memory.WriteBlock(current_hio_request_addr, ¤t_hio_request, sizeof(PackedGdbHioRequest)); + memory.WriteBlock(*process, current_hio_request_addr, ¤t_hio_request, + sizeof(PackedGdbHioRequest)); current_hio_request = {}; current_hio_request_addr = 0; request_status = Status::NoRequest; // Restore state from before the request came in - SetCpuStepFlag(was_stepping); - SetCpuHaltFlag(was_halted); system.GetRunningCore().ClearInstructionCache(); } diff --git a/src/core/gdbstub/hio.h b/src/core/gdbstub/hio.h index 827521841..066bef55a 100644 --- a/src/core/gdbstub/hio.h +++ b/src/core/gdbstub/hio.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -6,10 +6,18 @@ #include "common/common_types.h" +#ifndef ENABLE_GDBSTUB +#error "File was included with GDB stub support disabled" +#endif + namespace Core { class System; } +namespace Kernel { +class Process; +} + namespace GDBStub { /** @@ -51,7 +59,7 @@ static_assert(sizeof(PackedGdbHioRequest) == 152, * * @param address The memory address of the \ref PackedGdbHioRequest. */ -void SetHioRequest(Core::System& system, const VAddr address); +void SetHioRequest(Core::System& system, Kernel::Process* process, const VAddr address); /** * If there is a pending HIO request, send it to the client. @@ -63,6 +71,7 @@ bool HandlePendingHioRequestPacket(); /** * Process an HIO reply from the client. */ -void HandleHioReply(Core::System& system, const u8* const command_buffer, const u32 command_length); +void HandleHioReply(Core::System& system, Kernel::Process* process, const u8* const command_buffer, + const u32 command_length); } // namespace GDBStub diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 5e0d3810f..b895a1f13 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -16,6 +16,9 @@ #include "common/logging/log.h" #include "common/serialization/boost_vector.hpp" #include "core/core.h" +#ifdef ENABLE_GDBSTUB +#include "core/gdbstub/gdbstub.h" +#endif #include "core/hle/kernel/errors.h" #include "core/hle/kernel/memory.h" #include "core/hle/kernel/process.h" @@ -260,9 +263,25 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { vm_manager.LogLayout(Common::Log::Level::Debug); Kernel::SetupMainThread(kernel, codeset->entrypoint, main_thread_priority, SharedFrom(this)); + + // Pause process at start if flag enabled and we are not a sysmodule + if (Core::System::GetInstance().GetDebugNextProcessFlag() && + resource_limit->GetCategory() != Kernel::ResourceLimitCategory::Other) { +#ifdef ENABLE_GDBSTUB + if (GDBStub::IsServerEnabled()) { + LOG_INFO(Loader, "Pausing process {} at start", process_id); + SetDebugBreak(true); + } +#endif + Core::System::GetInstance().ClearDebugNextProcessFlag(); + } } void Process::Exit() { +#ifdef ENABLE_GDBSTUB + GDBStub::OnProcessExit(process_id); +#endif + auto plgldr = Service::PLGLDR::GetService(Core::System::GetInstance()); if (plgldr) { plgldr->OnProcessExit(*this, kernel); @@ -592,6 +611,42 @@ Result Process::Unmap(VAddr target, VAddr source, u32 size, VMAPermission perms, return ResultSuccess; } +std::vector> Kernel::Process::GetThreadList() { + std::vector> ret; + for (u32 core = 0; core < Core::GetNumCores(); core++) { + auto thread_list = kernel.GetThreadManager(core).GetThreadList(); + for (auto& thread : thread_list) { + if (thread->owner_process.lock().get() == this) { + ret.push_back(thread); + } + } + } + return ret; +} + +void Kernel::Process::SetDebugBreak(bool debug_break, std::vector thread_ids) { + auto thread_list = GetThreadList(); + bool needs_reschedule = false; + for (auto& t : thread_list) { + + if (!thread_ids.empty()) { + u32 thread_id = t->thread_id; + if (std::find(thread_ids.begin(), thread_ids.end(), thread_id) == thread_ids.end()) { + continue; + } + } + + needs_reschedule |= t->SetDebugBreak(debug_break); + } + + if (needs_reschedule) { + for (u32 i = 0; i < Core::GetNumCores(); i++) { + Core::GetCore(i).PrepareReschedule(); + kernel.GetThreadManager(i).Reschedule(); + } + } +} + void Process::FreeAllMemory() { if (memory_region == nullptr || resource_limit == nullptr) { return; diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index 7ec1adfbb..4067839cd 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -226,6 +226,10 @@ public: Result Unmap(VAddr target, VAddr source, u32 size, VMAPermission perms, bool privileged = false); + std::vector> GetThreadList(); + + void SetDebugBreak(bool debug_break, std::vector thread_ids = {}); + private: void FreeAllMemory(); diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 833543d9a..7392de779 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -14,7 +14,9 @@ #include "core/arm/arm_interface.h" #include "core/core.h" #include "core/core_timing.h" +#ifdef ENABLE_GDBSTUB #include "core/gdbstub/hio.h" +#endif #include "core/hle/kernel/address_arbiter.h" #include "core/hle/kernel/client_port.h" #include "core/hle/kernel/client_session.h" @@ -1171,7 +1173,9 @@ void SVC::OutputDebugString(VAddr address, s32 len) { } if (len == 0) { - GDBStub::SetHioRequest(system, address); +#ifdef ENABLE_GDBSTUB + GDBStub::SetHioRequest(system, kernel.GetCurrentProcess().get(), address); +#endif return; } diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 41a706fdd..5f982c9e6 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -17,6 +17,9 @@ #include "core/arm/arm_interface.h" #include "core/arm/skyeye_common/armstate.h" #include "core/core.h" +#ifdef ENABLE_GDBSTUB +#include "core/gdbstub/gdbstub.h" +#endif #include "core/hle/kernel/errors.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/mutex.h" @@ -77,6 +80,7 @@ void Thread::serialize(Archive& ar, const unsigned int file_version) { } } ar & wakeup_callback; + ar & debug_break; } SERIALIZE_IMPL(Thread) @@ -133,6 +137,10 @@ void Thread::Stop() { process->tls_slots[tls_page].reset(tls_slot); process->resource_limit->Release(ResourceLimitType::Thread, 1); } + +#ifdef ENABLE_GDBSTUB + GDBStub::OnThreadExit(thread_id); +#endif } void ThreadManager::SwitchContext(Thread* new_thread) { @@ -191,7 +199,7 @@ Thread* ThreadManager::PopNextReadyThread() { u32 next_priority{}; next = nullptr; - if (thread && thread->status == ThreadStatus::Running) { + if (thread && thread->status == ThreadStatus::Running && thread->CanSchedule()) { do { // We have to do better than the current thread. // This call returns null when that's not possible. @@ -201,18 +209,18 @@ Thread* ThreadManager::PopNextReadyThread() { // Otherwise just keep going with the current thread next = thread; break; - } else if (!next->can_schedule) { + } else if (!next->CanSchedule()) { skipped.push_back({next_priority, next}); } - } while (!next->can_schedule); + } while (!next->CanSchedule()); } else { do { std::tie(next_priority, next) = ready_queue.pop_first(); - if (next && !next->can_schedule) { + if (next && !next->CanSchedule()) { skipped.push_back({next_priority, next}); } - } while (next && !next->can_schedule); + } while (next && !next->CanSchedule()); } for (auto it = skipped.rbegin(); it != skipped.rend(); it++) { @@ -537,6 +545,14 @@ VAddr Thread::GetCommandBufferAddress() const { return GetTLSAddress() + command_header_offset; } +bool Thread::SetDebugBreak(bool _debug_break) { + if (debug_break == _debug_break) { + return false; + } + debug_break = _debug_break; + return true; +} + CpuLimiter::~CpuLimiter() {} CpuLimiterMulti::CpuLimiterMulti(Kernel::KernelSystem& _kernel) : kernel(_kernel) {} diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h index be515319b..49891b31a 100644 --- a/src/core/hle/kernel/thread.h +++ b/src/core/hle/kernel/thread.h @@ -365,6 +365,15 @@ public: return status == ThreadStatus::WaitSynchAll; } + bool CanSchedule() { + // TODO(PabloMK7): This may not be the proper way + // threads are marked as non-schedulable when they + // are in debug break. Figure out and fix. + return can_schedule && !debug_break; + } + + bool SetDebugBreak(bool debug_break); + Core::ARM_Interface::ThreadContext context{}; u32 thread_id; @@ -410,6 +419,7 @@ public: private: ThreadManager& thread_manager; + bool debug_break{}; friend class boost::serialization::access; template diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 41ad049e5..ee446eb6d 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include #include @@ -12,10 +13,14 @@ #include "common/atomic_ops.h" #include "common/common_types.h" #include "common/logging/log.h" +#include "common/optional_helper.h" #include "common/settings.h" #include "common/swap.h" #include "core/arm/arm_interface.h" #include "core/core.h" +#ifdef ENABLE_GDBSTUB +#include "core/gdbstub/gdbstub.h" +#endif #include "core/global.h" #include "core/hle/kernel/process.h" #include "core/hle/service/plgldr/plgldr.h" @@ -28,6 +33,14 @@ SERIALIZE_EXPORT_IMPL(Memory::MemorySystem::BackingMemImpl SERIALIZE_EXPORT_IMPL(Memory::MemorySystem::BackingMemImpl) SERIALIZE_EXPORT_IMPL(Memory::MemorySystem::BackingMemImpl) +#ifndef SIGTRAP +constexpr u32 SIGTRAP = 5; +#endif + +#ifndef SIGSEGV +constexpr u32 SIGSEGV = 11; +#endif + namespace Memory { void PageTable::Clear() { @@ -187,7 +200,17 @@ public: std::memcpy(dest_buffer, src_ptr, copy_amount); break; } - case PageType::RasterizerCachedMemory: { + case PageType::MemoryWatchpoint: { + auto it = page_table.watchpoint_pages_map.find(page_index); + ASSERT_MSG(it != page_table.watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + const u8* src_ptr = it->second.memory.GetPtr() + page_offset; + std::memcpy(dest_buffer, src_ptr, copy_amount); + break; + } + case PageType::RasterizerCachedMemory: + case PageType::RasterizerCachedMemoryWatchpoint: { if constexpr (!UNSAFE) { RasterizerFlushVirtualRegion(current_vaddr, static_cast(copy_amount), FlushMode::Flush); @@ -235,7 +258,17 @@ public: std::memcpy(dest_ptr, src_buffer, copy_amount); break; } - case PageType::RasterizerCachedMemory: { + case PageType::MemoryWatchpoint: { + auto it = page_table.watchpoint_pages_map.find(page_index); + ASSERT_MSG(it != page_table.watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + u8* dest_ptr = it->second.memory.GetPtr() + page_offset; + std::memcpy(dest_ptr, src_buffer, copy_amount); + break; + } + case PageType::RasterizerCachedMemory: + case PageType::RasterizerCachedMemoryWatchpoint: { if constexpr (!UNSAFE) { RasterizerFlushVirtualRegion(current_vaddr, static_cast(copy_amount), FlushMode::Invalidate); @@ -392,6 +425,88 @@ PAddr& Memory::MemorySystem::Plugin3GXFramebufferAddress() { return impl->plugin_fb_address; } +void MemorySystem::RegisterWatchpoint(const Kernel::Process& process, VAddr addr, u32 size) { + auto& page_table = *process.vm_manager.page_table; + + VAddr current = addr; + VAddr end = addr + size; + + while (current < end) { + const VAddr page_base = (current & ~CITRA_PAGE_MASK); + const VAddr page_index = page_base >> CITRA_PAGE_BITS; + + auto it = page_table.watchpoint_pages_map.find(page_index); + if (it != page_table.watchpoint_pages_map.end()) { + // Nothing to do, only increment count. + it->second.watchpoint_count++; + } else { + MemoryRef mem; + PageType& type = page_table.attributes[page_index]; + + switch (type) { + case PageType::Memory: + mem = page_table.pointers.Ref(page_index); + type = PageType::MemoryWatchpoint; + page_table.pointers[page_index] = nullptr; + break; + case PageType::RasterizerCachedMemory: + mem = GetPointerForRasterizerCache(page_base); + type = PageType::RasterizerCachedMemoryWatchpoint; + break; + default: + LOG_ERROR(HW_Memory, "Cannot get pointer to register watchpoint for page 0x{:08X}", + page_base); + continue; + } + + page_table.watchpoint_pages_map.insert( + {page_index, + PageTable::WatchpointPageInfo{.watchpoint_count = 1, .memory = std::move(mem)}}); + } + + current = page_base + CITRA_PAGE_SIZE; + } +} + +void MemorySystem::UnregisterWatchpoint(const Kernel::Process& process, VAddr addr, u32 size) { + auto& page_table = *process.vm_manager.page_table; + + VAddr current = addr; + VAddr end = addr + size; + + while (current < end) { + const VAddr page_base = (current & ~CITRA_PAGE_MASK); + const VAddr page_index = page_base >> CITRA_PAGE_BITS; + + auto it = page_table.watchpoint_pages_map.find(page_index); + if (it != page_table.watchpoint_pages_map.end()) { + if (--it->second.watchpoint_count == 0) { + + PageType& type = page_table.attributes[page_index]; + + switch (type) { + case PageType::MemoryWatchpoint: + type = PageType::Memory; + page_table.pointers[page_index] = it->second.memory; + break; + case PageType::RasterizerCachedMemoryWatchpoint: + type = PageType::RasterizerCachedMemory; + break; + default: + LOG_ERROR(HW_Memory, "Invalid watchpoint page type for page 0x{:08X}: {}", + page_base, static_cast(type)); + } + + page_table.watchpoint_pages_map.erase(page_index); + } + } else { + LOG_ERROR(HW_Memory, "No watchpoint found on page 0x{:08X}", page_base); + } + + current = page_base + CITRA_PAGE_SIZE; + } +} + void MemorySystem::MapPages(PageTable& page_table, u32 base, u32 size, MemoryRef memory, PageType type) { LOG_DEBUG(HW_Memory, "Mapping {} onto {:08X}-{:08X}", (void*)memory.GetPtr(), @@ -449,13 +564,37 @@ void MemorySystem::UnregisterPageTable(std::shared_ptr page_table) { } } +template +void MemorySystem::UnmappedAccess(const VAddr vaddr, const T value, bool read) { + const std::string mode = (read ? "Read" : "Write"); + const std::string value_str = read ? std::string("") : fmt::format(" 0x{:08X}", value); + const std::string message = fmt::format("unmapped {}{}{} @ 0x{:08X} at PC 0x{:08X}", mode, + sizeof(T) * 8, value_str, vaddr, impl->GetPC()); +#ifdef ENABLE_GDBSTUB + if (GDBStub::IsConnected()) { + GDBStub::Break(SIGSEGV); + } else +#endif + if (Settings::values.break_on_unmapped_memory_access) { + impl->system.SetStatus(Core::System::ResultStatus::ErrorMemoryExceptionRaised, + message.c_str()); + } + + LOG_ERROR(HW_Memory, "{}", message); +} + template T MemorySystem::Read(const std::shared_ptr& page_table, const VAddr vaddr) { + constexpr bool is_optional = is_optional_type; + using ReadType = optional_inner_or_type; + + constexpr size_t read_size = sizeof(ReadType); + const u8* page_pointer = page_table->pointers[vaddr >> CITRA_PAGE_BITS]; if (page_pointer) { // NOTE: Avoid adding any extra logic to this fast-path block - T value; - std::memcpy(&value, &page_pointer[vaddr & CITRA_PAGE_MASK], sizeof(T)); + ReadType value; + std::memcpy(&value, &page_pointer[vaddr & CITRA_PAGE_MASK], read_size); return value; } @@ -464,37 +603,77 @@ T MemorySystem::Read(const std::shared_ptr& page_table, const VAddr v if (vaddr & (1 << 31)) { PAddr paddr = (vaddr & ~(1 << 31)); if ((paddr & 0xF0000000) == Memory::FCRAM_PADDR) { // Check FCRAM region - T value; - std::memcpy(&value, GetFCRAMPointer(paddr - Memory::FCRAM_PADDR), sizeof(T)); + ReadType value; + std::memcpy(&value, GetFCRAMPointer(paddr - Memory::FCRAM_PADDR), read_size); return value; } else if ((paddr & 0xF0000000) == 0x10000000 && paddr >= Memory::IO_AREA_PADDR) { // Check MMIO region - return impl->system.GPU().ReadReg(static_cast(paddr) - Memory::IO_AREA_PADDR + - 0x1EC00000); + return static_cast(impl->system.GPU().ReadReg( + static_cast(paddr) - Memory::IO_AREA_PADDR + 0x1EC00000)); } } PageType type = page_table->attributes[vaddr >> CITRA_PAGE_BITS]; switch (type) { - case PageType::Unmapped: - LOG_ERROR(HW_Memory, "unmapped Read{} @ 0x{:08X} at PC 0x{:08X}", sizeof(T) * 8, vaddr, - impl->GetPC()); - return 0; + case PageType::Unmapped: { + + UnmappedAccess(vaddr, 0, true); + + if constexpr (is_optional) { + return std::nullopt; + } else { + return T{}; + } + } case PageType::Memory: ASSERT_MSG(false, "Mapped memory page without a pointer @ {:08X}", vaddr); break; - case PageType::RasterizerCachedMemory: { - RasterizerFlushVirtualRegion(vaddr, sizeof(T), FlushMode::Flush); + case PageType::MemoryWatchpoint: { + auto it = page_table->watchpoint_pages_map.find(vaddr >> CITRA_PAGE_BITS); + ASSERT_MSG(it != page_table->watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + ReadType value; + std::memcpy(&value, it->second.memory.GetPtr() + (vaddr & CITRA_PAGE_MASK), read_size); + +#ifdef ENABLE_GDBSTUB + if (GDBStub::CheckBreakpoint(vaddr, read_size, GDBStub::BreakpointType::Read)) { + GDBStub::Break(SIGTRAP); + } +#endif + + return value; + } + [[likely]] case PageType::RasterizerCachedMemory: { + RasterizerFlushVirtualRegion(vaddr, read_size, FlushMode::Flush); + + ReadType value; + std::memcpy(&value, GetPointerForRasterizerCache(vaddr), read_size); + return value; + } + case PageType::RasterizerCachedMemoryWatchpoint: { + RasterizerFlushVirtualRegion(vaddr, read_size, FlushMode::Flush); + + ReadType value; + std::memcpy(&value, GetPointerForRasterizerCache(vaddr), read_size); + +#ifdef ENABLE_GDBSTUB + if (GDBStub::CheckBreakpoint(vaddr, read_size, GDBStub::BreakpointType::Read)) { + GDBStub::Break(SIGTRAP); + } +#endif - T value; - std::memcpy(&value, GetPointerForRasterizerCache(vaddr), sizeof(T)); return value; } default: UNREACHABLE(); } - return T{}; + if constexpr (is_optional) { + return std::nullopt; + } else { + return T{}; + } } template @@ -527,17 +706,43 @@ void MemorySystem::Write(const std::shared_ptr& page_table, const VAd PageType type = page_table->attributes[vaddr >> CITRA_PAGE_BITS]; switch (type) { case PageType::Unmapped: - LOG_ERROR(HW_Memory, "unmapped Write{} 0x{:08X} @ 0x{:08X} at PC 0x{:08X}", - sizeof(data) * 8, (u32)data, vaddr, impl->GetPC()); + (void)UnmappedAccess(vaddr, data, false); return; case PageType::Memory: ASSERT_MSG(false, "Mapped memory page without a pointer @ {:08X}", vaddr); break; - case PageType::RasterizerCachedMemory: { + case PageType::MemoryWatchpoint: { + auto it = page_table->watchpoint_pages_map.find(vaddr >> CITRA_PAGE_BITS); + ASSERT_MSG(it != page_table->watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + std::memcpy(it->second.memory.GetPtr() + (vaddr & CITRA_PAGE_MASK), &data, sizeof(T)); + +#ifdef ENABLE_GDBSTUB + if (GDBStub::CheckBreakpoint(vaddr, sizeof(T), GDBStub::BreakpointType::Write)) { + GDBStub::Break(SIGTRAP); + } +#endif + + break; + } + [[likely]] case PageType::RasterizerCachedMemory: { RasterizerFlushVirtualRegion(vaddr, sizeof(T), FlushMode::Invalidate); std::memcpy(GetPointerForRasterizerCache(vaddr), &data, sizeof(T)); break; } + case PageType::RasterizerCachedMemoryWatchpoint: { + RasterizerFlushVirtualRegion(vaddr, sizeof(T), FlushMode::Invalidate); + std::memcpy(GetPointerForRasterizerCache(vaddr), &data, sizeof(T)); + +#ifdef ENABLE_GDBSTUB + if (GDBStub::CheckBreakpoint(vaddr, sizeof(T), GDBStub::BreakpointType::Write)) { + GDBStub::Break(SIGTRAP); + } +#endif + + break; + } default: UNREACHABLE(); } @@ -556,18 +761,48 @@ bool MemorySystem::WriteExclusive(const VAddr vaddr, const T data, const T expec PageType type = impl->current_page_table->attributes[vaddr >> CITRA_PAGE_BITS]; switch (type) { case PageType::Unmapped: - LOG_ERROR(HW_Memory, "unmapped Write{} 0x{:08X} @ 0x{:08X} at PC 0x{:08X}", - sizeof(data) * 8, static_cast(data), vaddr, impl->GetPC()); + (void)UnmappedAccess(vaddr, data, false); return true; case PageType::Memory: ASSERT_MSG(false, "Mapped memory page without a pointer @ {:08X}", vaddr); return true; - case PageType::RasterizerCachedMemory: { + case PageType::MemoryWatchpoint: { + auto it = impl->current_page_table->watchpoint_pages_map.find(vaddr >> CITRA_PAGE_BITS); + ASSERT_MSG(it != impl->current_page_table->watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + const auto volatile_pointer = + reinterpret_cast(it->second.memory.GetPtr() + (vaddr & CITRA_PAGE_MASK)); + + bool ret = Common::AtomicCompareAndSwap(volatile_pointer, data, expected); + +#ifdef ENABLE_GDBSTUB + if (GDBStub::CheckBreakpoint(vaddr, sizeof(T), GDBStub::BreakpointType::Write)) { + GDBStub::Break(SIGTRAP); + } +#endif + + return ret; + } + [[likely]] case PageType::RasterizerCachedMemory: { RasterizerFlushVirtualRegion(vaddr, sizeof(T), FlushMode::Invalidate); const auto volatile_pointer = reinterpret_cast(GetPointerForRasterizerCache(vaddr).GetPtr()); return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); } + case PageType::RasterizerCachedMemoryWatchpoint: { + RasterizerFlushVirtualRegion(vaddr, sizeof(T), FlushMode::Invalidate); + const auto volatile_pointer = + reinterpret_cast(GetPointerForRasterizerCache(vaddr).GetPtr()); + +#ifdef ENABLE_GDBSTUB + if (GDBStub::CheckBreakpoint(vaddr, sizeof(T), GDBStub::BreakpointType::Write)) { + GDBStub::Break(SIGTRAP); + } +#endif + + return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); + } default: UNREACHABLE(); } @@ -582,7 +817,7 @@ bool MemorySystem::IsValidVirtualAddress(const Kernel::Process& process, const V return true; } - if (page_table.attributes[vaddr >> CITRA_PAGE_BITS] == PageType::RasterizerCachedMemory) { + if (page_table.attributes[vaddr >> CITRA_PAGE_BITS] != PageType::Unmapped) { return true; } @@ -600,7 +835,9 @@ u8* MemorySystem::GetPointer(const VAddr vaddr) { } if (impl->current_page_table->attributes[vaddr >> CITRA_PAGE_BITS] == - PageType::RasterizerCachedMemory) { + PageType::RasterizerCachedMemory || + impl->current_page_table->attributes[vaddr >> CITRA_PAGE_BITS] == + PageType::RasterizerCachedMemoryWatchpoint) { return GetPointerForRasterizerCache(vaddr); } @@ -615,7 +852,9 @@ const u8* MemorySystem::GetPointer(const VAddr vaddr) const { } if (impl->current_page_table->attributes[vaddr >> CITRA_PAGE_BITS] == - PageType::RasterizerCachedMemory) { + PageType::RasterizerCachedMemory || + impl->current_page_table->attributes[vaddr >> CITRA_PAGE_BITS] == + PageType::RasterizerCachedMemoryWatchpoint) { return GetPointerForRasterizerCache(vaddr); } @@ -755,7 +994,10 @@ void MemorySystem::RasterizerMarkRegionCached(PAddr start, u32 size, bool cached // address space, for example, a system module need not have a VRAM mapping. break; case PageType::Memory: - page_type = PageType::RasterizerCachedMemory; + case PageType::MemoryWatchpoint: + page_type = (page_type == PageType::Memory) + ? PageType::RasterizerCachedMemory + : PageType::RasterizerCachedMemoryWatchpoint; page_table->pointers[vaddr >> CITRA_PAGE_BITS] = nullptr; break; default: @@ -768,10 +1010,16 @@ void MemorySystem::RasterizerMarkRegionCached(PAddr start, u32 size, bool cached // It is not necessary for a process to have this region mapped into its // address space, for example, a system module need not have a VRAM mapping. break; - case PageType::RasterizerCachedMemory: { - page_type = PageType::Memory; - page_table->pointers[vaddr >> CITRA_PAGE_BITS] = - GetPointerForRasterizerCache(vaddr & ~CITRA_PAGE_MASK); + case PageType::RasterizerCachedMemory: + case PageType::RasterizerCachedMemoryWatchpoint: { + page_type = (page_type == PageType::RasterizerCachedMemory) + ? PageType::Memory + : PageType::MemoryWatchpoint; + + if (page_type == PageType::Memory) { + page_table->pointers[vaddr >> CITRA_PAGE_BITS] = + GetPointerForRasterizerCache(vaddr & ~CITRA_PAGE_MASK); + } break; } default: @@ -815,6 +1063,14 @@ u64 MemorySystem::Read64(const Kernel::Process& process, VAddr addr) { return Read(process.vm_manager.page_table, addr); } +std::optional MemorySystem::Read32OrNullopt(VAddr addr) { + return Read>(impl->current_page_table, addr); +} + +std::optional MemorySystem::Read32OrNullopt(const Kernel::Process& process, VAddr addr) { + return Read>(process.vm_manager.page_table, addr); +} + void MemorySystem::ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer, const std::size_t size) { return impl->ReadBlockImpl(process, src_addr, dest_buffer, size); @@ -911,7 +1167,17 @@ void MemorySystem::ZeroBlock(const Kernel::Process& process, const VAddr dest_ad std::memset(dest_ptr, 0, copy_amount); break; } - case PageType::RasterizerCachedMemory: { + case PageType::MemoryWatchpoint: { + auto it = page_table.watchpoint_pages_map.find(page_index); + ASSERT_MSG(it != page_table.watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + u8* dest_ptr = it->second.memory.GetPtr() + page_offset; + std::memset(dest_ptr, 0, copy_amount); + break; + } + case PageType::RasterizerCachedMemory: + case PageType::RasterizerCachedMemoryWatchpoint: { RasterizerFlushVirtualRegion(current_vaddr, static_cast(copy_amount), FlushMode::Invalidate); std::memset(GetPointerForRasterizerCache(current_vaddr), 0, copy_amount); @@ -960,7 +1226,17 @@ void MemorySystem::CopyBlock(const Kernel::Process& dest_process, WriteBlock(dest_process, dest_addr, src_ptr, copy_amount); break; } - case PageType::RasterizerCachedMemory: { + case PageType::MemoryWatchpoint: { + auto it = page_table.watchpoint_pages_map.find(page_index); + ASSERT_MSG(it != page_table.watchpoint_pages_map.end(), + "Missing memory for watchpoint page"); + + const u8* src_ptr = it->second.memory.GetPtr() + page_offset; + WriteBlock(dest_process, dest_addr, src_ptr, copy_amount); + break; + } + case PageType::RasterizerCachedMemory: + case PageType::RasterizerCachedMemoryWatchpoint: { RasterizerFlushVirtualRegion(current_vaddr, static_cast(copy_amount), FlushMode::Flush); WriteBlock(dest_process, dest_addr, GetPointerForRasterizerCache(current_vaddr), diff --git a/src/core/memory.h b/src/core/memory.h index 5c215b3f2..d4f09fa9e 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -5,11 +5,13 @@ #pragma once #include #include +#include #include #include #include #include "common/common_types.h" #include "common/memory_ref.h" +#include "common/swap.h" namespace Kernel { class Process; @@ -34,7 +36,7 @@ constexpr u32 CITRA_PAGE_MASK = CITRA_PAGE_SIZE - 1; constexpr int CITRA_PAGE_BITS = 12; constexpr std::size_t PAGE_TABLE_NUM_ENTRIES = 1 << (32 - CITRA_PAGE_BITS); -enum class PageType { +enum class PageType : u8 { /// Page is unmapped and should cause an access error. Unmapped, /// Page is mapped to regular memory. This is the only type you can get pointers to. @@ -42,6 +44,12 @@ enum class PageType { /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and /// invalidation RasterizerCachedMemory, + /// Page is mapped to regular memory. Furthermore a debug watchpoint is set to an address within + /// the page. + MemoryWatchpoint, + /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and + /// invalidation. Furthermore a debug watchpoint is set to an address within the page. + RasterizerCachedMemoryWatchpoint, }; /** @@ -82,6 +90,10 @@ struct PageTable { return Entry(*this, static_cast(idx)); } + const MemoryRef& Ref(std::size_t idx) { + return refs[idx]; + } + private: std::array raw; std::array refs; @@ -100,6 +112,22 @@ struct PageTable { return pointers.raw; } + struct WatchpointPageInfo { + u32 watchpoint_count{}; + MemoryRef memory; + + template + void serialize(Archive& ar, const unsigned int) { + ar & watchpoint_count; + ar & memory; + } + }; + + // Map holding pages that are marked to contain watchpoints. We don't need + // any fancy performance tricks here, as watchpoints are only used rarely + // while debugging and performance is not a priority in such cases. + std::unordered_map watchpoint_pages_map{}; + void Clear(); private: @@ -107,6 +135,7 @@ private: void serialize(Archive& ar, const unsigned int) { ar & pointers.refs; ar & attributes; + ar & watchpoint_pages_map; for (std::size_t i = 0; i < PAGE_TABLE_NUM_ENTRIES; i++) { pointers.raw[i] = pointers.refs[i].GetPtr(); } @@ -360,6 +389,29 @@ public: */ u64 Read64(const Kernel::Process& process, VAddr addr); + /** + * Reads a 32-bit unsigned value from the current process' address space + * at the given virtual address. If the address is invalid std::nullopt + * is returned instead. + * + * @param addr The virtual address to read the 32-bit value from. + * + * @returns the read 32-bit unsigned value or std::nullopt. + */ + std::optional Read32OrNullopt(VAddr addr); + + /** + * Reads a 32-bit unsigned value from the process' address space + * at the given virtual address. If the address is invalid std::nullopt + * is returned instead. + * + * @param process The process to read from. + * @param addr The virtual address to read the 32-bit value from. + * + * @returns the read 32-bit unsigned value or std::nullopt. + */ + std::optional Read32OrNullopt(const Kernel::Process& process, VAddr addr); + /** * Writes an 8-bit unsigned integer to the given virtual address in * the current process' address space. @@ -649,7 +701,14 @@ public: /// Returns a reference to the framebuffer address of the currently loaded 3GX plugin. PAddr& Plugin3GXFramebufferAddress(); + void RegisterWatchpoint(const Kernel::Process& process, VAddr addr, u32 size); + + void UnregisterWatchpoint(const Kernel::Process& process, VAddr addr, u32 size); + private: + template + void UnmappedAccess(const VAddr vaddr, const T value, bool read); + template T Read(const std::shared_ptr& page_table, const VAddr vaddr); From 921ea178b9d37ffb2cc879a12d7d790689052bf9 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Thu, 7 May 2026 20:39:30 +0200 Subject: [PATCH 83/98] ui: Made rom loading errors more clear and user friendly (#2097) --- .../java/org/citra/citra_emu/NativeLibrary.kt | 75 ++++++++++++------ .../app/src/main/res/values/strings.xml | 14 +++- src/citra_qt/citra_qt.cpp | 78 +++++++++---------- src/core/core.cpp | 4 + src/core/core.h | 12 +-- src/core/file_sys/layered_fs.cpp | 6 +- src/core/file_sys/layered_fs.h | 2 +- src/core/file_sys/ncch_container.cpp | 9 ++- src/core/file_sys/patch.cpp | 30 +++---- src/core/file_sys/patch.h | 7 +- src/core/loader/loader.h | 2 + 11 files changed, 141 insertions(+), 98 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt index 1ef5c8d83..72035cae4 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt @@ -465,26 +465,51 @@ object NativeLibrary { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { emulationActivity = requireActivity() as EmulationActivity - val result = requireArguments().getInt(RESULT_CODE) - var captionString = getString(R.string.loader_error_invalid_format) - if (result == CoreError.ErrorLoader_ErrorEncrypted.value) { - captionString = getString(R.string.loader_error_encrypted) - } - if (result == CoreError.ErrorArticDisconnected.value) { - captionString = getString(R.string.artic_base) + var coreError = CoreError.fromInt(requireArguments().getInt(RESULT_CODE)) + val title: String + val message: String + when (coreError) { + CoreError.ErrorGetLoader, CoreError.ErrorLoader_ErrorInvalidFormat, CoreError.ErrorSystemMode -> { + title = getString(R.string.loader_error_invalid_format) + message = getString(R.string.loader_error_invalid_format_description) + } + + CoreError.ErrorLoader_ErrorEncrypted -> { + title = getString(R.string.loader_error_encrypted) + message = getString(R.string.loader_error_encrypted_description) + } + + CoreError.ErrorArticDisconnected -> { + title = getString(R.string.artic_base) + message = getString(R.string.artic_server_comm_error) + } + + CoreError.ErrorN3DSApplication -> { + title = getString(R.string.loader_error_invalid_system_mode) + message = getString(R.string.loader_error_invalid_system_mode_description) + } + + CoreError.ErrorLoader_ErrorPatches -> { + title = getString(R.string.loader_error_applying_patches) + message = getString(R.string.loader_error_applying_patches_description) + } + + CoreError.ErrorLoader_ErrorPatchesInvalidTitle -> { + title = getString(R.string.loader_error_applying_patches) + message = getString(R.string.loader_error_patch_wrong_application) + } + + else -> { + title = getString(R.string.loader_error_generic_title) + message = getString(R.string.loader_error_generic, + getString(coreError.stringRes), coreError.value) + } } val alert = MaterialAlertDialogBuilder(requireContext()) - .setTitle(captionString) + .setTitle(title) .setMessage( - Html.fromHtml( - if (result == CoreError.ErrorArticDisconnected.value) - getString(R.string.artic_server_comm_error) - else if (result == CoreError.ErrorLoader_ErrorEncrypted.value) - getString(R.string.loader_error_encrypted_desc) - else - getString(R.string.loader_error_generic, - getString(CoreError.fromInt(result).stringRes), result), + Html.fromHtml(message, Html.FROM_HTML_MODE_LEGACY ) ) @@ -861,14 +886,16 @@ object NativeLibrary { ErrorLoader_ErrorEncrypted(5, R.string.core_error_loader_encrypted), ErrorLoader_ErrorInvalidFormat(6, R.string.core_error_loader_invalid_format), ErrorLoader_ErrorGBATitle(7, R.string.core_error_loader_gba_title), - ErrorSystemFiles(8, R.string.core_error_system_files), - ErrorSavestate(9, R.string.core_error_savestate), - ErrorArticDisconnected(10, R.string.core_error_artic_disconnected), - ErrorN3DSApplication(11, R.string.core_error_n3ds_application), - ErrorCoreExceptionRaised(12, R.string.core_error_core_exception_raised), - ErrorMemoryExceptionRaised(13, R.string.core_error_memory_exception_raised), - ShutdownRequested(14, R.string.core_error_shutdown_requested), - ErrorUnknown(15, R.string.core_error_unknown); + ErrorLoader_ErrorPatches(8, R.string.core_error_loader_error_patches), + ErrorLoader_ErrorPatchesInvalidTitle(9, R.string.core_error_loader_patches_invalid_title), + ErrorSystemFiles(10, R.string.core_error_system_files), + ErrorSavestate(11, R.string.core_error_savestate), + ErrorArticDisconnected(12, R.string.core_error_artic_disconnected), + ErrorN3DSApplication(13, R.string.core_error_n3ds_application), + ErrorCoreExceptionRaised(14, R.string.core_error_core_exception_raised), + ErrorMemoryExceptionRaised(15, R.string.core_error_memory_exception_raised), + ShutdownRequested(16, R.string.core_error_shutdown_requested), + ErrorUnknown(17, R.string.core_error_unknown); companion object { fun fromInt(value: Int): CoreError { diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 72e7eecf7..101eb4648 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -435,11 +435,19 @@ Layout + Error loading application + Invalid application format + Please make sure you are using one of the compatible file formats:
  • Cartridge images: .cci/.zcci/.3ds
  • Installable archives: .cia/.zcia
  • Homebrew titles: .3dsx/.z3dsx
  • NCCH containers: .cxi/.zcxi/.app
  • ELF files: .elf/.axf
]]>
+ Invalid system mode + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + Error applying patches + A generic error occurred while applying a patch to the application. Please check the log for more details. + Failed to apply a patch because it is designed for a different application. Please make sure you are using the patches for the right application, region and version. Your ROM is Encrypted - blog post for more information.]]> - Invalid ROM format + blog post for more information.]]> ROM file does not exist No bootable game present! + An error occurred while loading ROM: \"%s (%d)\" Success Not initialized @@ -449,6 +457,8 @@ Encrypted file Corrupted file File is GBA title + Error applying patches + Patches are for a different application Missing system files Savestate failed Artic Base disconnected diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 180591c9f..bda6d0816 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -1366,61 +1366,39 @@ bool GMainWindow::LoadROM(const QString& filename) { system.Load(*render_window, filename.toStdString(), secondary_window)}; if (result != Core::System::ResultStatus::Success) { + QString invalid_format = tr("Invalid application format"); + QString invalid_format_description = + tr("The application file format not supported.
Please make sure you are using one " + "of the compatible file formats:
  • Cartridge images: " + ".cci/.zcci/.3ds
  • Installable archives: " + ".cia/.zcia
  • Homebrew titles: .3dsx/.z3dsx
  • NCCH " + "containers: .cxi/.zcxi/.app
  • ELF files: .elf/.axf
"); + switch (result) { case Core::System::ResultStatus::ErrorGetLoader: LOG_CRITICAL(Frontend, "Failed to obtain loader for {}", filename.toStdString()); - QMessageBox::critical( - this, tr("Invalid App Format"), - tr("Your app format is not supported.
Please follow the guides to redump your " - "game " - "cartridges or " - "installed " - "titles.")); + QMessageBox::critical(this, invalid_format, invalid_format_description); break; case Core::System::ResultStatus::ErrorSystemMode: - LOG_CRITICAL(Frontend, "Failed to load App!"); - QMessageBox::critical( - this, tr("App Corrupted"), - tr("Your app is corrupted.
Please follow the guides to redump your " - "game " - "cartridges or " - "installed " - "titles.")); + LOG_CRITICAL(Frontend, "Failed to load application!"); + QMessageBox::critical(this, invalid_format, invalid_format_description); break; case Core::System::ResultStatus::ErrorLoader_ErrorEncrypted: { - QMessageBox::critical(this, tr("App Encrypted"), - tr("Your app is encrypted.
" + QMessageBox::critical(this, tr("Encrypted application"), + tr("Encrypted applications are not supported.
" "" "Please check our blog for more info.")); break; } case Core::System::ResultStatus::ErrorLoader_ErrorInvalidFormat: - QMessageBox::critical( - this, tr("Invalid App Format"), - tr("Your app format is not supported.
Please follow the guides to redump your " - "game " - "cartridges or " - "installed " - "titles.")); + QMessageBox::critical(this, invalid_format, invalid_format_description); break; case Core::System::ResultStatus::ErrorLoader_ErrorGbaTitle: - QMessageBox::critical(this, tr("Unsupported App"), + QMessageBox::critical(this, tr("Unsupported application"), tr("GBA Virtual Console is not supported by Azahar.")); break; @@ -1437,10 +1415,27 @@ bool GMainWindow::LoadROM(const QString& filename) { tr("New 3DS exclusive applications cannot be loaded without " "enabling the New 3DS mode.")); break; + case Core::System::ResultStatus::ErrorLoader: + QMessageBox::critical(this, tr("Generic load error"), + tr("An generic load error occurred while loading the " + "application.
Please check the log for more details.")); + break; + case Core::System::ResultStatus::ErrorLoader_ErrorPatches: + QMessageBox::critical(this, tr("Error applying patches"), + tr("A generic error occurred while applying a patch to the " + "application.
Please check the log for more details.")); + break; + case Core::System::ResultStatus::ErrorLoader_ErrorPatchesInvalidTitle: + QMessageBox::critical( + this, tr("Error applying patches"), + tr("Failed to apply a patch because it is designed for a different " + "application.
Please make sure you are using the patches for " + "the right application, region and version.")); + break; default: QMessageBox::critical( - this, tr("Error while loading App!"), - tr("An unknown error occurred. Please see the log for more details.")); + this, tr("Error while loading application"), + tr("An unknown error occurred.
Please see the log for more details.")); break; } return false; @@ -1499,7 +1494,8 @@ void GMainWindow::BootGame(const QString& filename) { auto loader = Loader::GetLoader(path); u64 title_id{0}; - Loader::ResultStatus res = loader->ReadProgramId(title_id); + Loader::ResultStatus res = + loader ? loader->ReadProgramId(title_id) : Loader::ResultStatus::Error; if (Loader::ResultStatus::Success == res) { // Load per game settings @@ -1512,7 +1508,7 @@ void GMainWindow::BootGame(const QString& filename) { // Artic Server cannot accept a client multiple times, so multiple loaders are not // possible. Instead register the app loader early and do not create it again on system load. - if (!loader->SupportsMultipleInstancesForSameFile()) { + if (loader && !loader->SupportsMultipleInstancesForSameFile()) { system.RegisterAppLoaderEarly(loader); } diff --git a/src/core/core.cpp b/src/core/core.cpp index 28af9f4f0..f9dfe1534 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -434,6 +434,10 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st return ResultStatus::ErrorLoader_ErrorInvalidFormat; case Loader::ResultStatus::ErrorGbaTitle: return ResultStatus::ErrorLoader_ErrorGbaTitle; + case Loader::ResultStatus::ErrorPatches: + return ResultStatus::ErrorLoader_ErrorPatches; + case Loader::ResultStatus::ErrorPatchesInvalidTitle: + return ResultStatus::ErrorLoader_ErrorPatchesInvalidTitle; case Loader::ResultStatus::ErrorArtic: return ResultStatus::ErrorArticDisconnected; default: diff --git a/src/core/core.h b/src/core/core.h index 971bd7b32..c46a196b2 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -99,11 +99,13 @@ public: /// invalid format ErrorLoader_ErrorGbaTitle, ///< Error loading the specified application as it is GBA Virtual ///< Console - ErrorSystemFiles, ///< Error in finding system files - ErrorSavestate, ///< Error saving or loading - ErrorArticDisconnected, ///< Error when artic base disconnects - ErrorN3DSApplication, ///< Error launching New 3DS application in Old 3DS mode - ErrorCoreExceptionRaised, ///< The CPU emulation raised an exception + ErrorLoader_ErrorPatches, ///< Generic error while loading patches for an application + ErrorLoader_ErrorPatchesInvalidTitle, ///< A patch was loaded for the incorrect application + ErrorSystemFiles, ///< Error in finding system files + ErrorSavestate, ///< Error saving or loading + ErrorArticDisconnected, ///< Error when artic base disconnects + ErrorN3DSApplication, ///< Error launching New 3DS application in Old 3DS mode + ErrorCoreExceptionRaised, ///< The CPU emulation raised an exception ErrorMemoryExceptionRaised, ///< Unmmaped memory was accessed ShutdownRequested, ///< Emulated program requested a system shutdown ErrorUnknown ///< Any other error diff --git a/src/core/file_sys/layered_fs.cpp b/src/core/file_sys/layered_fs.cpp index 1cac97be4..93ce3e854 100644 --- a/src/core/file_sys/layered_fs.cpp +++ b/src/core/file_sys/layered_fs.cpp @@ -1,4 +1,4 @@ -// Copyright 2020 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -247,14 +247,14 @@ void LayeredFS::LoadExtRelocations() { std::vector buffer(file.relocation.size); // Original size romfs->ReadFile(file.relocation.original_offset, buffer.size(), buffer.data()); - bool ret = false; + Loader::ResultStatus ret{}; if (extension == ".ips") { ret = Patch::ApplyIpsPatch(patch, buffer); } else { ret = Patch::ApplyBpsPatch(patch, buffer); } - if (ret) { + if (ret == Loader::ResultStatus::Success) { LOG_INFO(Service_FS, "LayeredFS patched file {}", file_path); file.relocation.type = 2; diff --git a/src/core/file_sys/layered_fs.h b/src/core/file_sys/layered_fs.h index 69f6e5939..e51bd8f1c 100644 --- a/src/core/file_sys/layered_fs.h +++ b/src/core/file_sys/layered_fs.h @@ -1,4 +1,4 @@ -// Copyright 2020 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. diff --git a/src/core/file_sys/ncch_container.cpp b/src/core/file_sys/ncch_container.cpp index 382c8943e..c51de40a9 100644 --- a/src/core/file_sys/ncch_container.cpp +++ b/src/core/file_sys/ncch_container.cpp @@ -518,7 +518,7 @@ Loader::ResultStatus NCCHContainer::LoadSectionExeFS(const char* name, std::vect Loader::ResultStatus NCCHContainer::ApplyCodePatch(std::vector& code) const { struct PatchLocation { std::string path; - bool (*patch_fn)(const std::vector& patch, std::vector& code); + Loader::ResultStatus (*patch_fn)(const std::vector& patch, std::vector& code); }; const auto mods_path = @@ -555,11 +555,12 @@ Loader::ResultStatus NCCHContainer::ApplyCodePatch(std::vector& code) const std::vector patch(patch_file.GetSize()); if (patch_file.ReadBytes(patch.data(), patch.size()) != patch.size()) - return Loader::ResultStatus::Error; + return Loader::ResultStatus::ErrorPatches; LOG_INFO(Service_FS, "File {} patching code.bin", info.path); - if (!info.patch_fn(patch, code)) - return Loader::ResultStatus::Error; + auto patch_result = info.patch_fn(patch, code); + if (patch_result != Loader::ResultStatus::Success) + return patch_result; return Loader::ResultStatus::Success; } diff --git a/src/core/file_sys/patch.cpp b/src/core/file_sys/patch.cpp index fecc7fe05..83d3989eb 100644 --- a/src/core/file_sys/patch.cpp +++ b/src/core/file_sys/patch.cpp @@ -1,4 +1,4 @@ -// Copyright 2019 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -14,21 +14,21 @@ namespace FileSys::Patch { -bool ApplyIpsPatch(const std::vector& ips, std::vector& buffer) { +Loader::ResultStatus ApplyIpsPatch(const std::vector& ips, std::vector& buffer) { std::size_t cursor = 5; std::size_t patch_length = ips.size() - 3; std::string ips_header(ips.begin(), ips.begin() + 5); if (ips_header != "PATCH") { LOG_INFO(Service_FS, "Attempted to load invalid IPS"); - return false; + return Loader::ResultStatus::ErrorPatches; } while (cursor < patch_length) { std::string eof_check(ips.begin() + cursor, ips.begin() + cursor + 3); if (eof_check == "EOF") - return false; + break; std::size_t offset = ips[cursor] << 16 | ips[cursor + 1] << 8 | ips[cursor + 2]; std::size_t length = ips[cursor + 3] << 8 | ips[cursor + 4]; @@ -38,7 +38,7 @@ bool ApplyIpsPatch(const std::vector& ips, std::vector& buffer) { length = ips[cursor + 5] << 8 | ips[cursor + 6]; if (buffer.size() < offset + length) - return false; + return Loader::ResultStatus::ErrorPatches; for (u32 i = 0; i < length; ++i) buffer[offset + i] = ips[cursor + 7]; @@ -49,12 +49,12 @@ bool ApplyIpsPatch(const std::vector& ips, std::vector& buffer) { } if (buffer.size() < offset + length) - return false; + return Loader::ResultStatus::ErrorPatches; std::memcpy(&buffer[offset], &ips[cursor + 5], length); cursor += length + 5; } - return true; + return Loader::ResultStatus::Success; } namespace Bps { @@ -149,11 +149,11 @@ public: PatchApplier(Stream source, Stream target, Stream patch) : m_source{source}, m_target{target}, m_patch{patch} {} - bool Apply() { + Loader::ResultStatus Apply() { const auto magic = *m_patch.Read>(); if (std::string_view(magic.data(), magic.size()) != "BPS1") { LOG_ERROR(Service_FS, "Invalid BPS magic"); - return false; + return Loader::ResultStatus::ErrorPatches; } const Bps::Number source_size = m_patch.ReadNumber(); @@ -161,7 +161,7 @@ public: const Bps::Number metadata_size = m_patch.ReadNumber(); if (source_size > m_source.size() || target_size > m_target.size() || metadata_size != 0) { LOG_ERROR(Service_FS, "Invalid sizes"); - return false; + return Loader::ResultStatus::ErrorPatches; } const std::size_t command_start_offset = m_patch.Tell(); @@ -173,22 +173,22 @@ public: if (crc32(m_source.data(), source_size) != source_crc32) { LOG_ERROR(Service_FS, "Unexpected source hash"); - return false; + return Loader::ResultStatus::ErrorPatchesInvalidTitle; } // Process all patch commands. std::memset(m_target.data(), 0, m_target.size()); while (m_patch.Tell() < command_end_offset) { if (!HandleCommand()) - return false; + return Loader::ResultStatus::ErrorPatches; } if (crc32(m_target.data(), target_size) != target_crc32) { LOG_ERROR(Service_FS, "Unexpected target hash"); - return false; + return Loader::ResultStatus::ErrorPatches; } - return true; + return Loader::ResultStatus::Success; } private: @@ -257,7 +257,7 @@ private: } // namespace Bps -bool ApplyBpsPatch(const std::vector& patch, std::vector& buffer) { +Loader::ResultStatus ApplyBpsPatch(const std::vector& patch, std::vector& buffer) { Bps::Stream patch_stream{patch.data(), patch.size()}; // Move the offset past the file format marker (i.e. "BPS1") diff --git a/src/core/file_sys/patch.h b/src/core/file_sys/patch.h index 9a8118475..6f8993384 100644 --- a/src/core/file_sys/patch.h +++ b/src/core/file_sys/patch.h @@ -1,4 +1,4 @@ -// Copyright 2019 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -7,11 +7,12 @@ #include #include "common/common_types.h" +#include "core/loader/loader.h" namespace FileSys::Patch { -bool ApplyIpsPatch(const std::vector& patch, std::vector& buffer); +Loader::ResultStatus ApplyIpsPatch(const std::vector& patch, std::vector& buffer); -bool ApplyBpsPatch(const std::vector& patch, std::vector& buffer); +Loader::ResultStatus ApplyBpsPatch(const std::vector& patch, std::vector& buffer); } // namespace FileSys::Patch diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 9e4c76122..678b48bf7 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -76,6 +76,8 @@ enum class ResultStatus { ErrorGbaTitle, ErrorArtic, ErrorNotFound, + ErrorPatches, + ErrorPatchesInvalidTitle, }; constexpr u32 MakeMagic(char a, char b, char c, char d) { From 260f08c4971483a12529d4171fa41448dbacdeb9 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Fri, 8 May 2026 11:35:47 +0200 Subject: [PATCH 84/98] core: Add async filesystem operations (#2098) --- CMakeModules/GenerateSettingKeys.cmake | 1 + .../features/settings/SettingKeys.kt | 1 + .../features/settings/model/BooleanSetting.kt | 2 + .../settings/ui/SettingsFragmentPresenter.kt | 9 ++ src/android/app/src/main/jni/config.cpp | 1 + src/android/app/src/main/jni/default_ini.h | 4 + .../app/src/main/res/values/strings.xml | 2 + src/citra_qt/configuration/config.cpp | 2 + .../configuration/configure_storage.cpp | 2 + .../configuration/configure_storage.ui | 12 ++- src/common/settings.h | 1 + src/core/hle/kernel/hle_ipc.h | 50 ++++++++++ src/core/hle/service/fs/directory.cpp | 57 ++++++++--- src/core/hle/service/fs/file.cpp | 19 ++-- src/core/hle/service/fs/fs_user.cpp | 98 ++++++++++++------- src/core/hle/service/fs/fs_user.h | 5 + 16 files changed, 206 insertions(+), 60 deletions(-) diff --git a/CMakeModules/GenerateSettingKeys.cmake b/CMakeModules/GenerateSettingKeys.cmake index 96a131f72..38397a63b 100644 --- a/CMakeModules/GenerateSettingKeys.cmake +++ b/CMakeModules/GenerateSettingKeys.cmake @@ -17,6 +17,7 @@ foreach(KEY IN ITEMS "use_virtual_sd" "use_custom_storage" "compress_cia_installs" + "async_fs_operations" "region_value" "init_clock" "init_time" diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt index de2ab1118..f37e3636c 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt @@ -18,6 +18,7 @@ object SettingKeys { external fun enable_required_online_lle_modules(): String external fun use_virtual_sd(): String external fun compress_cia_installs(): String + external fun async_fs_operations(): String external fun region_value(): String external fun init_clock(): String external fun init_time(): String diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index cfa4aa946..9fcba652f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -54,6 +54,7 @@ enum class BooleanSetting( USE_ARTIC_BASE_CONTROLLER(SettingKeys.use_artic_base_controller(), Settings.SECTION_CONTROLS, false), UPRIGHT_SCREEN(SettingKeys.upright_screen(), Settings.SECTION_LAYOUT, false), COMPRESS_INSTALLED_CIA_CONTENT(SettingKeys.compress_cia_installs(), Settings.SECTION_STORAGE, false), + ASYNC_FS_OPERATIONS(SettingKeys.async_fs_operations(), Settings.SECTION_STORAGE, true), ANDROID_HIDE_IMAGES(SettingKeys.android_hide_images(), Settings.SECTION_MISC, false), APPLY_REGION_FREE_PATCH(SettingKeys.apply_region_free_patch(), Settings.SECTION_SYSTEM, true), USE_INTEGER_SCALING(SettingKeys.use_integer_scaling(), Settings.SECTION_RENDERER, false), @@ -92,6 +93,7 @@ enum class BooleanSetting( SHADERS_ACCURATE_MUL, USE_ARTIC_BASE_CONTROLLER, COMPRESS_INSTALLED_CIA_CONTENT, + ASYNC_FS_OPERATIONS, ANDROID_HIDE_IMAGES, PERF_OVERLAY_ENABLE, // Works in overlay options, but not from the settings menu APPLY_REGION_FREE_PATCH diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 3c12a5a8f..282caad3b 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -599,6 +599,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) BooleanSetting.COMPRESS_INSTALLED_CIA_CONTENT.defaultValue ) ) + add( + SwitchSetting( + BooleanSetting.ASYNC_FS_OPERATIONS, + R.string.async_fs_operations, + R.string.async_fs_operations_description, + BooleanSetting.ASYNC_FS_OPERATIONS.key, + BooleanSetting.ASYNC_FS_OPERATIONS.defaultValue + ) + ) } } diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index 8ac729fce..08f63ad77 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -232,6 +232,7 @@ void Config::ReadValues() { // Storage ReadSetting("Storage", Settings::values.compress_cia_installs); + ReadSetting("Storage", Settings::values.async_fs_operations); // Utility ReadSetting("Utility", Settings::values.dump_textures); diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index bfe406d77..444120e8e 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -278,6 +278,10 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"( # 0 (default): Do not compress, 1: Compress )") DECLARE_KEY(compress_cia_installs) BOOST_HANA_STRING(R"( +# Whether to enable async filesystem operations +# 0: Disabled, 1 (default): Enabled +)") DECLARE_KEY(async_fs_operations) BOOST_HANA_STRING(R"( + # Position of the performance overlay # 0: Top Left # 1: Center Top diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 101eb4648..0a26d32fa 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -233,6 +233,8 @@ Storage Compress installed CIA content Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled. + Asynchronous filesystem operations + Makes emulated filesystem accesses asynchronous. Greatly reduces filesystem related stutter, but may slightly increase load times. Inner Camera diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 30d54a93f..ff0a63c1a 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -486,6 +486,7 @@ void QtConfig::ReadDataStorageValues() { ReadBasicSetting(Settings::values.use_virtual_sd); ReadBasicSetting(Settings::values.use_custom_storage); ReadBasicSetting(Settings::values.compress_cia_installs); + ReadBasicSetting(Settings::values.async_fs_operations); const std::string nand_dir = ReadSetting(Settings::QKeys::nand_directory, QStringLiteral("")).toString().toStdString(); @@ -1079,6 +1080,7 @@ void QtConfig::SaveDataStorageValues() { WriteBasicSetting(Settings::values.use_virtual_sd); WriteBasicSetting(Settings::values.use_custom_storage); WriteBasicSetting(Settings::values.compress_cia_installs); + WriteBasicSetting(Settings::values.async_fs_operations); WriteSetting(Settings::QKeys::nand_directory, QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)), QStringLiteral("")); diff --git a/src/citra_qt/configuration/configure_storage.cpp b/src/citra_qt/configuration/configure_storage.cpp index a8cabd987..aa468d4c1 100644 --- a/src/citra_qt/configuration/configure_storage.cpp +++ b/src/citra_qt/configuration/configure_storage.cpp @@ -78,6 +78,7 @@ void ConfigureStorage::SetConfiguration() { ui->toggle_virtual_sd->setChecked(Settings::values.use_virtual_sd.GetValue()); ui->toggle_custom_storage->setChecked(Settings::values.use_custom_storage.GetValue()); ui->toggle_compress_cia->setChecked(Settings::values.compress_cia_installs.GetValue()); + ui->async_fs_operations->setChecked(Settings::values.async_fs_operations.GetValue()); ui->storage_group->setEnabled(!is_powered_on); } @@ -86,6 +87,7 @@ void ConfigureStorage::ApplyConfiguration() { Settings::values.use_virtual_sd = ui->toggle_virtual_sd->isChecked(); Settings::values.use_custom_storage = ui->toggle_custom_storage->isChecked(); Settings::values.compress_cia_installs = ui->toggle_compress_cia->isChecked(); + Settings::values.async_fs_operations = ui->async_fs_operations->isChecked(); if (!Settings::values.use_custom_storage) { FileUtil::UpdateUserPath(FileUtil::UserPath::NANDDir, diff --git a/src/citra_qt/configuration/configure_storage.ui b/src/citra_qt/configuration/configure_storage.ui index 5cfd0c449..6e8909a3a 100644 --- a/src/citra_qt/configuration/configure_storage.ui +++ b/src/citra_qt/configuration/configure_storage.ui @@ -180,7 +180,7 @@ - + @@ -191,6 +191,16 @@ + + + + Asynchronous filesystem operations + + + <html><head/><body><p>Makes emulated filesystem accesses asynchronous. Greatly reduces filesystem related stutter, but may slightly increase load times.</p></body></html> + + + diff --git a/src/common/settings.h b/src/common/settings.h index c5c924201..6bddf2ee5 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -484,6 +484,7 @@ struct Values { Setting use_virtual_sd{true, Keys::use_virtual_sd}; Setting use_custom_storage{false, Keys::use_custom_storage}; Setting compress_cia_installs{false, Keys::compress_cia_installs}; + Setting async_fs_operations{true, Keys::async_fs_operations}; // System SwitchableSetting region_value{REGION_VALUE_AUTO_SELECT, Keys::region_value}; diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 1b3b8c93e..bdd7877fc 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h @@ -17,6 +17,7 @@ #include "common/serialization/boost_small_vector.hpp" #include "common/settings.h" #include "common/swap.h" +#include "common/thread_worker.h" #include "core/hle/ipc.h" #include "core/hle/kernel/object.h" #include "core/hle/kernel/server_session.h" @@ -327,6 +328,55 @@ public: } } + /** + * Same as RunAsync, but runs the async operation on a specific thread worker provided by the + * caller. + * @param worker The thread worker where the operation will be run. + * @param async_section Callable that takes Kernel::HLERequestContext& as argument + * and returns the amount of nanoseconds to wait before calling result_function. + * This callable is ran asynchronously. + * @param result_function Callable that takes Kernel::HLERequestContext& as argument + * and doesn't return anything. This callable is ran from the emulator thread + * and can be used to set the IPC result. + * @param really_async If set to false, it will call both async_section and result_function + * from the emulator thread. + */ + template + void RunOnThreadWorker(Common::ThreadWorker& worker, AsyncFunctor async_section, + ResultFunctor result_function, bool really_async = true) { + + if (!Settings::values.deterministic_async_operations && really_async) { + kernel.ReportAsyncState(true); + + // We use packaged_task so we can retrieve a std::future to pass to AsyncWakeUpCallback + auto task = std::make_shared>([this, async_section] { + s64 sleep_for = async_section(*this); + this->thread->WakeAfterDelay(sleep_for, true); + }); + + auto future = task->get_future(); + + worker.QueueWork([task]() { (*task)(); }); + + this->SleepClientThread("RunOnThread", std::chrono::nanoseconds(-1), + std::make_shared>( + kernel, result_function, std::move(future))); + + } else { + // Synchronous fallback (same logic as original) + s64 sleep_for = async_section(*this); + if (sleep_for > 0) { + kernel.ReportAsyncState(true); + auto parallel_wakeup = std::make_shared>( + kernel, result_function, std::move(std::future())); + this->SleepClientThread("RunOnThread", std::chrono::nanoseconds(sleep_for), + parallel_wakeup); + } else { + result_function(*this); + } + } + } + /** * Resolves a object id from the request command buffer into a pointer to an object. See the * "HLE handle protocol" section in the class documentation for more details. diff --git a/src/core/hle/service/fs/directory.cpp b/src/core/hle/service/fs/directory.cpp index 0a862f097..13f011b5c 100644 --- a/src/core/hle/service/fs/directory.cpp +++ b/src/core/hle/service/fs/directory.cpp @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -42,27 +42,54 @@ Directory::~Directory() {} void Directory::Read(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); - u32 count = rp.Pop(); - auto& buffer = rp.PopMappedBuffer(); - std::vector entries(count); - LOG_TRACE(Service_FS, "Read {}: count={}", GetName(), count); - // Number of entries actually read - u32 read = backend->Read(static_cast(entries.size()), entries.data()); - buffer.Write(entries.data(), 0, read * sizeof(FileSys::Entry)); - IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); - rb.Push(ResultSuccess); - rb.Push(read); - rb.PushMappedBuffer(buffer); + struct AsyncData { + // Input + u32 count; + + // Output + Result ret{0}; + u32 read; + Kernel::MappedBuffer* buffer; + }; + + auto async_data = std::make_shared(); + async_data->count = rp.Pop(); + async_data->buffer = &rp.PopMappedBuffer(); + + ctx.RunAsync( + [this, async_data](Kernel::HLERequestContext& ctx) { + std::vector entries(async_data->count); + LOG_TRACE(Service_FS, "Read {}: count={}", GetName(), count); + // Number of entries actually read + async_data->read = backend->Read(static_cast(entries.size()), entries.data()); + async_data->buffer->Write(entries.data(), 0, async_data->read * sizeof(FileSys::Entry)); + return 0; + }, + [async_data](Kernel::HLERequestContext& ctx) { + IPC::RequestBuilder rb(ctx, 2, 2); + + rb.Push(ResultSuccess); + rb.Push(async_data->read); + rb.PushMappedBuffer(*async_data->buffer); + }, + Settings::values.async_fs_operations.GetValue()); } void Directory::Close(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); LOG_TRACE(Service_FS, "Close {}", GetName()); - backend->Close(); - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(ResultSuccess); + ctx.RunAsync( + [this](Kernel::HLERequestContext& ctx) { + backend->Close(); + return 0; + }, + [](Kernel::HLERequestContext& ctx) { + IPC::RequestBuilder rb(ctx, 1, 0); + rb.Push(ResultSuccess); + }, + Settings::values.async_fs_operations.GetValue()); } } // namespace Service::FS diff --git a/src/core/hle/service/fs/file.cpp b/src/core/hle/service/fs/file.cpp index 7ba13f935..6ba8f2b77 100644 --- a/src/core/hle/service/fs/file.cpp +++ b/src/core/hle/service/fs/file.cpp @@ -75,8 +75,13 @@ void File::Read(Kernel::HLERequestContext& ctx) { offset, length, backend->GetSize()); } + const bool allows_cache_reads = backend->AllowsCachedReads(); + // Conventional reading if the backend does not support cache. - if (!backend->AllowsCachedReads()) { + // Do not use asynchronous operations on file reads, as in most cases + // there are many of them with small sizes. This causes a lot of delay + // due to thread communication overhead. + if (!allows_cache_reads) { auto& buffer = rp.PopMappedBuffer(); IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); std::unique_ptr data = std::make_unique_for_overwrite(length); @@ -115,7 +120,8 @@ void File::Read(Kernel::HLERequestContext& ctx) { async_data->length = length; async_data->offset = offset; async_data->cache_ready = backend->CacheReady(offset, length); - if (!async_data->cache_ready) { + const bool really_async = !async_data->cache_ready; + if (really_async) { async_data->pre_timer = std::chrono::steady_clock::now(); } @@ -161,7 +167,7 @@ void File::Read(Kernel::HLERequestContext& ctx) { } rb.PushMappedBuffer(*async_data->buffer); }, - !async_data->cache_ready); + really_async); } void File::Write(Kernel::HLERequestContext& ctx) { @@ -186,6 +192,7 @@ void File::Write(Kernel::HLERequestContext& ctx) { } bool flush = (flags & 0xFF) != 0, update_timestamp = (flags & 0xFF00) != 0; + // Do not use asynchronous fs operations here for the same reason as File::Read. if (!backend->AllowsCachedReads()) { std::vector data(length); buffer.Read(data.data(), 0, data.size()); @@ -274,7 +281,7 @@ void File::SetSize(Kernel::HLERequestContext& ctx) { return; } - if (!backend->AllowsCachedReads()) { + if (!backend->AllowsCachedReads() && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); file->size = size; backend->SetSize(size); @@ -303,7 +310,7 @@ void File::Close(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_FS, "Closing File backend but {} clients still connected", connected_sessions.size()); - if (!backend->AllowsCachedReads()) { + if (!backend->AllowsCachedReads() && !Settings::values.async_fs_operations) { backend->Close(); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(ResultSuccess); @@ -334,7 +341,7 @@ void File::Flush(Kernel::HLERequestContext& ctx) { return; } - if (!backend->AllowsCachedReads()) { + if (!backend->AllowsCachedReads() && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); backend->Flush(); rb.Push(ResultSuccess); diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp index c9641a518..fdbdfbc58 100644 --- a/src/core/hle/service/fs/fs_user.cpp +++ b/src/core/hle/service/fs/fs_user.cpp @@ -67,7 +67,7 @@ void FS_USER::OpenFile(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "path={}, mode={} attrs={}", file_path.DebugStr(), mode.hex, attributes); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { const auto [file_res, open_timeout_ns] = archives.OpenFileFromArchive(archive_handle, file_path, mode, attributes); IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); @@ -100,7 +100,8 @@ void FS_USER::OpenFile(Kernel::HLERequestContext& ctx) { async_data->attributes = attributes; async_data->pre_timer = std::chrono::steady_clock::now(); - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->file = archives.OpenFileFromArchive(async_data->archive_handle, async_data->file_path, @@ -151,7 +152,7 @@ void FS_USER::OpenFileDirectly(Kernel::HLERequestContext& ctx) { u64 program_id = GetSessionData(ctx.Session())->program_id; - if (!archives.ArchiveIsSlow(archive_id)) { + if (!archives.ArchiveIsSlow(archive_id) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); ResultVal archive_handle = @@ -203,7 +204,8 @@ void FS_USER::OpenFileDirectly(Kernel::HLERequestContext& ctx) { async_data->attributes = attributes; async_data->pre_timer = std::chrono::steady_clock::now(); - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->archive_handle = archives.OpenArchive( async_data->archive_id, async_data->archive_path, async_data->program_id); @@ -259,7 +261,7 @@ void FS_USER::DeleteFile(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "type={} size={} data={}", filename_type, filename_size, file_path.DebugStr()); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.DeleteFileFromArchive(archive_handle, file_path)); return; @@ -275,7 +277,8 @@ void FS_USER::DeleteFile(Kernel::HLERequestContext& ctx) { async_data->archive_handle = archive_handle; async_data->file_path = file_path; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.DeleteFileFromArchive(async_data->archive_handle, async_data->file_path); @@ -312,7 +315,7 @@ void FS_USER::RenameFile(Kernel::HLERequestContext& ctx) { dest_filename_size, dest_file_path.DebugStr()); if (!archives.ArchiveIsSlow(src_archive_handle) && - !archives.ArchiveIsSlow(dest_archive_handle)) { + !archives.ArchiveIsSlow(dest_archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.RenameFileBetweenArchives(src_archive_handle, src_file_path, dest_archive_handle, dest_file_path)); @@ -333,7 +336,8 @@ void FS_USER::RenameFile(Kernel::HLERequestContext& ctx) { async_data->dest_archive_handle = dest_archive_handle; async_data->dest_file_path = dest_file_path; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.RenameFileBetweenArchives( async_data->src_archive_handle, async_data->src_file_path, @@ -362,7 +366,7 @@ void FS_USER::DeleteDirectory(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "type={} size={} data={}", dirname_type, dirname_size, dir_path.DebugStr()); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.DeleteDirectoryFromArchive(archive_handle, dir_path)); return; @@ -378,7 +382,8 @@ void FS_USER::DeleteDirectory(Kernel::HLERequestContext& ctx) { async_data->archive_handle = archive_handle; async_data->dir_path = dir_path; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.DeleteDirectoryFromArchive(async_data->archive_handle, async_data->dir_path); @@ -406,7 +411,7 @@ void FS_USER::DeleteDirectoryRecursively(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "type={} size={} data={}", dirname_type, dirname_size, dir_path.DebugStr()); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.DeleteDirectoryRecursivelyFromArchive(archive_handle, dir_path)); return; @@ -422,7 +427,8 @@ void FS_USER::DeleteDirectoryRecursively(Kernel::HLERequestContext& ctx) { async_data->archive_handle = archive_handle; async_data->dir_path = dir_path; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.DeleteDirectoryRecursivelyFromArchive( async_data->archive_handle, async_data->dir_path); @@ -452,7 +458,7 @@ void FS_USER::CreateFile(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "type={} attributes={} size={:x} data={}", filename_type, attributes, file_size, file_path.DebugStr()); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.CreateFileInArchive(archive_handle, file_path, file_size, attributes)); return; @@ -472,7 +478,8 @@ void FS_USER::CreateFile(Kernel::HLERequestContext& ctx) { async_data->file_size = file_size; async_data->attributes = attributes; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.CreateFileInArchive(async_data->archive_handle, async_data->file_path, @@ -500,7 +507,7 @@ void FS_USER::CreateDirectory(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "type={} size={} data={}", dirname_type, dirname_size, dir_path.DebugStr()); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.CreateDirectoryFromArchive(archive_handle, dir_path, attributes)); return; @@ -518,7 +525,8 @@ void FS_USER::CreateDirectory(Kernel::HLERequestContext& ctx) { async_data->dir_path = dir_path; async_data->attributes = attributes; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.CreateDirectoryFromArchive( async_data->archive_handle, async_data->dir_path, async_data->attributes); @@ -554,7 +562,7 @@ void FS_USER::RenameDirectory(Kernel::HLERequestContext& ctx) { dest_dirname_size, dest_dir_path.DebugStr()); if (!archives.ArchiveIsSlow(src_archive_handle) && - !archives.ArchiveIsSlow(dest_archive_handle)) { + !archives.ArchiveIsSlow(dest_archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.RenameDirectoryBetweenArchives(src_archive_handle, src_dir_path, dest_archive_handle, dest_dir_path)); @@ -575,7 +583,8 @@ void FS_USER::RenameDirectory(Kernel::HLERequestContext& ctx) { async_data->dest_archive_handle = dest_archive_handle; async_data->dest_dir_path = dest_dir_path; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.RenameDirectoryBetweenArchives( async_data->src_archive_handle, async_data->src_dir_path, @@ -602,7 +611,7 @@ void FS_USER::OpenDirectory(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_FS, "type={} size={} data={}", dirname_type, dirname_size, dir_path.DebugStr()); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); ResultVal> dir_res = archives.OpenDirectoryFromArchive(archive_handle, dir_path); @@ -630,7 +639,8 @@ void FS_USER::OpenDirectory(Kernel::HLERequestContext& ctx) { async_data->archive_handle = archive_handle; async_data->dir_path = dir_path; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->dir_res = archives.OpenDirectoryFromArchive(async_data->archive_handle, async_data->dir_path); @@ -669,7 +679,7 @@ void FS_USER::OpenArchive(Kernel::HLERequestContext& ctx) { u64 program_id = slot->program_id; // Conventional opening - if (!archives.ArchiveIsSlow(archive_id)) { + if (!archives.ArchiveIsSlow(archive_id) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); const ResultVal handle = archives.OpenArchive(archive_id, archive_path, program_id); @@ -699,7 +709,8 @@ void FS_USER::OpenArchive(Kernel::HLERequestContext& ctx) { async_data->archive_path = archive_path; async_data->program_id = program_id; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->handle = archives.OpenArchive( async_data->archive_id, async_data->archive_path, async_data->program_id); @@ -727,7 +738,7 @@ void FS_USER::ControlArchive(Kernel::HLERequestContext& ctx) { const auto input_size = rp.Pop(); const auto output_size = rp.Pop(); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { auto input = rp.PopMappedBuffer(); auto output = rp.PopMappedBuffer(); std::vector in_data(input_size); @@ -766,7 +777,8 @@ void FS_USER::ControlArchive(Kernel::HLERequestContext& ctx) { async_data->in_buffer = &rp.PopMappedBuffer(); async_data->out_buffer = &rp.PopMappedBuffer(); - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { std::vector in_data(async_data->in_size); async_data->in_buffer->Read(in_data.data(), 0, in_data.size()); @@ -792,7 +804,7 @@ void FS_USER::CloseArchive(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); const auto archive_handle = rp.PopRaw(); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.CloseArchive(archive_handle)); return; @@ -806,7 +818,8 @@ void FS_USER::CloseArchive(Kernel::HLERequestContext& ctx) { auto async_data = std::make_shared(); async_data->handle = archive_handle; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.CloseArchive(async_data->handle); return 0; @@ -1395,7 +1408,7 @@ void FS_USER::ObsoletedSetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { const u32 unique_id = rp.Pop(); const u8 title_variation = rp.Pop(); - if (!secure_value_backend->BackendIsSlow()) { + if (!secure_value_backend->BackendIsSlow() && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(secure_value_backend->ObsoletedSetSaveDataSecureValue(unique_id, title_variation, secure_value_slot, value)); @@ -1416,7 +1429,8 @@ void FS_USER::ObsoletedSetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { async_data->unique_id = unique_id; async_data->title_variation = title_variation; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = secure_value_backend->ObsoletedSetSaveDataSecureValue( async_data->unique_id, async_data->title_variation, async_data->secure_value_slot, @@ -1436,7 +1450,7 @@ void FS_USER::ObsoletedGetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { const u32 unique_id = rp.Pop(); const u8 title_variation = rp.Pop(); - if (!secure_value_backend->BackendIsSlow()) { + if (!secure_value_backend->BackendIsSlow() && !Settings::values.async_fs_operations) { auto res = secure_value_backend->ObsoletedGetSaveDataSecureValue(unique_id, title_variation, secure_value_slot); if (res.Failed()) { @@ -1463,7 +1477,8 @@ void FS_USER::ObsoletedGetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { async_data->unique_id = unique_id; async_data->title_variation = title_variation; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = secure_value_backend->ObsoletedGetSaveDataSecureValue( async_data->unique_id, async_data->title_variation, async_data->secure_value_slot); @@ -1511,7 +1526,7 @@ void FS_USER::SetThisSaveDataSecureValue(Kernel::HLERequestContext& ctx) { const u32 secure_value_slot = rp.Pop(); const u64 value = rp.Pop(); - if (!secure_value_backend->BackendIsSlow()) { + if (!secure_value_backend->BackendIsSlow() && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(secure_value_backend->SetThisSaveDataSecureValue(secure_value_slot, value)); return; @@ -1527,7 +1542,8 @@ void FS_USER::SetThisSaveDataSecureValue(Kernel::HLERequestContext& ctx) { async_data->value = value; async_data->secure_value_slot = secure_value_slot; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = secure_value_backend->SetThisSaveDataSecureValue( async_data->secure_value_slot, async_data->value); @@ -1544,7 +1560,7 @@ void FS_USER::GetThisSaveDataSecureValue(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); const u32 secure_value_slot = rp.Pop(); - if (!secure_value_backend->BackendIsSlow()) { + if (!secure_value_backend->BackendIsSlow() && !Settings::values.async_fs_operations) { auto res = secure_value_backend->GetThisSaveDataSecureValue(secure_value_slot); if (res.Failed()) { @@ -1569,7 +1585,8 @@ void FS_USER::GetThisSaveDataSecureValue(Kernel::HLERequestContext& ctx) { auto async_data = std::make_shared(); async_data->secure_value_slot = secure_value_slot; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = secure_value_backend->GetThisSaveDataSecureValue(async_data->secure_value_slot); @@ -1599,7 +1616,7 @@ void FS_USER::SetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { const u64 value = rp.Pop(); const bool flush = rp.Pop(); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(archives.SetSaveDataSecureValue(archive_handle, secure_value_slot, value, flush)); @@ -1620,7 +1637,8 @@ void FS_USER::SetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { async_data->secure_value_slot = secure_value_slot; async_data->flush = flush; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.SetSaveDataSecureValue(async_data->archive_handle, async_data->secure_value_slot, @@ -1639,7 +1657,7 @@ void FS_USER::GetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { const auto archive_handle = rp.PopRaw(); const u32 secure_value_slot = rp.Pop(); - if (!archives.ArchiveIsSlow(archive_handle)) { + if (!archives.ArchiveIsSlow(archive_handle) && !Settings::values.async_fs_operations) { auto res = archives.GetSaveDataSecureValue(archive_handle, secure_value_slot); if (res.Failed()) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); @@ -1665,7 +1683,8 @@ void FS_USER::GetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { async_data->archive_handle = archive_handle; async_data->secure_value_slot = secure_value_slot; - ctx.RunAsync( + ctx.RunOnThreadWorker( + fs_async_worker, [this, async_data](Kernel::HLERequestContext& ctx) { async_data->res = archives.GetSaveDataSecureValue(async_data->archive_handle, async_data->secure_value_slot); @@ -1900,6 +1919,9 @@ FS_USER::FS_USER(Core::System& system) template void Service::FS::FS_USER::serialize(Archive& ar, const unsigned int) { DEBUG_SERIALIZATION_POINT; + if (!Archive::is_loading::value) { + fs_async_worker.WaitForRequests(); + } ar& boost::serialization::base_object(*this); ar & priority; ar & secure_value_backend; diff --git a/src/core/hle/service/fs/fs_user.h b/src/core/hle/service/fs/fs_user.h index f94f318f2..9dd021bdc 100644 --- a/src/core/hle/service/fs/fs_user.h +++ b/src/core/hle/service/fs/fs_user.h @@ -49,6 +49,9 @@ private: class FS_USER final : public ServiceFramework { public: explicit FS_USER(Core::System& system); + ~FS_USER() { + fs_async_worker.WaitForRequests(); + } // On real HW this is part of FSReg (FSReg:Register). But since that module is only used by // loader and pm, which we HLEed, we can just directly use it here @@ -756,6 +759,8 @@ private: std::shared_ptr secure_value_backend; + Common::ThreadWorker fs_async_worker{1, "FSUSER_Worker"}; + template void serialize(Archive& ar, const unsigned int); friend class boost::serialization::access; From 929a51afc69dc8e0306fd884fd7b0ea883cf76c9 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Fri, 8 May 2026 15:19:53 +0200 Subject: [PATCH 85/98] audio: Add option to simulate headphones plugged in (#2099) --- CMakeModules/GenerateSettingKeys.cmake | 1 + .../features/settings/SettingKeys.kt | 1 + .../features/settings/model/BooleanSetting.kt | 1 + .../settings/ui/SettingsFragmentPresenter.kt | 9 ++++ src/android/app/src/main/jni/config.cpp | 1 + src/android/app/src/main/jni/default_ini.h | 4 ++ .../app/src/main/res/values/strings.xml | 2 + src/citra_qt/configuration/config.cpp | 2 + .../configuration/configure_audio.cpp | 10 +++- src/citra_qt/configuration/configure_audio.h | 3 +- src/citra_qt/configuration/configure_audio.ui | 50 +++++++++++-------- src/common/settings.h | 1 + src/core/hle/service/dsp/dsp_dsp.cpp | 7 ++- 13 files changed, 66 insertions(+), 26 deletions(-) diff --git a/CMakeModules/GenerateSettingKeys.cmake b/CMakeModules/GenerateSettingKeys.cmake index 38397a63b..7aff65db5 100644 --- a/CMakeModules/GenerateSettingKeys.cmake +++ b/CMakeModules/GenerateSettingKeys.cmake @@ -109,6 +109,7 @@ foreach(KEY IN ITEMS "output_device" "input_type" "input_device" + "simulate_headphones_plugged" "delay_start_for_lle_modules" "use_gdbstub" "gdbstub_port" diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt index f37e3636c..56ffb6789 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt @@ -94,6 +94,7 @@ object SettingKeys { external fun audio_emulation(): String external fun enable_audio_stretching(): String external fun enable_realtime_audio(): String + external fun simulate_headphones_plugged(): String external fun volume(): String external fun output_type(): String external fun output_device(): String diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index 9fcba652f..0e88dacf3 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -44,6 +44,7 @@ enum class BooleanSetting( PRELOAD_TEXTURES(SettingKeys.preload_textures(), Settings.SECTION_UTILITY, false), ENABLE_AUDIO_STRETCHING(SettingKeys.enable_audio_stretching(), Settings.SECTION_AUDIO, true), ENABLE_REALTIME_AUDIO(SettingKeys.enable_realtime_audio(), Settings.SECTION_AUDIO, false), + SIMULATE_HEADPHONES_PLUGGED(SettingKeys.simulate_headphones_plugged(), Settings.SECTION_AUDIO, false), CPU_JIT(SettingKeys.use_cpu_jit(), Settings.SECTION_CORE, true), HW_SHADER(SettingKeys.use_hw_shader(), Settings.SECTION_RENDERER, true), SHADER_JIT(SettingKeys.use_shader_jit(), Settings.SECTION_RENDERER, true), diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 282caad3b..94bfe78a9 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1713,6 +1713,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) BooleanSetting.ENABLE_REALTIME_AUDIO.defaultValue ) ) + add( + SwitchSetting( + BooleanSetting.SIMULATE_HEADPHONES_PLUGGED, + R.string.simulate_headphones_plugged, + R.string.simulate_headphones_plugged_description, + BooleanSetting.SIMULATE_HEADPHONES_PLUGGED.key, + BooleanSetting.SIMULATE_HEADPHONES_PLUGGED.defaultValue + ) + ) add( SingleChoiceSetting( IntSetting.AUDIO_INPUT_TYPE, diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index 08f63ad77..967166e12 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -244,6 +244,7 @@ void Config::ReadValues() { ReadSetting("Audio", Settings::values.audio_emulation); ReadSetting("Audio", Settings::values.enable_audio_stretching); ReadSetting("Audio", Settings::values.enable_realtime_audio); + ReadSetting("Audio", Settings::values.simulate_headphones_plugged); ReadSetting("Audio", Settings::values.volume); ReadSetting("Audio", Settings::values.output_type); ReadSetting("Audio", Settings::values.output_device); diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 444120e8e..6864d04b0 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -415,6 +415,10 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"( # 0 (default): No, 1: Yes )") DECLARE_KEY(enable_realtime_audio) BOOST_HANA_STRING(R"( +# Simulates whether headphones are plugged in to the emulated 3DS system +# 0 (default): No, 1: Yes +)") DECLARE_KEY(simulate_headphones_plugged) BOOST_HANA_STRING(R"( + # Output volume. # 1.0 (default): 100%, 0.0; mute )") DECLARE_KEY(volume) BOOST_HANA_STRING(R"( diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 0a26d32fa..a94611efc 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -340,6 +340,8 @@ Stretches audio to reduce stuttering. When enabled, increases audio latency and slightly reduces performance. Enable Realtime Audio Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the game framerate is low. May cause audio desync issues. + Simulate Headphones Plugged In + Simulates whether headphones are plugged in to the emulated 3DS system. Audio Input Device Sound Output Mode diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index ff0a63c1a..81d1956af 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -290,6 +290,7 @@ void QtConfig::ReadAudioValues() { ReadGlobalSetting(Settings::values.audio_emulation); ReadGlobalSetting(Settings::values.enable_audio_stretching); ReadGlobalSetting(Settings::values.enable_realtime_audio); + ReadGlobalSetting(Settings::values.simulate_headphones_plugged); ReadGlobalSetting(Settings::values.volume); if (global) { @@ -944,6 +945,7 @@ void QtConfig::SaveAudioValues() { WriteGlobalSetting(Settings::values.audio_emulation); WriteGlobalSetting(Settings::values.enable_audio_stretching); WriteGlobalSetting(Settings::values.enable_realtime_audio); + WriteGlobalSetting(Settings::values.simulate_headphones_plugged); WriteGlobalSetting(Settings::values.volume); if (global) { diff --git a/src/citra_qt/configuration/configure_audio.cpp b/src/citra_qt/configuration/configure_audio.cpp index 6dd775926..1a36da86d 100644 --- a/src/citra_qt/configuration/configure_audio.cpp +++ b/src/citra_qt/configuration/configure_audio.cpp @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -67,6 +67,8 @@ void ConfigureAudio::SetConfiguration() { ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching.GetValue()); ui->toggle_realtime_audio->setChecked(Settings::values.enable_realtime_audio.GetValue()); + ui->simulate_headphones_plugged->setChecked( + Settings::values.simulate_headphones_plugged.GetValue()); SetHleFeaturesEnabled(); const s32 volume = @@ -175,6 +177,9 @@ void ConfigureAudio::ApplyConfiguration() { &Settings::values.volume, ui->volume_combo_box, [this](s32) { return static_cast(ui->volume_slider->value()) / ui->volume_slider->maximum(); }); + ConfigurationShared::ApplyPerGameSetting(&Settings::values.simulate_headphones_plugged, + ui->simulate_headphones_plugged, + simulate_headphones_plugged); if (Settings::IsConfiguringGlobal()) { Settings::values.output_type = @@ -252,4 +257,7 @@ void ConfigureAudio::SetupPerGameUI() { ConfigurationShared::SetColoredTristate(ui->toggle_realtime_audio, Settings::values.enable_realtime_audio, realtime_audio); + ConfigurationShared::SetColoredTristate(ui->simulate_headphones_plugged, + Settings::values.simulate_headphones_plugged, + simulate_headphones_plugged); } diff --git a/src/citra_qt/configuration/configure_audio.h b/src/citra_qt/configuration/configure_audio.h index 2da6e3eea..fe6087e07 100644 --- a/src/citra_qt/configuration/configure_audio.h +++ b/src/citra_qt/configuration/configure_audio.h @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -41,5 +41,6 @@ private: ConfigurationShared::CheckState audio_stretching; ConfigurationShared::CheckState realtime_audio; + ConfigurationShared::CheckState simulate_headphones_plugged; std::unique_ptr ui; }; diff --git a/src/citra_qt/configuration/configure_audio.ui b/src/citra_qt/configuration/configure_audio.ui index 706e335c0..946f5c0e7 100644 --- a/src/citra_qt/configuration/configure_audio.ui +++ b/src/citra_qt/configuration/configure_audio.ui @@ -85,26 +85,6 @@ - - - - <html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html> - - - Enable audio stretching - - - - - - - <html><head/><body><p>Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the application framerate is low. May cause audio desync issues.</p></body></html> - - - Enable realtime audio - - - @@ -192,6 +172,36 @@ + + + + <html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html> + + + Enable audio stretching + + + + + + + <html><head/><body><p>Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the application framerate is low. May cause audio desync issues.</p></body></html> + + + Enable realtime audio + + + + + + + <html><head/><body><p>Simulates whether headphones are plugged in to the emulated 3DS system.</p></body></html> + + + Simulate headphones plugged in + + + diff --git a/src/common/settings.h b/src/common/settings.h index 6bddf2ee5..4196557d1 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -629,6 +629,7 @@ struct Values { Setting output_device{"Auto", Keys::output_device}; Setting input_type{AudioCore::InputType::Auto, Keys::input_type}; Setting input_device{"Auto", Keys::input_device}; + SwitchableSetting simulate_headphones_plugged{false, Keys::simulate_headphones_plugged}; // Camera std::array camera_name; diff --git a/src/core/hle/service/dsp/dsp_dsp.cpp b/src/core/hle/service/dsp/dsp_dsp.cpp index 9b4a9c27b..ae936ba94 100644 --- a/src/core/hle/service/dsp/dsp_dsp.cpp +++ b/src/core/hle/service/dsp/dsp_dsp.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -290,9 +290,8 @@ void DSP_DSP::GetHeadphoneStatus(Kernel::HLERequestContext& ctx) { IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); rb.Push(ResultSuccess); - rb.Push(false); /// u8, 0 = not inserted, 1 = inserted - - LOG_DEBUG(Service_DSP, "called"); + rb.Push(Settings::values.simulate_headphones_plugged + .GetValue()); /// u8, 0 = not inserted, 1 = inserted } void DSP_DSP::ForceHeadphoneOut(Kernel::HLERequestContext& ctx) { From f902010f046880f08ade307afed45bdb148db275 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 19:38:33 +0100 Subject: [PATCH 86/98] externals: Don't fall back to bundled OpenSSL if USE_SYSTEM_OPENSSL is enabled --- externals/CMakeLists.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index a0e75c2ac..046e484fe 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -327,12 +327,8 @@ endif() # OpenSSL if (USE_SYSTEM_OPENSSL) find_package(OpenSSL 1.1) - if (OPENSSL_FOUND) - set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) - endif() -endif() - -if (NOT OPENSSL_FOUND) + set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) +else() # LibreSSL set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "") set(OPENSSLDIR "/etc/ssl/") From ca99574700f229a7c0cba06522000cd9b55ad344 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 19:50:00 +0100 Subject: [PATCH 87/98] tests: Don't run catch_discover_tests when cross-compiling to a different OS --- src/tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 027609c26..cf99e004d 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -36,7 +36,7 @@ if (ENABLE_LIBRETRO) endif() add_test(NAME tests COMMAND tests) -if(NOT ANDROID) +if(NOT ANDROID AND (CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME)) catch_discover_tests(tests) endif() From 422c7865a3b3afe3dabc766e5ffbe10204bcbbd8 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 20:42:59 +0100 Subject: [PATCH 88/98] For Linux --> Windows cross-compilation, copy all cross-compiled DLLs during build As per the comment, this is just to get the build functioning pending a real solution --- src/citra_meta/CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/citra_meta/CMakeLists.txt b/src/citra_meta/CMakeLists.txt index b19238a9c..fc589f5f1 100644 --- a/src/citra_meta/CMakeLists.txt +++ b/src/citra_meta/CMakeLists.txt @@ -48,6 +48,22 @@ if (APPLE) endif() endif() +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32 AND MINGW) + # TODO: This is placeholder bullshit, we need to find out a way to do actual dependency resolution. + # Can we use Wine maybe? -OS + set(EXTRA_LIBS /mxe/usr/x86_64-w64-mingw32.shared/bin/*.dll ) + add_custom_command(TARGET citra_meta POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ ${EXTRA_LIBS} $ + COMMAND ${CMAKE_COMMAND} -E make_directory "$/plugins/" + COMMAND ${CMAKE_COMMAND} -E copy_directory /mxe/usr/x86_64-w64-mingw32.shared/qt6/plugins/ "$/plugins/" + COMMAND_EXPAND_LISTS + ) + add_custom_command(TARGET citra_meta POST_BUILD + COMMAND_EXPAND_LISTS + ) + unset(EXTRA_LIBS) +endif() + target_link_libraries(citra_meta PRIVATE citra_common fmt) if (ENABLE_QT) From 644a181affb9715c00cda8608492da2e53e64cfb Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 20:48:07 +0100 Subject: [PATCH 89/98] cmake: Explicitly disable BUILD_SHARED_LIBS --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d98994384..6bfebe132 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,9 @@ cmake_policy(SET CMP0063 NEW) cmake_policy(SET CMP0127 NEW) set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) +# Prefer building bundled dependencies as static instead of shared +set(BUILD_SHARED_LIBS OFF) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules") include(DownloadExternals) From 0ce2a30d20667753e18e92d87755a1c77d3390ac Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Mon, 20 Apr 2026 23:24:46 +0100 Subject: [PATCH 90/98] Implement proper DLL resolution for MXE builds --- .gitmodules | 3 +++ externals/dllwalker | 1 + src/citra_meta/CMakeLists.txt | 20 ++++++++++++-------- 3 files changed, 16 insertions(+), 8 deletions(-) create mode 160000 externals/dllwalker diff --git a/.gitmodules b/.gitmodules index e2460ab15..d09df6f0d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -106,3 +106,6 @@ [submodule "externals/libretro-common"] path = externals/libretro-common/libretro-common url = https://github.com/libretro/libretro-common.git +[submodule "dllwalker"] + path = externals/dllwalker + url = https://github.com/azahar-emu/dllwalker diff --git a/externals/dllwalker b/externals/dllwalker new file mode 160000 index 000000000..0c35d5de5 --- /dev/null +++ b/externals/dllwalker @@ -0,0 +1 @@ +Subproject commit 0c35d5de533eb82480dce2a211112517f69010d4 diff --git a/src/citra_meta/CMakeLists.txt b/src/citra_meta/CMakeLists.txt index fc589f5f1..baffd0639 100644 --- a/src/citra_meta/CMakeLists.txt +++ b/src/citra_meta/CMakeLists.txt @@ -49,19 +49,23 @@ if (APPLE) endif() if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32 AND MINGW) - # TODO: This is placeholder bullshit, we need to find out a way to do actual dependency resolution. - # Can we use Wine maybe? -OS - set(EXTRA_LIBS /mxe/usr/x86_64-w64-mingw32.shared/bin/*.dll ) + # TODO: Do this for all executables, not just citra_meta + # TODO: Don't hardcode MXE directory to root? + set(dllwalker_command "${CMAKE_SOURCE_DIR}/externals/dllwalker/dllwalker.rb" + $ + /mxe/usr/x86_64-w64-mingw32.shared/bin/ + /mxe/usr/x86_64-w64-mingw32.shared/qt6/bin/) + set(dll_list_filename "${CMAKE_CURRENT_BINARY_DIR}/required_dlls_list.txt") add_custom_command(TARGET citra_meta POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy $ ${EXTRA_LIBS} $ + COMMAND ${dllwalker_command} > ${dll_list_filename} + ) + add_custom_command(TARGET citra_meta POST_BUILD + COMMAND cat ${dll_list_filename} | xargs -I {} ${CMAKE_COMMAND} -E copy {} $ COMMAND ${CMAKE_COMMAND} -E make_directory "$/plugins/" COMMAND ${CMAKE_COMMAND} -E copy_directory /mxe/usr/x86_64-w64-mingw32.shared/qt6/plugins/ "$/plugins/" COMMAND_EXPAND_LISTS + DEPENDS ${dll_list_filename} ) - add_custom_command(TARGET citra_meta POST_BUILD - COMMAND_EXPAND_LISTS - ) - unset(EXTRA_LIBS) endif() target_link_libraries(citra_meta PRIVATE citra_common fmt) From 5ecd402811e1c36c596aed3b3eb4b2f414e9ac3f Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 6 May 2026 12:03:33 +0100 Subject: [PATCH 91/98] cmake: Explicitly use `gcc-ar` instead of `ar` for MXE builds --- CMakeLists.txt | 5 +++++ src/citra_meta/CMakeLists.txt | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bfebe132..42664571b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,11 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS") enable_language(OBJC OBJCXX) endif() +if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND MINGW) + string(TOLOWER ${LIBTYPE} LIBTYPE_LOWER) + set(CMAKE_AR x86_64-w64-mingw32.${LIBTYPE_LOWER}-gcc-ar) +endif() + if (BSD STREQUAL "OpenBSD") add_link_options(-z wxneeded) endif() diff --git a/src/citra_meta/CMakeLists.txt b/src/citra_meta/CMakeLists.txt index baffd0639..a2398b5d6 100644 --- a/src/citra_meta/CMakeLists.txt +++ b/src/citra_meta/CMakeLists.txt @@ -48,7 +48,7 @@ if (APPLE) endif() endif() -if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32 AND MINGW) +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND MINGW) # TODO: Do this for all executables, not just citra_meta # TODO: Don't hardcode MXE directory to root? set(dllwalker_command "${CMAKE_SOURCE_DIR}/externals/dllwalker/dllwalker.rb" From 854e1981963e325df468889edd21ecaf2722dc3e Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 6 May 2026 12:57:03 +0100 Subject: [PATCH 92/98] cmake: Implemented bundle target for MXE builds Just copies the content of bin// to bundle/ --- CMakeModules/BundleTarget.cmake | 36 ++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/CMakeModules/BundleTarget.cmake b/CMakeModules/BundleTarget.cmake index fead41acf..45e5ee296 100644 --- a/CMakeModules/BundleTarget.cmake +++ b/CMakeModules/BundleTarget.cmake @@ -198,6 +198,10 @@ if (BUNDLE_TARGET_EXECUTE) # On Linux, always bundle an AppImage. if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") + if (IS_MINGW) + return() + endif() + if (IN_PLACE) message(FATAL_ERROR "Cannot bundle for Linux in-place.") endif() @@ -273,15 +277,23 @@ else() # On Linux, add a command to prepare linuxdeploy and any required plugins before any bundling occurs. if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") - add_custom_command( - TARGET bundle - COMMAND ${CMAKE_COMMAND} - "-DBUNDLE_TARGET_DOWNLOAD_LINUXDEPLOY=1" - "-DLINUXDEPLOY_PATH=${CMAKE_BINARY_DIR}/externals/linuxdeploy" - "-DLINUXDEPLOY_ARCH=${CMAKE_HOST_SYSTEM_PROCESSOR}" - -P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - POST_BUILD) + if (MINGW) + add_custom_command( + TARGET bundle + # The target here is arbitrary + COMMAND cp -r "$/*" "${CMAKE_BINARY_DIR}/bundle/" + POST_BUILD) + else() + add_custom_command( + TARGET bundle + COMMAND ${CMAKE_COMMAND} + "-DBUNDLE_TARGET_DOWNLOAD_LINUXDEPLOY=1" + "-DLINUXDEPLOY_PATH=${CMAKE_BINARY_DIR}/externals/linuxdeploy" + "-DLINUXDEPLOY_ARCH=${CMAKE_HOST_SYSTEM_PROCESSOR}" + -P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + POST_BUILD) + endif() endif() endfunction() @@ -293,6 +305,11 @@ else() create_base_bundle_target() endif() + if (CMAKE_HOST_SYSTEM STREQUAL "Linux" AND MINGW) + # We don't really need to "bundle" MXE builds, so don't do anything + return() + endif() + set(bundle_executable_path "$") if (bundle_qt AND APPLE) # For Qt targets on Apple, expect an app bundle. @@ -331,6 +348,7 @@ else() "-DBUNDLE_LIBRARY_PATHS=\"${bundle_library_paths}\"" "-DBUNDLE_QT=${bundle_qt}" "-DIN_PLACE=${in_place}" + "-DIS_MINGW=${MINGW}" "-DLINUXDEPLOY=${CMAKE_BINARY_DIR}/externals/linuxdeploy/squashfs-root/AppRun" -P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") From 652fc021755495f58667d6e49743a4d0e6fdc1a9 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Thu, 7 May 2026 11:46:55 +0100 Subject: [PATCH 93/98] ci: Implement MXE CI/CD build job --- .ci/mxe.sh | 26 ++++++++++++++++++++++++++ .ci/pack.sh | 4 ++-- .github/workflows/build.yml | 34 ++++++++++++++++++++++++++++------ 3 files changed, 56 insertions(+), 8 deletions(-) create mode 100755 .ci/mxe.sh diff --git a/.ci/mxe.sh b/.ci/mxe.sh new file mode 100755 index 000000000..2aa2ccfa9 --- /dev/null +++ b/.ci/mxe.sh @@ -0,0 +1,26 @@ +#!/bin/bash -ex + +# TODO: Why doesn't the CI environment use the PATH set in the Dockerimage? +# It works fine when using the image locally. +export PATH="/mxe/usr/bin:${PATH}" + +mkdir build && cd build + +if [ "$GITHUB_REF_TYPE" == "tag" ]; then + export EXTRA_CMAKE_FLAGS=(-DENABLE_QT_UPDATE_CHECKER=ON) +fi + +x86_64-w64-mingw32.shared-cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DENABLE_QT_TRANSLATION=ON \ + -DUSE_DISCORD_PRESENCE=ON \ + -DUSE_SYSTEM_BOOST=ON \ + -DUSE_SYSTEM_CRYPTOPP=ON \ + "${EXTRA_CMAKE_FLAGS[@]}" +x86_64-w64-mingw32.shared-cmake --build . -- -j$(nproc) +x86_64-w64-mingw32.shared-strip -s bin/Release/*.exe +make bundle + +ccache -s -v diff --git a/.ci/pack.sh b/.ci/pack.sh index 1a6356e11..71c2339b4 100755 --- a/.ci/pack.sh +++ b/.ci/pack.sh @@ -36,10 +36,10 @@ function pack_artifacts() { fi # Create .zip/.tar.gz - if [ "$OS" = "windows" ]; then + if [ "$OS" = "windows" ] && [ "$TARGET" != "mxe" ]; then ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip" powershell Compress-Archive "$REV_NAME" "$ARCHIVE_FULL_NAME" - elif [ "$OS" = "android" ] || [ "$OS" = "macos" ]; then + elif [ "$OS" = "android" ] || [ "$OS" = "macos" ] || [ "$TARGET" = "mxe" ]; then ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip" zip -r "$ARCHIVE_FULL_NAME" "$REV_NAME" else diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0201aa3b0..70a8417f0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -143,11 +143,21 @@ jobs: path: artifacts/ windows: - runs-on: windows-latest strategy: fail-fast: false matrix: - target: ["msvc", "msys2"] + include: + - target: msvc + os: windows-latest + - target: msys2 + os: windows-latest + - target: mxe + os: ubuntu-latest + container: + image: opensauce04/azahar-build-environment:latest + options: -u 1001 + runs-on: ${{ matrix.os }} + container: ${{ matrix.container }} defaults: run: shell: ${{ (matrix.target == 'msys2' && 'msys2') || 'bash' }} {0} @@ -195,23 +205,35 @@ jobs: with: args: install ptime wget - name: Install NSIS - if: ${{ github.ref_type == 'tag' }} + if: ${{ github.ref_type == 'tag' && matrix.target != 'mxe' }} run: | wget https://download.sourceforge.net/project/nsis/NSIS%203/3.11/nsis-3.11-setup.exe -O D:/a/_temp/nsis-setup.exe ptime D:/a/_temp/nsis-setup.exe /S shell: pwsh - name: Disable line ending translation run: git config --global core.autocrlf input - - name: Build + - name: Build (Native) + if: ${{ matrix.target != 'mxe' }} run: ./.ci/windows.sh - - name: Generate installer - if: ${{ github.ref_type == 'tag' }} + - name: Build (MXE) + if: ${{ matrix.target == 'mxe' }} + run: ./.ci/mxe.sh + - name: Generate installer (Native) + if: ${{ github.ref_type == 'tag' && matrix.target != 'mxe' }} run: | cd src\installer "C:\Program Files (x86)\NSIS\makensis.exe" /DPRODUCT_VARIANT=${{ matrix.target }} /DPRODUCT_VERSION=${{ github.ref_name }} citra.nsi mkdir ..\..\artifacts 2> NUL move /y *.exe ..\..\artifacts\ shell: cmd + - name: Generate installer (MXE) + if: ${{ github.ref_type == 'tag' && matrix.target == 'mxe' }} + run: | + export PATH="/mxe/usr/bin:${PATH}" # TODO: Why do we have to do this if it's in the image? + cd src/installer + x86_64-w64-mingw32.shared-makensis -DPRODUCT_VARIANT=${{ matrix.target }} -DPRODUCT_VERSION=${{ github.ref_name }} citra.nsi + mkdir -p ../../artifacts + mv ./*.exe ../../artifacts/ - name: Pack run: ./.ci/pack.sh - name: Upload From bf59d26c48aff932d46af8f5aa0407e78f6bc970 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Fri, 8 May 2026 16:01:34 +0100 Subject: [PATCH 94/98] externals: Update dllwalker to commit 2f8b349 --- externals/dllwalker | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/dllwalker b/externals/dllwalker index 0c35d5de5..2f8b349c2 160000 --- a/externals/dllwalker +++ b/externals/dllwalker @@ -1 +1 @@ -Subproject commit 0c35d5de533eb82480dce2a211112517f69010d4 +Subproject commit 2f8b349c26832cae612aa7082154c0697a9cbc8e From 1c7c7a5f1b6bcdbb14660d9f2452621c5c1ab413 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sat, 9 May 2026 14:03:55 +0200 Subject: [PATCH 95/98] svc: Fix instruction cache invalidation only affecting current core (#2100) --- src/core/hle/kernel/svc.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 7392de779..715aedd6a 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -2055,12 +2055,16 @@ Result SVC::GetProcessList(s32* process_count, VAddr out_process_array, } Result SVC::InvalidateInstructionCacheRange(u32 addr, u32 size) { - system.GetRunningCore().InvalidateCacheRange(addr, size); + for (size_t i = 0; i < system.GetNumCores(); i++) { + system.GetCore(i).InvalidateCacheRange(addr, size); + } return ResultSuccess; } Result SVC::InvalidateEntireInstructionCache() { - system.GetRunningCore().ClearInstructionCache(); + for (size_t i = 0; i < system.GetNumCores(); i++) { + system.GetCore(i).ClearInstructionCache(); + } return ResultSuccess; } From dbe7fd979f8c9e2abac5c2d0d8a8a4fe79e8f0a6 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sun, 3 May 2026 13:43:47 +0100 Subject: [PATCH 96/98] cmake: Add EXCLUDE_FROM_ALL to targets where applicable --- externals/CMakeLists.txt | 28 ++++++++++++++-------------- src/audio_core/CMakeLists.txt | 2 +- src/common/CMakeLists.txt | 2 +- src/core/CMakeLists.txt | 2 +- src/input_common/CMakeLists.txt | 2 +- src/network/CMakeLists.txt | 2 +- src/video_core/CMakeLists.txt | 2 +- src/web_service/CMakeLists.txt | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 046e484fe..c5d424ff4 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -57,7 +57,7 @@ if (ENABLE_TESTS) else() set(CATCH_INSTALL_DOCS OFF CACHE BOOL "") set(CATCH_INSTALL_EXTRAS OFF CACHE BOOL "") - add_subdirectory(catch2) + add_subdirectory(catch2 EXCLUDE_FROM_ALL) endif() target_link_libraries(catch2 INTERFACE Catch2::Catch2WithMain) include(Catch) @@ -79,7 +79,7 @@ else() set(CRYPTOPP_BUILD_TESTING OFF CACHE BOOL "") set(CRYPTOPP_INSTALL OFF CACHE BOOL "") set(CRYPTOPP_SOURCES "${CMAKE_SOURCE_DIR}/externals/cryptopp" CACHE STRING "") - add_subdirectory(cryptopp-cmake) + add_subdirectory(cryptopp-cmake EXCLUDE_FROM_ALL) endif() # dds-ktx @@ -142,7 +142,7 @@ endif() # getopt if (MSVC) - add_subdirectory(getopt) + add_subdirectory(getopt EXCLUDE_FROM_ALL) endif() # inih @@ -151,7 +151,7 @@ if(USE_SYSTEM_INIH) add_library(inih INTERFACE) target_link_libraries(inih INTERFACE inih::inih inih::inir) else() - add_subdirectory(inih) + add_subdirectory(inih EXCLUDE_FROM_ALL) endif() # MicroProfile @@ -174,7 +174,7 @@ if (NOT MSVC) endif() # Open Source Archives -add_subdirectory(open_source_archives) +add_subdirectory(open_source_archives EXCLUDE_FROM_ALL) # faad2 add_subdirectory(faad2 EXCLUDE_FROM_ALL) @@ -213,12 +213,12 @@ add_subdirectory(teakra EXCLUDE_FROM_ALL) # SDL2 if (ENABLE_SDL2 AND NOT USE_SYSTEM_SDL2) - add_subdirectory(sdl2) + add_subdirectory(sdl2 EXCLUDE_FROM_ALL) endif() # libusb if (ENABLE_LIBUSB AND NOT USE_SYSTEM_LIBUSB) - add_subdirectory(libusb) + add_subdirectory(libusb EXCLUDE_FROM_ALL) set(LIBUSB_INCLUDE_DIR "" PARENT_SCOPE) set(LIBUSB_LIBRARIES usb PARENT_SCOPE) endif() @@ -262,7 +262,7 @@ if(USE_SYSTEM_ENET) add_library(enet INTERFACE) target_link_libraries(enet INTERFACE libenet::libenet) else() - add_subdirectory(enet) + add_subdirectory(enet EXCLUDE_FROM_ALL) target_include_directories(enet INTERFACE ./enet/include) endif() @@ -370,7 +370,7 @@ target_compile_options(httplib INTERFACE -DCPPHTTPLIB_OPENSSL_SUPPORT) target_link_libraries(httplib INTERFACE ${OPENSSL_LIBRARIES}) if (UNIX AND NOT APPLE) - add_subdirectory(gamemode) + add_subdirectory(gamemode EXCLUDE_FROM_ALL) endif() # cpp-jwt @@ -393,13 +393,13 @@ if(USE_SYSTEM_LODEPNG) find_package(lodepng REQUIRED) target_link_libraries(lodepng INTERFACE lodepng::lodepng) else() - add_subdirectory(lodepng) + add_subdirectory(lodepng EXCLUDE_FROM_ALL) endif() # (xperia64): Only use libyuv on Android b/c of build issues on Windows and mandatory JPEG if(ANDROID) # libyuv - add_subdirectory(libyuv) + add_subdirectory(libyuv EXCLUDE_FROM_ALL) target_include_directories(yuv INTERFACE ./libyuv/include) endif() @@ -428,7 +428,7 @@ endif() # OpenGL dependencies if (ENABLE_OPENGL) # Glad - add_subdirectory(glad) + add_subdirectory(glad EXCLUDE_FROM_ALL) endif() # Vulkan dependencies @@ -468,7 +468,7 @@ if (ENABLE_VULKAN) set(ENABLE_CTEST OFF CACHE BOOL "") set(ENABLE_HLSL OFF CACHE BOOL "") set(BUILD_EXTERNAL OFF CACHE BOOL "") - add_subdirectory(glslang) + add_subdirectory(glslang EXCLUDE_FROM_ALL) endif() # sirit @@ -516,7 +516,7 @@ if (ENABLE_VULKAN) # adrenotools if (ANDROID AND "arm64" IN_LIST ARCHITECTURE) - add_subdirectory(libadrenotools) + add_subdirectory(libadrenotools EXCLUDE_FROM_ALL) endif() endif() diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 6ea16672e..f6f8bf9ed 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(audio_core STATIC +add_library(audio_core STATIC EXCLUDE_FROM_ALL audio_types.h codec.cpp codec.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 931899f5f..ae812c89d 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -1,6 +1,6 @@ include(GenerateSCMRev) -add_library(citra_common STATIC +add_library(citra_common STATIC EXCLUDE_FROM_ALL aarch64/cpu_detect.cpp aarch64/cpu_detect.h aarch64/oaknut_abi.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e3f8e5275..dfcb20a27 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(citra_core STATIC +add_library(citra_core STATIC EXCLUDE_FROM_ALL 3ds.h arm/arm_interface.h arm/dyncom/arm_dyncom.cpp diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt index 70d36cbfd..2226f7931 100644 --- a/src/input_common/CMakeLists.txt +++ b/src/input_common/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(input_common STATIC +add_library(input_common STATIC EXCLUDE_FROM_ALL analog_from_button.cpp analog_from_button.h keyboard.cpp diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index 3feb6f479..365bd6877 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(network STATIC +add_library(network STATIC EXCLUDE_FROM_ALL announce_multiplayer_session.cpp announce_multiplayer_session.h artic_base/artic_base_client.cpp diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index a8ade344d..528072c9a 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -1,6 +1,6 @@ add_subdirectory(host_shaders) -add_library(video_core STATIC +add_library(video_core STATIC EXCLUDE_FROM_ALL custom_textures/custom_format.cpp custom_textures/custom_format.h custom_textures/custom_tex_manager.cpp diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt index 7dabb7b45..d21c0eace 100644 --- a/src/web_service/CMakeLists.txt +++ b/src/web_service/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(web_service STATIC +add_library(web_service STATIC EXCLUDE_FROM_ALL announce_room_json.cpp announce_room_json.h precompiled_headers.h From 778ca369cda984c6bcebfdad876c675cab5f3ed1 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Tue, 12 May 2026 11:52:58 +0100 Subject: [PATCH 97/98] ci: Strip libretro cores after building --- .github/workflows/libretro.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/libretro.yml b/.github/workflows/libretro.yml index aa846730d..7739a0e8a 100644 --- a/.github/workflows/libretro.yml +++ b/.github/workflows/libretro.yml @@ -32,6 +32,10 @@ jobs: echo "GIT_TAG_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV fi echo $GIT_TAG_NAME + - name: Install tools + run: | + sudo apt-get update -y + sudo apt-get install -y llvm - name: Update Android SDK CMake version run: | echo "y" | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "ndk;$ANDROID_NDK_VERSION" @@ -41,6 +45,7 @@ jobs: export NDK_ROOT=${ANDROID_SDK_ROOT}/ndk/$ANDROID_NDK_VERSION ${ANDROID_SDK_ROOT}/cmake/3.30.3/bin/cmake $CORE_ARGS -DANDROID_PLATFORM=android-$API_LEVEL -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_static -DANDROID_ABI=$ANDROID_ABI . -B $BUILD_DIR ${ANDROID_SDK_ROOT}/cmake/3.30.3/bin/cmake --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc) + llvm-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh - name: Upload @@ -60,10 +65,15 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + - name: Install tools + run: | + sudo apt-get update -y + sudo apt-get install -y llvm - name: Build run: | cmake $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR cmake --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc) + llvm-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh - name: Upload @@ -94,7 +104,8 @@ jobs: $IMAGE \ bash -lc "\ ${CMAKE} $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR && \ - ${CMAKE} --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc)" + ${CMAKE} --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc) && \ + x86_64-w64-mingw32.static-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*" - name: Pack run: ./.ci/libretro-pack.sh - name: Upload @@ -123,6 +134,7 @@ jobs: run: | cmake $CORE_ARGS -DCMAKE_OSX_ARCHITECTURES=$TARGET . -B $BUILD_DIR cmake --build $BUILD_DIR --target azahar_libretro --config Release + strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh - name: Upload @@ -146,6 +158,7 @@ jobs: run: | cmake $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR cmake --build $BUILD_DIR --target azahar_libretro --config Release + strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh - name: Upload @@ -169,6 +182,7 @@ jobs: run: | cmake $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR cmake --build $BUILD_DIR --target azahar_libretro --config Release + strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh - name: Upload From 267887d7a91368ea6b606029094c9771f25997f1 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Thu, 14 May 2026 14:52:10 +0200 Subject: [PATCH 98/98] Add attestation support to increase release security (#2117) * ci: Add sbom and attestation * tools: Add verify-release.sh * verify-release.sh: Set executable permission * verify-release.sh: Put downloads into a gitignored directory * tools: Make verify-release also download sbom --------- Co-authored-by: OpenSauce04 --- .ci/docker.sh | 5 +- .github/workflows/build.yml | 107 +++++++++++++++++- .github/workflows/libretro.yml | 123 ++++++++++++++++++++- .gitignore | 3 + tools/verify-release.sh | 194 +++++++++++++++++++++++++++++++++ 5 files changed, 423 insertions(+), 9 deletions(-) create mode 100755 tools/verify-release.sh diff --git a/.ci/docker.sh b/.ci/docker.sh index d4df835c4..1747f8832 100755 --- a/.ci/docker.sh +++ b/.ci/docker.sh @@ -14,4 +14,7 @@ echo "Tag name is: $TAG_NAME" docker build -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME . mkdir -p build -docker save azahar-room:$TAG_NAME > build/azahar-room-$TAG_NAME.dockerimage +FILENAME="azahar-room-$TAG_NAME.dockerimage" +docker save azahar-room:$TAG_NAME > build/$FILENAME + +echo "DOCKER_IMAGE_PATH=artifacts/$FILENAME" >> $GITHUB_ENV \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 70a8417f0..559566b40 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,11 @@ on: pull_request: branches: [ master ] +permissions: + id-token: write + contents: read + attestations: write + jobs: source: if: ${{ !github.head_ref }} @@ -17,11 +22,26 @@ jobs: submodules: recursive - name: Pack run: ./.ci/source.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: ./ + format: spdx-json + output-file: artifacts/source.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: source path: artifacts/ + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + artifacts/*.tar.xz + sbom-path: artifacts/source.spdx.json linux-x86_64: runs-on: ubuntu-latest @@ -39,13 +59,14 @@ jobs: OS: linux TARGET: ${{ matrix.target }} SHOULD_RUN: ${{ (matrix.target != 'appimage-wayland' || github.ref_type == 'tag') }} + CACHE_ENABLED: ${{ github.ref_type != 'tag' }} steps: - uses: actions/checkout@v4 if: ${{ env.SHOULD_RUN == 'true' }} with: submodules: recursive - name: Set up cache - if: ${{ env.SHOULD_RUN == 'true' }} + if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }} uses: actions/cache@v4 with: path: ${{ env.CCACHE_DIR }} @@ -64,12 +85,27 @@ jobs: if: ${{ matrix.target == 'appimage-wayland' && env.SHOULD_RUN == 'true' }} run: | mv artifacts/azahar.AppImage artifacts/azahar-wayland.AppImage + - name: Generate SBOM + if: ${{ contains(matrix.target, 'appimage') && github.ref_type == 'tag' && env.SHOULD_RUN == 'true' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: artifacts/linux-x86_64-${{ matrix.target }}.spdx.json + upload-artifact: false - name: Upload if: ${{ contains(matrix.target, 'appimage') && env.SHOULD_RUN == 'true' }} uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-${{ matrix.target }} path: artifacts/ + - name: Attest artifacts + if: ${{ contains(matrix.target, 'appimage') && github.ref_type == 'tag' && env.SHOULD_RUN == 'true' }} + uses: actions/attest@v4 + with: + subject-path: | + artifacts/*.AppImage + sbom-path: artifacts/linux-x86_64-${{ matrix.target }}.spdx.json linux-arm64: runs-on: ubuntu-24.04-arm @@ -106,12 +142,14 @@ jobs: CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_COMPILERCHECK: content CCACHE_SLOPPINESS: time_macros + CACHE_ENABLED: ${{ github.ref_type != 'tag' }} OS: macos steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Set up cache + if: ${{ env.CACHE_ENABLED == 'true' }} uses: actions/cache@v4 with: path: ${{ env.CCACHE_DIR }} @@ -136,11 +174,26 @@ jobs: env: PACK_INDIVIDUALLY: 1 run: ./.ci/pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: artifacts/macos.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }} path: artifacts/ + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + artifacts/*.zip + sbom-path: artifacts/macos.spdx.json windows: strategy: @@ -165,6 +218,7 @@ jobs: CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_COMPILERCHECK: content CCACHE_SLOPPINESS: time_macros + CACHE_ENABLED: ${{ github.ref_type != 'tag' }} OS: windows TARGET: ${{ matrix.target }} steps: @@ -172,6 +226,7 @@ jobs: with: submodules: recursive - name: Set up cache + if: ${{ env.CACHE_ENABLED == 'true' }} uses: actions/cache@v4 with: path: ${{ env.CCACHE_DIR }} @@ -236,11 +291,27 @@ jobs: mv ./*.exe ../../artifacts/ - name: Pack run: ./.ci/pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: artifacts/windows-${{ matrix.target }}.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} path: artifacts/ + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + artifacts/*.zip + artifacts/*.exe + sbom-path: artifacts/windows-${{ matrix.target }}.spdx.json android: runs-on: ubuntu-latest @@ -252,6 +323,7 @@ jobs: CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_COMPILERCHECK: content CCACHE_SLOPPINESS: time_macros + CACHE_ENABLED: ${{ github.ref_type != 'tag' }} OS: android TARGET: ${{ matrix.target }} SHOULD_RUN: ${{ (matrix.target == 'vanilla' || github.ref_type == 'tag') }} @@ -261,7 +333,7 @@ jobs: with: submodules: recursive - name: Set up cache - if: ${{ env.SHOULD_RUN == 'true' }} + if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }} uses: actions/cache@v4 with: path: | @@ -300,12 +372,28 @@ jobs: working-directory: src/android/app env: UNPACKED: 1 + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: src/android + format: spdx-json + output-file: src/android/app/artifacts/android-${{ matrix.target }}.spdx.json + upload-artifact: false - name: Upload if: ${{ env.SHOULD_RUN == 'true' }} uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} path: src/android/app/artifacts/ + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + src/android/app/artifacts/*.apk + src/android/app/artifacts/*.aab + sbom-path: src/android/app/artifacts/android-${{ matrix.target }}.spdx.json docker: runs-on: ubuntu-latest @@ -325,8 +413,23 @@ jobs: run: | mkdir -p artifacts mv build/*.dockerimage artifacts/ + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + image: ${{ env.DOCKER_IMAGE_PATH }} + format: spdx-json + output-file: artifacts/docker-room.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: docker path: artifacts/ + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + artifacts/*.dockerimage + sbom-path: artifacts/docker-room.spdx.json diff --git a/.github/workflows/libretro.yml b/.github/workflows/libretro.yml index 7739a0e8a..10c137327 100644 --- a/.github/workflows/libretro.yml +++ b/.github/workflows/libretro.yml @@ -11,6 +11,11 @@ on: env: CORE_ARGS: -DENABLE_LIBRETRO=ON +permissions: + id-token: write + contents: read + attestations: write + jobs: android: runs-on: ubuntu-22.04 @@ -48,11 +53,29 @@ jobs: llvm-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: libretro-android.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} - path: ./*.zip + path: | + ./*.zip + ./*.spdx.json + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + ./*.zip + sbom-path: libretro-android.spdx.json + linux: runs-on: ubuntu-22.04 env: @@ -76,11 +99,29 @@ jobs: llvm-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: libretro-linux.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} - path: ./*.zip + path: | + ./*.zip + ./*.spdx.json + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + ./*.zip + sbom-path: libretro-linux.spdx.json + windows: runs-on: ubuntu-latest env: @@ -108,11 +149,28 @@ jobs: x86_64-w64-mingw32.static-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*" - name: Pack run: ./.ci/libretro-pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: libretro-windows.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} - path: ./*.zip + path: | + ./*.zip + ./*.spdx.json + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + ./*.zip + sbom-path: libretro-windows.spdx.json macos: runs-on: macos-26 strategy: @@ -137,11 +195,29 @@ jobs: strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: libretro-macos-${{ matrix.target }}.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} - path: ./*.zip + path: | + ./*.zip + ./*.spdx.json + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + ./*.zip + sbom-path: libretro-macos-${{ matrix.target }}.spdx.json + ios: runs-on: macos-26 env: @@ -161,11 +237,29 @@ jobs: strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: libretro-ios.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} - path: ./*.zip + path: | + ./*.zip + ./*.spdx.json + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + ./*.zip + sbom-path: libretro-ios.spdx.json + tvos: runs-on: macos-26 env: @@ -185,8 +279,25 @@ jobs: strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.* - name: Pack run: ./.ci/libretro-pack.sh + - name: Generate SBOM + if: ${{ github.ref_type == 'tag' }} + uses: anchore/sbom-action@v0 + with: + path: build/ + format: spdx-json + output-file: libretro-tvos.spdx.json + upload-artifact: false - name: Upload uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} - path: ./*.zip + path: | + ./*.zip + ./*.spdx.json + - name: Attest artifacts + if: ${{ github.ref_type == 'tag' }} + uses: actions/attest@v4 + with: + subject-path: | + ./*.zip + sbom-path: libretro-tvos.spdx.json diff --git a/.gitignore b/.gitignore index 3a44642e1..b234d6bc5 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ VULKAN_SDK/ # Version info files GIT-COMMIT GIT-TAG + +# verify-release.sh downloads +verify/ \ No newline at end of file diff --git a/tools/verify-release.sh b/tools/verify-release.sh new file mode 100755 index 000000000..7d3e7b040 --- /dev/null +++ b/tools/verify-release.sh @@ -0,0 +1,194 @@ +#!/usr/bin/env bash + +# Copyright Citra Emulator Project / Azahar Emulator Project +# Licensed under GPLv2 or any later version +# Refer to the license.txt file included. + +set -euo pipefail + +# Usage: +# ./verify-release.sh +# +# Example: +# ./verify-release.sh azahar-emu/azahar 2126.0 +# +# Behavior: +# - Downloads all release assets +# - Verifies asset is published in the release +# - Verifies SPDX attestations for every asset +# - Extracts SPDX SBOMs +# +# Notes: +# - Requires installation of the GitHub CLI (gh) and jq tools. +# - Draft release support requires authentication with permission +# to view the draft release. +# - gh release verify-asset currently does NOT support draft releases. + +if [[ $# -ne 2 ]]; then + echo "Usage: $0 " + exit 1 +fi + +command -v gh >/dev/null 2>&1 || { + echo "ERROR: GitHub CLI (gh) is not installed or not in PATH" + exit 1 +} + +command -v jq >/dev/null 2>&1 || { + echo "ERROR: jq is not installed or not in PATH" + exit 1 +} + +REPO="$1" +TAG="$2" + +echo "==> Fetching release metadata" + +IS_DRAFT=$( + gh release view "$TAG" \ + --repo "$REPO" \ + --json isDraft \ + --jq '.isDraft' +) + +WORKDIR="verify/release-${TAG}" +SBOMSUBDIR="sbom" + +rm -rf "$WORKDIR" +mkdir -p "$WORKDIR" +cd "$WORKDIR" +mkdir -p "$SBOMSUBDIR" + + +echo +echo "==> Downloading release assets" + +gh release download "$TAG" \ + --repo "$REPO" + +echo +echo "==> Fetching asset list" + +ASSETS=() + +while IFS= read -r asset; do + ASSETS+=("$asset") +done < <( + gh release view "$TAG" \ + --repo "$REPO" \ + --json assets \ + --jq '.assets[].name' +) + +echo +echo "==> Release type: $( + [[ "$IS_DRAFT" == "true" ]] && echo "draft" || echo "published" +)" + +echo +echo "==> Verifying assets" + +for asset in "${ASSETS[@]}"; do + # Skip attestation files themselves + if [[ "$asset" == *.intoto.jsonl ]]; then + continue + fi + + if [[ ! -f "$asset" ]]; then + echo "ERROR: Missing downloaded asset: $asset" + exit 1 + fi + + echo + echo "========================================" + echo "Asset: $asset" + echo "========================================" + + echo "1/3 Release asset verification" + + if [[ "$IS_DRAFT" != "true" ]]; then + gh release verify-asset "$TAG" "$asset" \ + --repo "$REPO" + echo + else + echo "SKIPPED (draft releases unsupported)" + echo + fi + + echo "2/3 Attestation verification" + + if [[ "$asset" == *.sha256sum ]]; then + echo "SKIPPED (sha256sum does not need verification)" + echo "SKIPPED (no SPDX SBOM extraction)" + else + gh attestation verify "$asset" \ + --repo "$REPO" \ + --predicate-type https://spdx.dev/Document + + echo + echo "3/3 SBOM extraction" + + BASE_NAME="$(basename "$asset")" + SBOM_FILE="${SBOMSUBDIR}/${BASE_NAME}.spdx.json" + + # gh attestation download does not currently support + # specifying the output file, nor it allows piping the + # output. For that reason, we need to find the .jsonl + # in the current directory. + + # Exclude any existing .jsonl files from find + # (failsafe, should not happen) + BEFORE_JSONL="$(find . -maxdepth 1 -name '*.jsonl' -print)" + + gh attestation download "$asset" \ + --repo "$REPO" \ + >/dev/null + + ATTESTATION_FILE="" + + while IFS= read -r file; do + FOUND=false + + while IFS= read -r oldfile; do + if [[ "$file" == "$oldfile" ]]; then + FOUND=true + break + fi + done <<< "$BEFORE_JSONL" + + # Only consider new jsonl files + if [[ "$FOUND" == "false" ]]; then + ATTESTATION_FILE="$file" + break + fi + done < <(find . -maxdepth 1 -name '*.jsonl' -print) + + if [[ -z "$ATTESTATION_FILE" ]]; then + echo "ERROR: Could not locate downloaded attestation jsonl" + exit 1 + fi + + # Extract and decode the SBOM from the jsonl + jq -r ' + .dsseEnvelope.payload + ' "$ATTESTATION_FILE" | + while IFS= read -r payload; do + echo "$payload" | base64 -d + done | + jq '.predicate' \ + > "$SBOM_FILE" + + rm -f "$ATTESTATION_FILE" + + echo "Saved SBOM: $SBOM_FILE" + fi + + echo + echo "OK: $asset" +done + +echo +echo "========================================" +echo "All assets verified successfully" +echo "SBOMs saved in: $WORKDIR/$SBOMSUBDIR" +echo "========================================" \ No newline at end of file